Roy*_* T. 6 c# domain-driven-design cqrs event-sourcing
最近我关注了一个 CQRS 研讨会,这让我想知道在使用事件溯源时事件是如何存储的。
我认为在每个事件之后,整个应用程序都应该处于有效状态(否则重放功能将毫无用处)。这意味着事件应该完全按照它们发生的顺序存储。我也相信所有聚合的事件顺序很重要。例如,用户可以制作产品和订单(产品和订单都是单独的聚合,订单通过 ID 引用产品)。这意味着“创建产品事件”应该在“将产品添加到事件”之前存储。否则,重放可能会导致无效状态,其中引用产品的订单存在于产品存在之前。
这种情况如何处理?您是否应该始终使用同步方法将事件发送到数据库,例如通过锁定数据库?该解决方案是否可扩展?还是应该将每个聚合的事件存储在不同的表中?但是,您如何确保订购呢?另一种选择是存储每个事件的时间,并以此排序。PC 上计时器的精度是否足以做到这一点?
我知道这是一个旧线程,但是您对此提出质疑是绝对正确的。事件存储中事件的持久性与您的问题无关。时间戳是一种无效的解决方案,用户在逻辑上可以做什么与您的问题无关。
你的问题,如果我错了,请纠正我,一旦事件存储通过可扩展的东西(例如消息总线)发布事件 - 你如何保证非规范化器以正确的顺序接收事件。消息总线通常不保证事件的顺序。
答案是你不能,所以我建议的一种选择是提供事件的版本号,并且只有在最后一个已知状态的版本号与事件中的版本号匹配时才更新投影模型。如果没有,请将事件配置为在等待队列中的下一个事件时重试。