一 序
听了下奈学教育孙玄大佬的课。视频讲了3个小时,要是缩减到到1小时就好多了。
记一下笔记:
二 目录
2.1分布式事务的本质
1 一次请求涉及多个存储系统
如:多个db,或者db+redis,db+mq,db+es
2. 业务场景容忍度:商品+订单+支付
业务场景:同步场景、异步场景
2.2 普适方法论
1. 拆分
2. 补偿:前向补偿(retry),后向补偿:
这里介绍了Redis多个操作执行事务:
可以使用lua脚本,也可以使用redisson的加锁。本质就是把多个原子操作整合为一个本地事务。
场景三: db和MQ
场景四: db和ES:es不提供本地事务,这种智能最大努力型的retry,失败后打error日志人工介入。
3 异步场景
超时未支付:关闭
1. 下单
2. 发mq:
本地事务:可能存在,mq的发送超时,发型成功但是ack失败了。这时候两个合成一个本地事务就有问题。
时序调整,也不能解决。
2PC:没有补偿,协商后只能重试
因为ack不可靠,所以需要依赖提供db的回查接口确认写db是否成功。这个mq是支持事务的mq.
上面的方案太复杂,不够通用,优化方案如下:
这是偏理论的。因为ack可能超时、消息可能不幂等、可能重复提交。
这是一个完整的处理,依赖了定时任务task去处理:
正常的是投递的task,发送失败的加入:重试队列(时间轮)。
因为是内存队列,还有系统重启的时候:加了补漏线程(从db直接查),这个单线程处理就行,不需要每个节点都去跑,所以需要加锁标识做。
还有清理线程:处理历史数据。
****************
可以根据自己业务情况做裁剪,不用这么复杂。