我读了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,我们是否可以通过服务向事件存储库请求重新发布事件,从1开始?
- 这项服务是CQRS架构中的写入端责任吗?
- 我们如何使用它重新构建读模型?