编程语言
首页 > 编程语言> > c# – 在使用CQRS /事件源时,事件是否应按顺序存储,以及如何存储

c# – 在使用CQRS /事件源时,事件是否应按顺序存储,以及如何存储

作者:互联网

最近我参加了CQRS研讨会,让我想知道在使用事件采购时如何存储事件.

我认为在每个单个事件之后整个应用程序应该处于有效状态(否则重放功能是无用的).这意味着事件应该按照它们发生的顺序存储.我还认为所有聚合的事件顺序很重要.例如,用户可以制作产品和订单(产品和订单都是单独的聚合,通过ID订购参考产品).这意味着“创建产品事件”应存储在“将产品添加到事件”之前.否则,重放将导致无效状态,其中引用产品的订单在产品存在之前存在.

这种情况如何处理?您是否应始终使用同步方法将事件发送到数据库,例如通过锁定数据库?这个解决方案可扩展吗或者您应该将每个聚合的事件存储在不同的表中吗?但是你如何确保订购呢?另一种选择是存储每个事件的时间,并按此排序. PC上的定时器精度是否足够高,能够做到这一点?

解决方法:

我知道这是一个老话题,但你对此提出质疑是绝对正确的.事件存储中事件的持久性与您的问题无关.时间戳是无效的解决方案,用户在逻辑上可以执行的操作与您的问题无关.

你的问题,如果我错了,纠正我的是,一旦事件存储通过可扩展的东西发布事件(例如消息总线) – 你如何保证非规范化器以正确的顺序接收事件.消息总线通常不保证事件的排序.

答案是你不能,所以我建议的一个选项是提供事件的版本号,并且只有在最后一个已知状态的版本号与事件中的版本号匹配时才更新预计模型.如果没有,请将事件配置为在等待下一个事件时重试.

标签:c,domain-driven-design,cqrs,event-sourcing
来源: https://codeday.me/bug/20190609/1204017.html