CQRS:存储事件并发布它们 - 如何以安全的方式执行此操作?

Gol*_*den 25 transactions cqrs event-sourcing event-store

正如我已经了解到为什么CQRS存储库发布事件而不是事件存储?这是CQRS存储库发布事件的任务.到现在为止还挺好.

当然,存储事件并发布它们应该在一个单一的事务中.从技术上讲,这意味着将一个(或多个)记录写入商店,并将一个(或多个)事件发布到消息总线.因此,简单的数据库事务是不够的,它应该是分布式的.

现在,不幸的是,许多NoSQL数据库(例如MongoDB)不支持符合ACID的事务,甚至没有谈论在分布式事务中发生的可能性.此外,还有一些消息队列也不支持分布式事务.

所以问题是:我该如何处理?

是否有推荐使用的模式?

Mar*_*oek 22

您的存储库可以发布事件,但不必.在这种情况下,解决方案是将事件存储用作队列.您将有一个后台进程监视事件存储区中的新事件,将它们发布到(例如)总线,然后将它们标记为已分派.

一如既往,需要权衡利弊.您可能不得不处理至少一次的消息传递和幂等处理.它比使用简单的分布式事务更复杂.

Jonathan Oliver撰写了几篇关于这个主题的帖子,可能会帮助你:删除2PC,我如何避免两阶段提交,幂等模式

  • 谢谢您的帮助-非常有用。关于事件存储的监视-如果不进行轮询,如何做到这一点?在不引入2PC的情况下,是否有更快速的响应机制来执行此操作? (2认同)