热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[Java复习]分布式事务TCCRocketMQ最终一致性

Java,TCC
Java, TCC, 可靠消息最终一致性

画一下你们电商系统的核心交易链路图,说说分布式架构下存在什么问题?

主要核心是要考虑分布式事务分布式锁的问题。

分布式系统,事务 -> 分布式事务,锁 -> 分布式锁

 

电商核心流程:

订单服务 -> 创建订单 -> 库存服务 -> 扣减库存 -> 积分服务 -> 增加积分 -> 仓储服务 -> 通知发货

 

针对电商核心交易链路,你们是怎么设计分布式事务技术方案的?

TCC可靠消息最终一致性方案是在生产中最常用。

一个要求强一致,一个要求最终一致。

强一致主要用于核心模块,例如交易/订单等。最终一致一般用于边缘模块例如库存,通过mq去通知,保证最终一致性,也可以业务解耦。

 

TCC:

订单服务、库存服务、积分服务 -> 绑定为一个TCC事务

撤销刚才创建订单时,回滚刚才扣减库存和增加积分

可靠消息最终一致性:

可以去发送一个请求给消息中间件,由中间件保证一定会把消息交给下游的库存服务去扣减库存,仓储服务去通知发货等,

如果这个过程中有消息发送失败,则可靠消息中间件应该保证不停的重试投递消息。

 

对于TCC事务、最终一致性事务的技术选型,你们是怎么做的?如何调研的?

TCC:

阿里开源了分布式事务框架,fescar,seata。seata类似TCC事务,经历过阿里生产环境大量考验的框架。支持Dubbo,Spring Cloud。

可靠消息最终一致性:

基于ActiveMQ,RabbitMQ, RocketMQ等,自己开发一个可靠消息服务,收到消息之后,尝试投递到MQ,如果投递失败,重试投递。

现在大量用RocketMQ,作为MQ中间件,提供了分布式事务支持,已经把可靠消息服务需要实现的功能逻辑已经做好了。

 

 

在搭建好的电商系统里,落地开发对交易链路的TCC分布式事务方案?

seata:特点:自动回滚数据库事务。

https://github.com/seata/seata-samples.git

把seata所有的示例代码拷贝下来,里面提供的例子就是跟我们说的电商的核心例子是类似的.

然后先要下载一个seata-server到本地,在这里下载:https://github.com/seata/seata/releases,

然后启动起来,这是分布式事务管理中心,负责维护每一个分布式事务的状态,触发分布式事务的提交和回滚。

    

 

 

你能说说一个TCC分布式事务框架的核心架构原理吗?

Seata架构原理:

https://github.com/seata/seata

Seata中角色:

Transaction Coordinator(TC):协调器,单独的一个server。维护全局和分支事务的状态,驱动全局事务的提交或回滚。

Transaction Manager(TM):全局事务的发起者,负责开始/提交/回滚一个全局事务。(对应订单服务)

Resource Manager(RM):管理分支事务(注册分支事务/状态/提交/回滚),并负责与TC通讯。

整个使用seata进行分布式事务管理的生命周期

1、TM向TC发起全局事务,TC返回XID作为标识。

2、XID通过调用链传播。

3、RM将本地的事务注册到TC中表示为XID的全局事务中,成为一个分支事务。

4、再由TM向TC请求标识为XID的全局事务提交/回滚。

5、最终,由TC去驱动所有的分支事务提交/回滚。

 

现有的TCC事务方案的性能瓶颈在哪里?能支撑高并发交易场景吗?如何优化?

使用分布式事务主要是保证核心链路要么全部成功,要么全部失败。当然也会带来一些性能的开销。

seata模型里面频繁的网络通信,以及对应事务的状态持久化的IO等等。

如果需要支撑高并发,那么TC服务也需要横向扩容。相应的,对于TC背后的DB也需要进行优化。

 

RocketMQ分布式事务:

你了解RocketMQ对分布式事务支持的底层实现原理吗?

核心链路使用seata这种类似于TCC的事务,而像wms这种相当于是分支链路,可以通过MQ进行解耦。

但是通过MQ解耦也会带来一些问题,例如消息丢失,消息重复等等问题,因此也需要进行最终一致性的保证。

  

 

 结合整个订单接口服务,分为两个支付链路,一个是核心链路(订单业务),一个是非核心链路(wms) 整个流程。

先向RocketMQ发送half msg,然后调用核心链路。核心链路要是返回失败,就会走失败的逻辑:退款,更改订单状态为取消,再给rocketmq发送callback废弃掉刚才的消息。

