我已经理解了发送(~1个消费者呼叫)和发布(所有消费者呼叫)之间的区别。在我的环境中,我想要介于两者之间。
例如:
准备好包裹并随时发货。事件可以发送“ParcelPrepared”。在此事件中,应触发2个操作:“构建发票”和“发送电子邮件”。但每个动作只应调用一次。
实际上我只是设法使用Send执行此操作,并且两个操作都托管在相同的.net进程中(但我不希望这样)。如果每个操作都托管在不同的进程上,则只会触发其中一个。
如果我使用Publish,将调用所有进程,我可以发送N封电子邮件或构建N个发票,如果进程关闭,我将丢失消息。
我错过了什么吗?
编辑:
这是我想要实现的模式。
许多过程“包裹准备”可以发出消息(我不知道的命令/事件)“包裹准备”。
不同的消费者(“发票”和“电子邮件发件人”)希望在发出消息时得到通知。每个消费者都多次实例化。应该通知每个消费者中的一个,以避免处理每个消费者的并发性。
即使只有部分消费者关闭(“开票”和“电子邮件发件人”关闭,两者都关闭),每个消费者都应该能够收到错过的消息。
你的ParcelPrepared
是一个事件,它应该发布。然后,您可以在这些不同的进程中拥有两个使用者,即发送命令BuildInvoice
和SendEmail
。这些命令的消费者将完成这项工作。
您永远不会丢失消息,因为它们被放置到端点队列并将一直保留到消耗状态。