CQRS:存储事件并发布它们 - 我该如何安全地做到这一点?

27

如我在为什么CQRS存储库发布事件而非事件存储?中所学,CQRS存储库的任务是发布事件。到目前为止还不错。

当然,存储事件和发布事件应该在一个单一的事务内完成。从技术上讲,这意味着向存储库写入一个或多个记录,并向消息总线发布一个或多个事件。因此,简单的数据库事务是不够的,需要进行分布式事务。

现在,不幸的是,许多NoSQL数据库(如MongoDB)不支持ACID兼容的事务,更不用说参与分布式事务了。此外,还有一些消息队列也不支持分布式事务。

那么问题来了:我该怎么办?

有没有推荐的模式可以使用?

1个回答

22

你的代码库可以发布事件,但不一定非要这样做。在这种情况下的解决方案是将事件存储用作队列。您需要一个后台进程来监视事件存储中是否有新事件,将它们发布到(例如)总线上,然后将其标记为已分派。

像往常一样,存在权衡取舍。您可能需要处理至少一次传递消息和幂等处理。与使用简单的分布式事务相比,它更加复杂。

Jonathan Oliver撰写了几篇关于此主题的文章,可能会对您有所帮助:Removing 2PCHow I Avoid Two-Phase CommitIdempotency Patterns


2
谢谢您,这非常有帮助。关于事件存储的监控 - 如果不使用轮询,如何实现?是否有更响应的机制可以在不引入两阶段提交的情况下进行此操作? - CraigM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接