彻底解密企业级分布式事务设计与实践-学习笔记

一 序

  听了下奈学教育孙玄大佬的课。视频讲了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直接查),这个单线程处理就行,不需要每个节点都去跑,所以需要加锁标识做。

还有清理线程:处理历史数据。

****************

可以根据自己业务情况做裁剪,不用这么复杂。

猜你喜欢

转载自blog.csdn.net/bohu83/article/details/107239239
今日推荐