文章目录
- 什么是分布式系统
- 为什么会出现分布式事务
- 分布式事务的一些常用解决方案
- 通过一个电商场景聊聊RebbitMQ解决分布式事务。
什么是分布式系统
简单来说,就是一个用户请求需要多个系统协同完成。
为什么会出现分布式事务
因为两个业务系统直接操作的是两个不同的数据库,用的是两个不同的connection连接对象。无法像传统单体项目一样通过普通的数据库事务特性(acid)保证数据库数据的一致性。
分布式事务的一些常用解决方案
- 基于数据库XA/JTA协议方式; (需要数据库厂商支持;Java组件有 atomikos);
- 异步数据校对方式;(支付宝/微信支付主动查询支付状态,对账单的形式);
- 基于可靠消息(MQ)的解决方案; (异步场景,通用性强,扩展性高);
- TCC编程式解决方案;(听说像阿里这些牛逼的公司都自己封装DTX)。
通过一个电商场景聊聊RebbitMQ解决分布式事务。
先来看看不做分布式处理的情况:
这种情况下可能遇到的问题:
1、当库存系统响应较慢,或者极端些库存系统挂了,会导致用户的订单信息和库存信息不一致的情况。
2、订单系统没有成功生成订单(订单数据库相应超时),但是库存系统却更新了库存。两数据库的信息又不一致了(很坑爹)。接下来再看看加了RabbitMQ做柔性事务管理的分布式方案:
这样虽然没有办法保证两数据库之间的实时一致性,但却保证了数据的最终一致性。
** 细节: **
- 消息一定要发送到MQ(可靠消息生产)
- 消息发布确认机制(publisher-confirms:true)
消息发布确认+本地消息表 保证数据一定发送成功
- 消费者被消费掉(可靠的消息消费)
- 消费确认机制