【发布时间】:2020-10-27 20:15:57
【问题描述】:
几天以来,我一直在尝试弄清楚如何通知其他微服务,在微服务 A 中创建了一个新实体,该微服务 A 将该实体存储在 MongoDB 中。
我想:
微服务之间的耦合度低
避免微服务之间的分布式事务,如两阶段提交 (2PC)
起初,像 RabbitMQ 这样的消息代理似乎是完成这项工作的好工具,但后来我发现 commit MongoDB 中的新文档和 publish 消息的问题在代理中不是原子的。
Why event sourcing? by eventuate.io:
解决此问题的一种方法是通过添加一个标记来说明文档是否已在代理中发布并具有计划的后台进程来搜索 MongoDB 中未发布的文档并将其发布到使用confirmations 的代理,当确认到达时,文档将被标记为已发布(使用至少一次和幂等语义)。此解决方案在this 和this 答案中提出。
阅读 Chris Richardson 的 Introduction to Microservices,我最终看到了 Developing functional domain models with event sourcing 的精彩演示文稿,其中一张幻灯片问道:
如何原子地更新数据库和发布事件和发布事件没有2PC? (双写问题)。
答案很简单(在下一张幻灯片上)
更新数据库和发布事件
这是基于CQRS a la Greg Young 的this one 的不同方法。
域存储库负责发布事件,这 通常会与存储一起在单个事务中 事件存储中的事件。
我认为将存储和发布事件的责任委托给事件存储是一件好事,因为它避免了 2PC 或后台进程的需要。
然而,在某种意义上,这是真的that:
如果您依赖事件存储来发布事件,您将拥有一个 与存储机制紧密耦合。
但如果我们采用消息代理来实现微服务之间的通信,我们也可以这么说。
让我更担心的是事件存储似乎变成了单点故障。
如果我们从eventuate.io 看这个example
我们可以看到,如果事件存储发生故障,我们将无法创建帐户或汇款,从而失去了微服务的优势之一。 (尽管系统会继续响应查询)。
那么,确认最终示例中使用的事件存储是单点故障是正确的吗?
【问题讨论】:
-
你最终得到了什么?您可以使用 DTC 来处理交易吗?至于Event Store的单点故障端;我会考虑复制机制..
-
@gabrielgiussi:如果您想出了解决方案,请告诉我。谢谢
标签: microservices cqrs event-sourcing eventstoredb