我已经阅读Jonathan Oliver关于处理乱序事件的好消息。在CQRS读取端处理乱序事件
http://blog.jonathanoliver.com/cqrs-out-of-sequence-messages-and-read-models/
,我们用的是出队的消息,并把它放在一个“支持台”,直到与前一个序列的所有消息都收到 的解决方案。当收到所有先前的消息时,我们将所有的 消息从保留表中取出,并依次通过 合适的处理程序运行。一旦所有处理程序都成功执行 ,我们将从保留表中删除消息,并提交 更新到读取模型。
这适用于我们,因为该域名发布事件并使用适当的序列号标记它们 。没有这个,下面的解决方案 会更困难 - 如果不是不可能的话。
该解决方案使用关系数据库作为持久性存储 机制,但我们没有使用存储引擎的任何关系方面。与此同时,所有这一切都有一个警告。 如果消息2,3和4到达但消息1从未做过,我们不会将它们中的任何一个应用于 。只有在处理消息1时出现错误 或者消息1以某种方式丢失时才会发生该情况。幸运的是, 很容易纠正我们的消息处理程序中的任何错误,并且 重新运行消息。或者,在丢失消息的情况下,直接从事件存储器重新构建 。
有几个问题,特别是他如何说我们总是可以向活动商店索要失踪事件。
- CQRS的写入端是否必须公开读取 端的服务以“请求”重放事件?例如,如果事件1不是收到的 ,而是2,3,4,我们是否可以通过 服务请求事件库重新发布从1开始的事件?
- 这个服务是CQRS写端的责任吗?
- 我们如何使用它重新构建读取模型?
我们使用RabbitMq的“重试”方法,它工作正常。如果经过多次重试仍然无效 - 只需将该事件置于死信队列中并重置序列号,以便可以正确处理更多事件。通常在您的应用程序中乱序事件的原因是什么? – IlliakaillI
我有一些会生成多个事件的特定命令。我还没有执行任何操作,但可能会出现乱序事件。我的活动发布者也是异步工作的。所以有可能某些事件可能无法按顺序发布。我依靠我的事件序列号来帮助我重新组合。 我会尝试重试方法。如果你可以详细说明一下,我可以将其标记为答案。 –
我在答案的评论部分添加了更详细的解释。 – IlliakaillI