CQRS,ES:如何知道我们是否必须在读取端 reorder/ignore 事件?

CQRS,ES: How to know if we have to reorder/ignore events on read side?

我和我的团队目前在 CQRS 和事件溯源系统的读取端工作。 我们希望我们的投影仪能够只监听所有事件的一个子集,并且我们希望我们的投影仪是幂等的,因为一个事件可以被多次发布。 这是我们当前的架构:

由于放映员不处理所有事件,它如何知道事件是否未按正确顺序接收或事件是否已接收?我们不能使用序列号,因为序列号与流相关,而不是事件类型。

术语 "projectionist"、"projection ledger" 和 "projector" 来自 this article

How to know if we have to reorder/ignore events on read side?

"Bus" 不是事件顺序的权威 - 责任在于事件存储。因此,需要知道事情发生的顺序的放映员应该查询商店,而不是试图从总线上的信息重建原始顺序。

Greg Young 2014 年的演讲 Polyglot Data 对这一点进行了很好的讨论。

(放映员可能会通过一些 API 查询事件存储,而不是直接与存储交谈 - 基于存储中数据的精选原子提要)。

正如@VoiceOfUnreason 所提议的那样,由于我们的事件存储在 CosmosDB 中,我们通过放弃总线并将其替换为 CosmosDB 的更改馈送处理器来解决问题。到目前为止,我们对这个解决方案没有任何问题。更改源处理器能够管理检查点并将事件广播到开箱即用的每台投影仪!