【发布时间】:2012-06-13 13:34:02
【问题描述】:
示例:业务规则规定客户在下订单后应收到确认消息(电子邮件或类似信息)。
假设NewOrderRegisteredEvent 从域中分派,并由发送确认消息的事件侦听器拾取。完成后,其他一些事件处理程序会抛出异常或出现其他问题,并且工作单元会回滚。我们现在已经向用户发送了一条回滚的确认消息。
解决此类问题的“cqrs”方法是什么?在提交了一个工作单元后您想要做某事?另一个复杂的因素是重播事件。每当我重播记录的事件以构建新的视图/投影时,我不希望重新发送旧的确认消息。
迄今为止我最好的理论:我刚刚开始研究 cqrs 的迷人世界,想知道这是否会作为传奇来实现?如果 saga 就像一个状态机,每个转换只能发生一次,那么我想这会解决这个问题吗?我只是很难想象这将如何与命令总线和域事件结合在一起。..
【问题讨论】:
-
使“发送电子邮件”任务成为消息。如果 uow 回滚,则消息的分派(到持久存储)也会回滚。其他东西会接收消息并处理电子邮件。顺便说一句,与 cqrs 无关。普通的分布式计算常识。
-
至于事件回放,绝不会引发这种行为。如果你的暗示。确实,你做错了。
-
这是有道理的,但我在 cqrs 上下文中对此感兴趣。什么是“消息”?谁/什么会在什么时候拿起它?最好利用事件存储来避免引入另一种存储机制来跟踪传出通信。
-
您的 eventstore 就是您的队列。然而,实际发送电子邮件的代码需要通过基于拉取或推送的机制/技术来通知。
-
@YvesReynhout:这实际上是我几天前才意识到的。我喜欢的是它可以摆脱事件存储和事件消费者之间的任何消息总线。这确实使每个消费者负责跟踪它已处理的内容,但这是摆脱消息总线的一小笔代价!