multi-tenant - MassTransit - 发送和发布:介于两者之间
问题描述
我已经了解发送(约 1 个消费者调用)和发布(所有消费者调用)之间的区别。在我的环境中,我想要介于两者之间的东西。
举个例子 :
包裹已准备好并准备发货。可以发送事件“ParcelPrepared”。在此事件中,应触发 2 个操作:“构建发票”和“发送电子邮件”。但是每个动作应该只调用一次。
实际上,我只能通过 Send 来做到这一点,并且这两个操作都托管在同一个 .net 进程中(但我不希望这样)。如果每个动作都托管在不同的进程上,则只会触发其中一个。
如果我使用 Publish,将调用所有流程,我可以发送N封电子邮件或创建N个发票,如果流程关闭,我将丢失消息。
我错过了什么吗?
编辑:
这是我想要实现的架构。
许多进程“包裹准备”可以发出消息(我不知道的命令/事件)“包裹准备”。
不同的消费者(“Invoicing”和“Email Sender”)希望在消息发出时得到通知。每个消费者被实例化多次。应该只通知每个消费者中的一个,以避免在每个消费者上处理并发。
每个消费者如果由于某种原因宕机,应该能够接收丢失的消息,即使只有部分消费者宕机(“发票”向上和“电子邮件发件人”宕机,两者都关闭)。
解决方案
你ParcelPrepared
是一个事件,它应该被发布。然后,您可以在这些不同的进程中有两个消费者,它们将发送命令BuildInvoice
和SendEmail
. 这些命令的使用者将完成这项工作。
您永远不会丢失消息,因为它们被放置到端点队列中并且会一直留在那里直到被使用。
推荐阅读
- jquery-ui-datepicker - jQuery UI-Datepicker 禁用所有星期日,除了 1 个特定的星期日
- pandas - 复杂数据集的下采样问题
- reactjs - 如何仅在模态加载时获取数据
- android - Kotlin-Android studio 3.6.1 Gradle 5.6.4 无法确定任务':app:compileDebugUnitTestJavaWithJavac'的依赖关系
- python - Keras 中的损失在模型之间存在数量级差异意味着什么?
- bash - 你如何在 Bash 中附加将一个数字序列添加到文件中需要多长时间?
- perl - 检查参数是否已格式化为日期
- angularjs - 特定浏览器中的 HTML 表单发布重定向错误
- google-chrome-devtools - Chrome 开发工具 - 地理位置覆盖不起作用
- java - 如何使我的字符串生成器标签 ID、名称、地址加粗