【发布时间】:2019-03-05 06:05:10
【问题描述】:
我了解事务一致性和最终一致性之间的区别。假设我正在开发一个应用程序,其中有三个微服务,并且有一个消息总线,当引发集成事件时,它会在它们之间发送消息,这意味着最终的一致性。例如,微服务 B 发布了一个集成事件,微服务 A 在两小时后处理它,因为微服务 B 在事件发布时已关闭并且消息是持久的 - 这很好。
我的理解方式;微服务内部应该有事务一致性 - 聚合 A 可能会发布聚合 B 感兴趣的域事件,因此会引发域事件并且对数据库的任何更新都在同一事务中执行。
我不明白 CQRS 如何适应这种事务一致性/最终一致性场景,因为:
- 我无法使用事务一致性,因为读取模型 (NoSQL) 和写入模型 (SQL 服务器) 无法在同一事务中更新。
- 我无法使用消息总线,因为更新读取模型不是集成事件,即读取模型和写入模型包含在同一个微服务中。
对于 CQRS,我相信有两种选择:
- 如果将事件存储用于写入端,那么读取端可以轮询它 - 这解决了问题,因为没有事件。
- 如果将事件日志/关系数据库用于写入端,则会引发域事件以更新读取端。
如果选择了选项二,那么我如何保证读取模型最终会与写入模型同步?例如,当事件引发时,读取模型可能会关闭。
【问题讨论】:
标签: c# domain-driven-design microservices