知识卡片

分布式事务与消息中间件的取舍:优先最终一致性,避免过度使用分布式事务

普通读书笔记卡

内容

单体应用被拆分成微服务后,原来单体内部大量的方法调用变成了跨微服务的网络调用,业务调用链路中任意一个节点出问题,都可能造成数据不一致,这就带来了分布式场景下的事务一致性问题。分布式事务基于分布式事务模型能够实时、强一致地保证跨数据库或跨微服务调用场景下的数据一致性,但代价是过多的分布式事务设计会显著拖累系统性能——因为强一致性要求所有参与方在同一个事务边界内协调、锁定资源直到全部确认完成,这个协调过程本身有较高的时间和资源开销。因此微服务设计时的推荐取舍是:优先采用基于消息中间件的最终数据一致性机制,只在业务确实无法容忍任何时间窗口内数据不一致的极少数场景才使用分布式事务。消息中间件通过异步化设计把原本同步等待的数据同步操作转成异步操作,支持海量异步调用并通过削峰填谷提升吞吐能力,在DDD的领域事件驱动模型里,消息中间件正是实现领域事件数据最终一致性的关键技术组件,让微服务之间只需要”发布事件、订阅处理”而不必彼此同步等待,从而满足”高内聚,松耦合”的设计原则。

参考来源

- 位置:第2章《企业中台能力框架》"2.4 技术中台","5. 数据处理组件"(源文件:_epub-src/OEBPS/Text/chapter2-2-4.xhtml) - 结论依据:原文说明"分布式事务虽然可以实时保证数据的一致性,但过多的分布式事务设计会导致系统性能下降。因此微服务设计时应优先采用基于消息中间件的最终数据一致性机制,尽量避免使用分布式事务……消息中间件是实现领域事件数据最终一致性的非常关键的技术组件,可以实现微服务之间的解耦,满足'高内聚,松耦合'设计原则",直接支撑本卡片结论。 - 原始内容:分布式事务虽然可以实时保证数据的一致性,但过多的分布式事务设计会导致系统性能下降。因此微服务设计时应优先采用基于消息中间件的最终数据一致性机制,尽量避免使用分布式事务。