尼恩说在前面
Seata是如何解决分布式事务问题的?Seata 的使用场景有哪些? Seata 如何实现 事务的隔离性? 如何实现 强弱一致性 结合的分布式事务?
《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到文末公号【技术自由圈】获取
本文目录
- 尼恩说在前面
- 一:回顾Seat AT 模式
- AT模式角色如下
- 分支事务 处理逻辑如下
- AT模式第一阶段 Prepare 阶段
-这也是Seata和XA事务的不同之处:
- AT模式第二阶段
-场景一:提交,全局提交
-场景二:回滚,全局回滚
- AT模式相对于XA模式的优势
- 秒杀实操的AT分布式事务架构
- Seat AT 模式的不足
- 二:回顾Seat TCC 模式
- Seata TCC基本原理
- Seata TCC模式的流程图
- Seata TCC 事务的3个操作
- TCC 模式第一阶段 try 阶段
- TCC 模式第二阶段
- TCC版本的秒杀的分布式事务架构
- Seata TCC 事务的弱点
- 三:新功能 Seata + Rocketmq 事务消息实现 强弱结合型事务
- Seata + Rocketmq 事务消息 结合
- Seata + Rocketmq 事务消息 结合的使用场景
- 说在最后:有问题找老架构取经
一:回顾Seat AT 模式
AT模式角色如下
分支事务 处理逻辑如下
AT模式第一阶段 Prepare 阶段
这也是Seata和XA事务的不同之处:
谁的功劳:回滚日志
AT模式第二阶段
场景一:提交,全局提交
场景二:回滚,全局回滚
AT模式相对于XA模式的优势
秒杀实操的AT分布式事务架构
Seat AT 模式的不足
二:回顾Seat TCC 模式
Seata TCC基本原理
Seata TCC模式的流程图
第一阶段使用prepare尝试事务提交, 第二阶段使用commit或者rollback让事务提交或者回滚。
Seata TCC 事务的3个操作
操作方法 | 含义 |
A扣钱对应服务A(ServiceA) B加钱对应服务B(ServiceB) 转账订单服务(OrderService) 业务转账方法服务(BusinessService)
ServiceA | ServiceB | OrderService | |
ServiceA.try() ServiceB.try() OrderService.try()
TCC 模式第一阶段 try 阶段
TCC 模式第二阶段
TCC版本的秒杀的分布式事务架构
Seata TCC 事务的弱点
需要自定义 提交操作 + 回滚操作, 存在业务入侵。 需要处理 悬挂 问题 需要处理 空回滚问题
三:新功能 Seata + Rocketmq 事务消息实现 强弱结合型事务
消息发送方 向 Broker 发送一条 half 消息; half 消息发送成功后,消息发送方 执行本地事务; 如果 消息发送方 执行本地事务成功,则向 Broker 发送 commit 请求,否则发送 rollback 请求; 如果 Broker 收到的是 rollback 请求,则删除保存的 half 消息; 如果 Broker 收到的是 commit 请求,则把 half 消息投递到 真实 队列, 等待消费服务来拉取,然后删除保存的 half 消息; 如果 Broker 没有收到 rollback/commit 请求,则会发送请求到 Producer 查询本地事务状态,然后根据 Producer 返回的本地状态做 commit/rollback 相关处理。
Seata + Rocketmq 事务消息 结合
一 是保证 分布式事务 + 消息 发送的原子性。 二 是 再通过mq的重试机制,去保证订阅者的最终一致性,
SeataMQProducer(final String namespace, final String producerGroup, RPCHook rpcHook) {
super(namespace, producerGroup, rpcHook);
this.transactionListener = new TransactionListener() {
@Override
public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
return LocalTransactionState.UNKNOW;
}
@Override
public LocalTransactionState checkLocalTransaction(MessageExt msg) {
String xid = msg.getProperty(PROPERTY_SEATA_XID);
if (StringUtils.isBlank(xid)) {
LOGGER.error("msg has no xid, msgTransactionId: {}, msg will be rollback", msg.getTransactionId());
return LocalTransactionState.ROLLBACK_MESSAGE;
}
GlobalStatus globalStatus = DefaultResourceManager.get().getGlobalStatus(SeataMQProducerFactory.ROCKET_BRANCH_TYPE, xid);
if (COMMIT_STATUSES.contains(globalStatus)) {
return LocalTransactionState.COMMIT_MESSAGE;
} else if (ROLLBACK_STATUSES.contains(globalStatus) || GlobalStatus.isOnePhaseTimeout(globalStatus)) {
return LocalTransactionState.ROLLBACK_MESSAGE;
} else if (GlobalStatus.Finished.equals(globalStatus)) {
LOGGER.error("global transaction finished, msg will be rollback, xid: {}", xid);
return LocalTransactionState.ROLLBACK_MESSAGE;
}
return LocalTransactionState.UNKNOW;
}
};
Seata + Rocketmq 事务消息 结合的使用场景
说在最后:有问题找老架构取经
空窗1年/空窗2年,如何通过一份绝世好简历, 起死回生 ?
空窗8月:中厂大龄34岁,被裁8月收一大厂offer, 年薪65W,转架构后逆天改命!
空窗2年:42岁被裁2年,天快塌了,急救1个月,拿到开发经理offer,起死回生
空窗半年:35岁被裁6个月, 职业绝望,转架构急救上岸,DDD和3高项目太重要了
空窗1.5年:失业15个月,学习40天拿offer, 绝境翻盘,如何实现?
100W 年薪 大逆袭, 如何实现 ?
100W案例,100W年薪的底层逻辑是什么? 如何实现年薪百万? 如何远离 中年危机?
如何 评价一份绝世好简历, 实现逆天改命,包含AI、大数据、golang、Java 等
实现职业转型,极速上岸
关注职业救助站公众号,获取每天职业干货
助您实现职业转型、职业升级、极速上岸
---------------------------------
实现架构转型,再无中年危机
关注技术自由圈公众号,获取每天技术千货
一起成为牛逼的未来超级架构师
几十篇架构笔记、5000页面试宝典、20个技术圣经
请加尼恩个人微信 免费拿走
暗号,请在 公众号后台 发送消息:领电子书
如有收获,请点击底部的"在看"和"赞",谢谢