MassTransit - 发送和发布:介于两者之间
MassTransit - Send & Publish : in between
我了解发送(调用了约 1 个消费者)和发布(调用了所有消费者)之间的区别。在我的环境中,我希望介于两者之间。
例如:
包裹已准备就绪,可以发货了。可以发送事件 "ParcelPrepared"。在此事件中,应触发 2 个操作:"Build Invoice" 和 "Send Email"。但是每个动作应该只调用一次。
实际上我只设法通过发送来做到这一点,并且这两个操作都托管在同一个 .net 进程中(但我不希望那样)。如果每个操作都托管在不同的进程上,则只会触发其中一个。
如果我使用 Publish,将调用所有流程,我可以发送 N 封电子邮件或生成 N 份发票,我会丢失如果进程已关闭,则显示消息。
我是不是漏掉了什么?
编辑:
这是我想要实现的架构。
许多进程 "Parcel Preparation" 可以发出消息(command/event 我不知道)"Parcel Prepared".
不同的消费者("Invoicing" 和 "Email Sender")希望在发出消息时得到通知。每个消费者都被多次实例化。应仅通知每个消费者中的一个,以避免处理每个消费者的并发。
每个消费者如果由于某种原因宕机,应该能够收到错过的消息,即使只有一部分消费者宕机("Invoicing" up 和 "Email Sender" down,两者都宕机)。
您的 ParcelPrepared
是一个事件,应该 发布 。然后,您可以在这些不同的进程中有两个消费者,它们将 发送 命令 BuildInvoice
和 SendEmail
。这些命令的消费者将完成工作。
您永远不会丢失消息,因为它们被放置在端点队列中,并且会留在那里直到被使用。
我了解发送(调用了约 1 个消费者)和发布(调用了所有消费者)之间的区别。在我的环境中,我希望介于两者之间。
例如:
包裹已准备就绪,可以发货了。可以发送事件 "ParcelPrepared"。在此事件中,应触发 2 个操作:"Build Invoice" 和 "Send Email"。但是每个动作应该只调用一次。
实际上我只设法通过发送来做到这一点,并且这两个操作都托管在同一个 .net 进程中(但我不希望那样)。如果每个操作都托管在不同的进程上,则只会触发其中一个。
如果我使用 Publish,将调用所有流程,我可以发送 N 封电子邮件或生成 N 份发票,我会丢失如果进程已关闭,则显示消息。
我是不是漏掉了什么?
编辑:
这是我想要实现的架构。
许多进程 "Parcel Preparation" 可以发出消息(command/event 我不知道)"Parcel Prepared".
不同的消费者("Invoicing" 和 "Email Sender")希望在发出消息时得到通知。每个消费者都被多次实例化。应仅通知每个消费者中的一个,以避免处理每个消费者的并发。
每个消费者如果由于某种原因宕机,应该能够收到错过的消息,即使只有一部分消费者宕机("Invoicing" up 和 "Email Sender" down,两者都宕机)。
您的 ParcelPrepared
是一个事件,应该 发布 。然后,您可以在这些不同的进程中有两个消费者,它们将 发送 命令 BuildInvoice
和 SendEmail
。这些命令的消费者将完成工作。
您永远不会丢失消息,因为它们被放置在端点队列中,并且会留在那里直到被使用。