/1 分钟/7 阅读/0 评论
基于消息队列解决异步调用的分布式事务问题
经典的转账问题: 支付宝事务: 1. 数据库中mayun扣100元; 2. 将(给余额宝mayun加100元)封装成消息发给消息队列; 操作数据库和操作消息队列,如何保证一致性? 支付宝事务: 1. 数据库中mayun扣100元; 2. 事
业务场景
经典的转账问题:
支付宝事务:
- 数据库中mayun扣100元;
- 将(给余额宝mayun加100元)封装成消息发给消息队列;
一致性
操作数据库和操作消息队列,如何保证一致性?
支付宝事务:
- 数据库中mayun扣100元;
- 事件记录表插入一条记录;
本地数据库事务保证一致性,另起定时任务扫表发送消息队列。
幂等性
定时任务:
- 扫描事务记录表,查询状态为
unfinished的事件; - 封装成消息发给消息队列;
- 将事件状态改为
finished;
什么情况下会导致事件重复发送?是解决重复发送,还是重复消费?
总结
如何利用消息队列解决分布式事务:
生产者:
事务开始
- 数据库中mayun扣100元;
- 事件记录表插入一条记录;
事务结束
另起一个定时程序,定时扫描事件记录表,发送消息
消费者:
事务开始
- 消费记录表插入一条记录;
- 数据库中mayun加100元;
事务结束
思考
- 消费记录表插入失败怎么办?
- 生产者多了一个业务无关的定时任务,增加运维成本,有没有可能把它交给中间件去做?(https://rocketmq.apache.org/docs/4.x/producer/06message5/)