如果成功,就commit msg让消费者可以消费。如果在等待期间,一直没有callback/commit那么mq就会走回调查询具体的状态。最终消费者接收到消息后,消费完成就回复mq一个ack, 如果消费失败了,mq就会重新投递或者换一个服务投递。使用rocketmq的half msg机制,可以实现这一套固定模式的最终一致性,很完善。 这个将wms的操作放在核心链路前面的这个问题,是为了提升整个订单接口服务的效率,因为需要保证最终一致性,那么必然会有消息生产者对MQ的一些操作,包括重试,ack等等,如果将这些逻辑全部都放在核心链路执行完成后再去一一完成,那么可能会耗费一些时间。而通过rocketmq这个模式,可以通过half msg的支持,来将整个与mq的交互过程拆解掉,从而提升效率。

  

如果公司没有RocketMQ中间件,那你们如何实现最终一致性事务?

基于数据库自己开发一个可靠消息服务。接受上游Producer发送的haf msg, 存入DB,返回响应。本地可靠消息服务启动定时扫描本地DB的half msg,超过一定时间没有commit/rollback就回调Producer接口,确认本地事务是否成功,获取commit/rollback。如果消息commit就发送消息给下游服务或者发给RabbitMQ/Kafka/ActiveMQ,下游服务消费后,回调可靠消息服务接口进行ack,如果没有收到ack,重发消息给下游服务。


推荐阅读
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • 通过优化模板消息机制,本研究提出了一种高效的信息化推送方案。该方案利用获取的访问令牌(access token)和指定的模板ID,实现了精准且快速的信息推送,显著提升了用户体验和信息传递效率。具体实现中,通过调用相关API接口,确保了消息的准确性和及时性,为用户提供更加便捷的服务。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 本文深入探讨了原型模式在软件设计中的应用与实现。原型模式通过使用已有的实例作为原型来创建新对象,而不是直接通过类实例化。这种方式不仅简化了对象的创建过程,还提高了系统的灵活性和效率。具体来说,原型模式涉及一个支持克隆功能的接口或基类,子类通过实现该接口来提供具体的克隆方法,从而实现对象的快速复制。此外,文章还详细分析了原型模式的优缺点及其在实际项目中的应用场景,为开发者提供了实用的指导和建议。 ... [详细]
  • 本项目在Java Maven框架下,利用POI库实现了Excel数据的高效导入与导出功能。通过优化数据处理流程,提升了数据操作的性能和稳定性。项目已发布至GitHub,当前最新版本为0.0.5。该项目不仅适用于小型应用,也可扩展用于大型企业级系统,提供了灵活的数据管理解决方案。GitHub地址:https://github.com/83945105/holygrail,Maven坐标:`com.github.83945105:holygrail:0.0.5`。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • 抖音AI特效风靡网络,真人瞬间变身动漫角色,吴亦凡、PDD和戚薇纷纷沉迷其中
    近期,抖音推出的一款名为“变身漫画”的AI特效在社交媒体上迅速走红,吸引了大量用户尝试。不仅普通网友积极参与,连吴亦凡、PDD和戚薇等明星也纷纷加入,体验将真人瞬间转化为动漫角色的神奇效果。这一特效凭借其高度的趣味性和创新性,迅速成为网络热议的话题。 ... [详细]
  • 如果你对项目管理和系统架构感兴趣,欢迎关注微信订阅号“softjg”,加入我们这个PM和架构师的大家庭。本文将探讨编写高质量软件架构文档的重要性及其优势。良好的架构文档不仅能够促进不同利益相关者之间的沟通与理解,还能为项目的长期维护和扩展提供坚实的基础。通过详细记录系统的设计决策和关键组件,架构文档能够确保团队成员在项目周期内保持一致性和高效协作。 ... [详细]
  • 修复一个 Bug 竟耗时两天?真的有那么复杂吗?
    修复一个 Bug 竟然耗费了两天时间?这背后究竟隐藏着怎样的复杂性?本文将深入探讨这个看似简单的 Bug 为何会如此棘手,从代码层面剖析问题根源,并分享解决过程中遇到的技术挑战和心得。 ... [详细]
  • Norton Partition Magic 中 PHP 函数 error_reporting(E_ALL ^ E_NOTICE) 的详细解析与应用
    在 Windows 环境下,通过具体示例分析了 `Norton Partition Magic` 中 `PHP` 函数 `error_reporting(E_ALL ^ E_NOTICE)` 的详细解析与应用。该函数用于控制错误报告级别,例如在从 PHP 4.3.0 升级到 4.3.1 后,程序出现多处错误的原因及解决方法。本文深入探讨了错误报告配置对程序稳定性的影响,并提供了实用的调试技巧。 ... [详细]
  • 前端技术实现调用摄像头进行拍照功能
    在公司项目中,为了实现调用摄像头进行拍照的功能,我们深入研究了HTML5的相关技术。尽管Java在许多方面表现出色,但在这一场景下,HTML5的灵活性和易用性更胜一筹。本文将分享具体的代码设计和实现细节,帮助开发者快速掌握这一功能。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
author-avatar
钟爱胖胖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有