首页 > 解决方案 > MassTransit - 发送和发布:介于两者之间

问题描述

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

举个例子 :

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

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

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

我错过了什么吗?

编辑:

这是我想要实现的架构。

客观的

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

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

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

标签: multi-tenantmasstransit

解决方案


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

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


推荐阅读