【问题标题】:MassTransit - Send & Publish : in betweenMassTransit - 发送和发布:介于两者之间
【发布时间】:2018-09-06 17:13:10
【问题描述】:

我已经了解发送(约 1 个消费者调用)和发布(所有消费者调用)之间的区别。在我的环境中,我想要介于两者之间的东西。

例如:

一个包裹已准备好并准备发货。可以发送事件“ParcelPrepared”。在此事件中,应触发 2 个操作:“构建发票”和“发送电子邮件”。但是每个动作只能调用一次。

实际上,我只能通过发送来做到这一点,并且这两个操作都托管在同一个 .net 进程中(但我不希望这样)。如果每个动作都托管在不同的进程上,则只会触发其中一个。

如果我使用 Publish,将调用所有流程,我可以发送 N 封电子邮件或创建 N 份发票,如果流程停止,我将丢失消息。

我错过了什么吗?

编辑:

这是我想要实现的架构。

许多“包裹准备”进程可以发出消息(我不知道的命令/事件)“包裹准备”。

不同的消费者(“发票”和“电子邮件发件人”)希望在消息发出时得到通知。每个消费者被实例化多次。应该只通知每个消费者中的一个,以避免在每个消费者上处理并发。

每个消费者如果由于某种原因宕机,应该能够接收丢失的消息,即使只有部分消费者宕机(“发票”向上和“电子邮件发件人”宕机,两者都关闭)。

【问题讨论】:

    标签: multi-tenant masstransit


    【解决方案1】:

    您的ParcelPrepared 是一个事件,应该发布。然后,您可以在这些不同的进程中有两个消费者,它们将发送命令BuildInvoiceSendEmail。这些命令的使用者将完成这项工作。

    您永远不会丢失消息,因为它们被放置到端点队列中并且会一直留在那里直到被消费。

    【讨论】:

    • 感谢@alexey-zimarev。
    • 但是有几个问题可以很好地理解它: - 如果事件消费者关闭了怎么办,因为事件队列不持久,事件将丢失并且在它们备份时不会被处理 - 如果我我有每个进程的多个实例,它会发送命令的副本,不是吗?
    • 事件队列应该是持久的。这些队列对接收端点定义的消息类型的订阅也是如此。
    • 如果已编辑我的问题以包含更明确的架构。根据我的阅读和理解,对于发布,每个进程都会创建一个附加到公共交换的自动删除队列。
    • @AlexeyZimarev 您对如何使用 MassTransit 做到这一点有任何想法或模式吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2020-06-23
    • 2018-02-14
    相关资源
    最近更新 更多