Events 无事件源的CQR:处理事件日志失败
由于在我的CQRS应用程序中不使用事件源,我引入了一个简单的事件日志,它使我能够更新读取存储 这意味着对我的应用程序的状态更改包括两个操作:Events 无事件源的CQR:处理事件日志失败,events,domain-driven-design,microservices,cqrs,distributed-system,Events,Domain Driven Design,Microservices,Cqrs,Distributed System,由于在我的CQRS应用程序中不使用事件源,我引入了一个简单的事件日志,它使我能够更新读取存储 这意味着对我的应用程序的状态更改包括两个操作: 更新写入模型状态,例如SQL INSERT 将事件插入事件日志 两个写操作必须作为一个原子操作进行。不幸的是,事件日志驻留在另一个数据库中,因此我必须考虑分布式事务 大多数CQR样本都处理saga模式,它们似乎都利用了事件源,这使得事情变得更简单 我的问题是“半成品”状态更改,例如 SQL插入成功 事件日志插入失败 我可以想出一个补偿SQL操作(伪
- 更新写入模型状态,例如SQL INSERT
- 将事件插入事件日志
- SQL插入成功
- 事件日志插入失败
- 每个事件都有一个序列号
- 如果读取端复制检测到未处理的事件(例如,接收到40,然后是42),它将查询事件日志中的事件41
- 如果事件41不可用,系统将停止复制任何事件,直到有人仔细查看
所以是的-您可以重试。您的系统分布情况如何?您希望它具有多大的弹性/可扩展性?它每月应该能够处理大约1000万或2000万个事件。它应该能够使用多个节点处理总线系统连接的命令和/或事件。因此,事件复制可以在多个节点上进行。我非常喜欢本地事件日志的想法,这足以满足我的要求。非常感谢。
SQLTransaction.Commit(); // if this fails, all is fine. Nothing to revert
try
{
EventLog.Insert(event);
}
catch(Exception ex)
{
// Try to undo the SQL stuff.
CompensatingSQLTransaction().Commit();
// uh-oh! The commit fails!!
// What now? Do a Retry?
}