【发布时间】:2017-04-03 20:31:23
【问题描述】:
我读过 Jonathan Oliver 写的这篇关于处理乱序事件的好文章。
http://blog.jonathanoliver.com/cqrs-out-of-sequence-messages-and-read-models/
我们使用的解决方案是将消息出列并将其放置在“保留表”中,直到具有先前序列的所有消息都被 已收到。收到所有先前的消息后,我们将全部 消息从保持表中取出,并按顺序通过 适当的处理程序。一旦所有处理程序都已执行 成功,我们从保留表中删除消息并提交 读取模型的更新。
这对我们有用,因为域发布事件并标记它们 具有适当的序列号。没有这个,解决方案 下面会更加困难——如果不是不可能的话。
此解决方案使用关系数据库作为持久性存储 机制,但我们没有使用 存储引擎。同时,所有这一切都有一个警告。 如果消息 2、3 和 4 到达但消息 1 从未到达,我们不申请 任何一位。只有在出现错误时才会发生这种情况 处理消息 1 或消息 1 以某种方式丢失。幸运的是, 纠正我们的消息处理程序中的任何错误很容易,并且 重新运行消息。或者,在丢失消息的情况下,重新构建 直接从事件存储中读取模型。
有几个问题,特别是关于他说我们如何始终向事件存储询问丢失的事件。
- CQRS 的写入端是否必须为读取公开服务 “要求”重播事件?例如,如果事件 1 不是 收到了,但是 2、4、3 有,我们可以通过 a 询问 eventstore 从 1 开始重新发布事件的服务?
- 此服务是否由 CQRS 的写入方负责?
- 我们如何使用它重新构建读取模型?
【问题讨论】:
-
我们在 RabbitMq 中使用了“重试”方法,效果很好。如果在多次重试后它仍然不起作用 - 您只需将此事件放入死信队列并重置序列号,以便可以正确处理进一步的事件。您的应用程序中出现乱序事件的原因通常是什么?
-
我有一些特定的命令会生成多个事件。我还没有实现任何东西,但可能会发生各种乱序事件。我的事件发布者也是异步工作的。因此,某些事件也可能不会按顺序发布。我依靠我的事件序列号来帮助我把它重新组合起来。我将尝试重试方法。如果您能详细说明一下,我可以将其标记为答案。
-
我在答案的 cmets 部分添加了更详细的说明。
标签: cqrs event-sourcing