Events 如果没有人需要传输级别上的可靠消息传递,那么如何在业务级别上实现可靠的PubSub?
这个问题主要是出于好奇。我不久前读到这篇文章,并同意应尽可能在业务级别应用可靠的消息传递 现在,问题是,他以点对点的方式清楚地解释了他的方法。但是,我不知道如何在发布/订阅情况下在业务级别实现可靠的消息传递 我将尝试通过显示命令(点对点)和事件(发布/订阅)来演示两者的区别。请注意,这些示例是高度简化的Events 如果没有人需要传输级别上的可靠消息传递,那么如何在业务级别上实现可靠的PubSub?,events,architecture,domain-driven-design,publish-subscribe,Events,Architecture,Domain Driven Design,Publish Subscribe,这个问题主要是出于好奇。我不久前读到这篇文章,并同意应尽可能在业务级别应用可靠的消息传递 现在,问题是,他以点对点的方式清楚地解释了他的方法。但是,我不知道如何在发布/订阅情况下在业务级别实现可靠的消息传递 我将尝试通过显示命令(点对点)和事件(发布/订阅)来演示两者的区别。请注意,这些示例是高度简化的 命令:转账(uniqueId、金额、sourceAccount、recipientAccount) 如果账户持有人发送此转账,他可以等待确认moneytransfered(假设此事件将在tra
命令:转账(uniqueId、金额、sourceAccount、recipientAccount) 如果账户持有人发送此转账,他可以等待确认
moneytransfered
(假设此事件将在transfer
命令中包含对uniqueId
的引用)
如果账户持有人在给定的超时时间内没有收到转账
,他可以再次发送相同的命令。(当然,假设命令处理器是幂等的)
因此,我看到了可靠的消息传递是如何以点对点的方式在业务级别工作的
现在,假设我们前面的命令成功并生成了一个
MoneyTransfer
事件。在系统的某个地方,我们有一个事件处理器(MoneyTransferMailNotifier
),它处理MoneyTransfered
事件,并向转账接收者发送电子邮件通知
此MoneyTransferMailNotifier
订阅了MoneyTransfered
事件。但请注意,发送MoneyTransfered
事件的系统并不真正关心此事件的侦听器是谁或有多少。这里的关键是解耦。我提出了一个事件,不关心是否有零个或20个侦听器我不订阅这个活动
此时,如果基础设施没有提供可靠的消息传递(至少一次传递),我们如何防止
MoneyTransfer
事件的丢失?我确实希望收件人收到他的电子邮件通知。
我看不出任何真正的“业务级”解决方案将如何解决这一问题
(1)我能想到的解决方案之一是明确订阅“业务级别”的事件,从而绕过任何基础架构组件。但我们现在不是在业务中引入基础架构吗
(2)另一个“解决方案”是引入一个流程管理器,它可以执行以下操作:
传输
命令传输
命令转发给账户子系统sendmailnotification(收件人)
这似乎是DDD规定的解决方案,对吗?但这不会引入更多的耦合吗 你觉得怎么样 编辑2016-04-16 可能根本问题有点过于简单:如果您没有一个基础设施组件来确保至少或准确地交付一次,您如何确保(当您处于最多一次的基础设施中时)您发出的事件将被接收? 并非所有事件都需要交付,但有许多是关键的(例如发送确认电子邮件的示例) 如果在传输级别上没有人需要可靠的消息传递,那么如何在业务级别上实现可靠的
PubSub
原始文章没有说明“没有人需要传输级别上的可靠消息传递”,而是说明应该在业务级别强制执行消息排序,因为在某些情况下,如果这种排序是业务的一个重要特征
在任何情况下,PubSub
都是在基础架构级别,你不能说你在业务级别实现了PubSub
,这是没有意义的
但是,您如何才能确保在业务级别只交付一次呢?通过使用Saga/Process manager
。他们的重要职责之一就是这样。您可以将其与幂等聚合
相结合。此外,您还可以识别强调从通用语言中排序的术语,如取消>事务阶段
,并将它们包括在域模型中(例如作为事件的属性)
如果您没有确保至少
或者一次交付,您如何确保(当您处于
您的事件最多只会发出一次
收到?
如果您没有至少一次,那么您可以使用它启动钻孔过程的第一个事件
在您的情况下,由于电子邮件的发送是一个重要的业务方面,我会将其作为流程中的一个步骤
此MoneyTransferMailNotifier已订阅MoneyTransfered事件。但请注意,发送MoneyTransfered事件的系统并不真正关心此事件的侦听器是谁或有多少。这里的关键是解耦。我提出一个事件,不关心是否有零个或20个侦听器订阅此事件
我相信,你的困惑就在这里——只有发布-订阅中间件才能将事件交付到它们需要的地方
格雷格·杨在他关于这个问题的演讲中谈到了这一点
总结:pub/sub中间件是个障碍。基于pull的模型,消费者从持久事件存储中检索数据,为您提供了从存储中检索消息的可靠方法。因此,您从存储中提取数据,然后像以前一样使用业务级数据来识别以前的工作
为了