尼恩说在前面
秒杀的分布式事务, 是如何设计的? 抢购场景, 如何实现 分布式事务? 分布式事务了解吗?你们是如何解决分布式事务问题的? Seata 如何实现 RC ?保证事务的隔离性? Seata是如何解决分布式事务问题的?Seata 的使用场景有哪些? Seata 如何实现 事务的隔离性? 如何实现 强弱一致性 结合的分布式事务?
面试题:分布式事务了解吗?你们是如何解决分布式事务问题的?(标准答案:见末尾)
友情提示:看完此文,在分布式事务这块,基本可以做到吊打面试官了。
《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到文末公号【技术自由圈】获取
本文目录
- 尼恩说在前面
- 1:Seata 和Rocketmq 事务消息实现,实现 强弱结合型事务
- Seata + Rocketmq 事务消息 结合
- Seata + Rocketmq 事务消息 结合的使用场景
- 2. 面试题标准答案: 如何解决分布式事务问题的?
- (1)强一致性场景
- (2)弱一致性场景
- (3)强弱结合一致性场景
- 各大模式的总体对比:
- 说在最后:有问题找老架构取经
1:一图解读分布式事务
上面这个图比较复杂,后面会结合 《尼恩Java面试宝典》配套视频,进行视频的录制 具体的内容,请参见 尼恩 的最新 文章: '分布式事务' 圣经:从入门到精通,架构师尼恩最新、最全详解 (50+图文4万字全面总结 )
1: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 事务消息 结合的使用场景
2. 面试题标准答案: 如何解决分布式事务问题的?
面试题:分布式事务了解吗?你们是如何解决分布式事务问题的?
强一致性模型, Seata AT/TCC 强一致方案 模式用于强一致主要用于核心模块,例如交易/订单等。 弱一致性模型。 MQ异步确保型 事务 弱一致方案一般用于边缘模块例如库存,通过MQ 原子消息和发布订阅,保证最终一致性,也可以业务解耦。
面试中如果你真的被问到,可以分场景回答:
(1)强一致性场景
阿里开源了分布式事务框架seata经历过阿里生产环境大量考验的框架。seata支持Dubbo,Spring Cloud。
订单库:增加订单 商品库:扣减库存 优惠券库:预扣优惠券
(2)弱一致性场景
积分服务:增加积分 会计服务:生成会计记录
(3)强弱结合一致性场景
订单库:增加订单 商品库:扣减库存 优惠券库:预扣优惠券
积分服务:增加积分 通知服务:发生通知
各大模式的总体对比:
属性 | 2PC | TCC | Saga | 异步确保型事务 | 尽最大努力通知 |
说在最后:有问题找老架构取经
空窗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个技术圣经
请加尼恩个人微信 免费拿走
暗号,请在 公众号后台 发送消息:领电子书
如有收获,请点击底部的"在看"和"赞",谢谢