跳到正文
Kale的数字花园
目录 文章
/1 分钟/8 阅读/0 评论

基于消息队列解决异步调用的分布式事务问题

经典的转账问题: 支付宝事务: 1. 数据库中mayun扣100元; 2. 将(给余额宝mayun加100元)封装成消息发给消息队列; 操作数据库和操作消息队列,如何保证一致性? 支付宝事务: 1. 数据库中mayun扣100元; 2. 事

业务场景

经典的转账问题:

支付宝事务:

  1. 数据库中mayun扣100元;
  2. 将(给余额宝mayun加100元)封装成消息发给消息队列;

一致性

操作数据库和操作消息队列,如何保证一致性?

支付宝事务:

  1. 数据库中mayun扣100元;
  2. 事件记录表插入一条记录;

本地数据库事务保证一致性,另起定时任务扫表发送消息队列。

幂等性

定时任务:

  1. 扫描事务记录表,查询状态为 unfinished 的事件;
  2. 封装成消息发给消息队列;
  3. 将事件状态改为 finished;

什么情况下会导致事件重复发送?是解决重复发送,还是重复消费?

总结

如何利用消息队列解决分布式事务:

生产者:

事务开始

  1. 数据库中mayun扣100元;
  2. 事件记录表插入一条记录;
    事务结束

另起一个定时程序,定时扫描事件记录表,发送消息

消费者:

事务开始

  1. 消费记录表插入一条记录;
  2. 数据库中mayun加100元;
    事务结束

思考

相关阅读

2 分钟

在项目中集成 Seata(AT模式)

首先,更新 到 版本: 引入 Seata 相关的依赖定义: 修改 加入 Seata 相关的配置: 只需要用普通的 标签来声明: 业务端(通常是微服务)的数据库中需要创建一个 表: 需要用 Seata 提供的 标签声明一次分布式事务的开始:

面试#分布式事务8 阅读 · 0 评论

评论需要登录。生产环境使用 GitHub 登录,本地可前往 登录页 使用开发登录。

还没有评论,来抢沙发。