`

分布式系统事务一致性解决方案

 
阅读更多
开篇
在OLTP系统领域,我们在很多业务场景下都会面临事务一致性方面的需求,例如最经典的Bob给Smith转账的案例。传统的企业开发,系统往往是以单体应用形式存在的,也没有横跨多个数据库。我们通常只需借助开发平台中特有数据访问技术和框架(例如Spring、JDBC、ADO.NET),结合关系型数据库自带的事务管理机制来实现事务性的需求。关系型数据库通常具有ACID特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

而大型互联网平台往往是由一系列分布式系统构成的,开发语言平台和技术栈也相对比较杂,尤其是在SOA和微服务架构盛行的今天,一个看起来简单的功能,内部可能需要调用多个“服务”并操作多个数据库或分片来实现,情况往往会复杂很多。单一的技术手段和解决方案,已经无法应对和满足这些复杂的场景了。

分布式系统的特性
对分布式系统有过研究的读者,可能听说过“CAP定律”、“Base理论”等,非常巧的是,化学理论中ACID是酸、Base恰好是碱。这里笔者不对这些概念做过多的解释,有兴趣的读者可以查看相关参考资料。CAP定律如下图:

在分布式系统中,同时满足“CAP定律”中的“一致性”、“可用性”和“分区容错性”三者是不可能的,这比现实中找对象需同时满足“高、富、帅”或“白、富、美”更加困难。在互联网领域的绝大多数的场景,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证“最终一致性”,只要这个最终时间是在用户可以接受的范围内即可。

分布式事务
提到分布式系统,必然要提到分布式事务。要想理解分布式事务,不得不先介绍一下两阶段提交协议。先举个简单但不精准的例子来说明:

第一阶段,张老师作为“协调者”,给小强和小明(参与者、节点)发微信,组织他们俩明天8点在学校门口集合,一起去爬山,然后开始等待小强和小明答复。

第二阶段,如果小强和小明都回答没问题,那么大家如约而至。如果小强或者小明其中一人回答说“明天没空,不行”,那么张老师会立即通知小强和小明“爬山活动取消”。

细心的读者会发现,这个过程中可能有很多问题的。如果小强没看手机,那么张老师会一直等着答复,小明可能在家里把爬山装备都准备好了却一直等着张老师确认信息。更严重的是,如果到明天8点小强还没有答复,那么就算“超时”了,那小明到底去还是不去集合爬山呢?

这就是两阶段提交协议的弊病,所以后来业界又引入了三阶段提交协议来解决该类问题。

两阶段提交协议在主流开发语言平台,数据库产品中都有广泛应用和实现的,下面来介绍一下XOpen组织提供的DTP模型图:


XA协议指的是TM(事务管理器)和RM(资源管理器)之间的接口。目前主流的关系型数据库产品都是实现了XA接口的。JTA(Java Transaction API)是符合X/Open DTP模型的,事务管理器和资源管理器之间也使用了XA协议。 本质上也是借助两阶段提交协议来实现分布式事务的,下面分别来看看XA事务成功和失败的模型图:


在JavaEE平台下,WebLogic、Webshare等主流商用的应用服务器提供了JTA的实现和支持。而在Tomcat下是没有实现的(其实笔者并不认为Tomcat能算是JavaEE应用服务器),这就需要借助第三方的框架Jotm、Automikos等来实现,两者均支持spring事务整合。

而在Windows .NET平台中,则可以借助ado.net中的TransactionScop API来编程实现,还必须配置和借助Windows操作系统中的MSDTC服务。如果你的数据库使用的mysql,并且mysql是部署在Linux平台上的,那么是无法支持分布式事务的。 由于篇幅关系,这里不展开,感兴趣的读者可以自行查阅相关资料并实践。

总结:这种方式实现难度不算太高,比较适合传统的单体应用,在同一个方法中存在跨库操作的情况。但分布式事务对性能的影响会比较大,不适合高并发和高性能要求的场景

提供回滚接口
在服务化架构中,功能X,需要去协调后端的A、B甚至更多的原子服务。那么问题来了,假如A和B其中一个调用失败了,那可怎么办呢?

在笔者的工作中经常遇到这类问题,往往提供了一个BFF层来协调调用A、B服务。如果有些是需要同步返回结果的,我会尽量按照“串行”的方式去调用。如果调用A失败,则不会盲目去调用B。如果调用A成功,而调用B失败,会尝试去回滚刚刚对A的调用操作。

当然,有些时候我们不必严格提供单独对应的回滚接口,可以通过传递参数巧妙的实现。

这样的情况,我们会尽量把可提供回滚接口的服务放在前面。举个例子说明:

我们的某个论坛网站,每天登录成功后会奖励用户5个积分,但是积分和用户又是两套独立的子系统服务,对应不同的DB,这控制起来就比较麻烦了。解决思路:

把登录和加积分的服务调用放在BFF层一个本地方法中。
当用户请求登录接口时,先执行加积分操作,加分成功后再执行登录操作
如果登录成功,那当然最好了,积分也加成功了。如果登录失败,则调用加积分对应的回滚接口(执行减积分的操作)。
总结:这种方式缺点比较多,通常在复杂场景下是不推荐使用的,除非是非常简单的场景,非常容易提供回滚,而且依赖的服务也非常少的情况。



这种实现方式会造成代码量庞大,耦合性高。而且非常有局限性,因为有很多的业务是无法很简单的实现回滚的,如果串行的服务很多,回滚的成本实在太高。

参考:http://www.cnblogs.com/dinglang/p/5679542.html
分享到:
评论

相关推荐

    分布式系统事务一致性解决方案大对比

    在探讨分布式系统事务一致性解决方案时,我们首先需要理解分布式系统的核心挑战之一就是如何在保证数据一致性的同时,还要维持系统的可用性和分区容错性。根据CAP定律,一个分布式系统不可能同时满足这三个特性。在...

    分布式系统事务一致性解决方案大对比,谁最好使?

    总的来说,分布式系统事务一致性没有一种万能的最佳方案,选择哪种方法取决于业务需求、性能要求以及系统的可扩展性。开发人员需要根据实际情况权衡一致性和可用性,选择最合适的解决方案,以确保系统的稳定性和用户...

    分布式系统一致性问题解决方案

    那么,分布式系统在面临各种业务场景时,究竟是哪些因素导致了一致性问题的产生,又有哪些有效的解决方案呢? 首先,我们需要了解一致性问题产生的背景。在分布式系统中,由于系统是由多个部分组成的,这些部分可能...

    使用RabbitMQ+延迟队列实现分布式事务的最终一致性方案

    在分布式系统中,确保数据的一致性是一项挑战。传统的ACID(原子性、一致性、隔离性和持久性)事务在分布式环境中难以实现,因为它们可能导致性能下降或者锁竞争问题。为了解决这一问题,我们可以采用“最终一致性”...

    6种分布式事务最终一致性解决方案,一次性说清.docx

    这时,CAP定理提出了在分布式系统中必须面对的权衡,即在一致性、可用性和分区容错性之间做出选择。 在追求高可用性的同时,分布式事务需要处理各种异常情况,如节点故障、网络中断、消息丢失或乱序、数据错误等。...

    深入理解分布式事务,高并发下分布式事务的解决方案

    本文来自于csdn,本文主要从分布式的原因,事务特性,和解决方案中深入理解了分布式事务,希望对您的学习有所帮助。 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的...

    一种高性能的分布式事务及一致性复制实现.pdf

    通过对现有技术和标准的深入分析,提出了一种融合了传统数据库事务一致性和新型数据库高性能特性的解决方案,并通过技术手段提高了系统的可扩展性和容错性。这一方案不仅对金融机构的数据处理系统升级具有指导意义,...

    分布式事务解决方案1.pdf

    在分布式系统设计与开发中,事务管理是确保数据一致性和完整性的关键部分。当系统中的服务分布在不同的节点或数据库时,跨服务的事务管理变得尤为复杂,这就是所谓的分布式事务。分布式事务挑战在于如何在保证一致性...

    6种分布式事务最终一致性解决方案,一次性说清了.docx

    在分布式事务中,有六种常见的最终一致性解决方案: 1. **两阶段提交(2PC)**:这是一种经典的分布式事务处理方式,由准备阶段和提交阶段组成。协调者收集所有参与者的结果,只有当所有参与者都同意提交时,事务才...

    分布式事务最终一致性常用方案.docx

    随着分布式系统的广泛采用,数据一致性问题变得更为复杂,因为没有一种万能的解决方案可以适用于所有场景。通常,需要根据业务需求和具体场景来选择合适的策略。以下是一些常见的分布式事务最终一致性方案。 **一、...

    分布式系统缓存一致性设计与应用.pdf

    研究者提出了不同的缓存一致性解决方案,包括基于事务内存的分布式编程环境中的缓存一致性维护机制和基于对象存储文件系统的协作式缓存一致性策略。缓存一致性的研究方向多样,取决于应用场景的不同需求。 本文提出...

    分布式系统:数据一致性解决方案.docx

    ### 分布式系统:数据一致性解决方案 #### 一、引言 随着信息技术的快速发展与互联网应用的日益普及,分布式系统已成为构建大型应用的基础架构之一。然而,在分布式环境中,如何确保数据的一致性成为了一个关键的...

    分布式事务的解决方案.pdf

    分布式事务的解决方案主要针对的是大型分布式系统中保证数据一致性的问题。在电商架构中,随着业务量的增加,数据库压力增大,需要通过分库分表来提高性能和响应速度。然而,这种优化策略会引入新的挑战,即如何在...

    分布式事务常用的解决方案,XA,Saga,TCC,MQ补偿.docx

    分布式事务是指在分布式系统中,事务操作跨越多个节点或服务器,需要保持事务的一致性和可靠性。分布式事务的解决方案有很多,常见的有XA、Saga、TCC和MQ补偿等。 XA(eXtended Architecture)是开放集团(Open ...

    微服务架构的分布式事务解决方案演示

    - **可靠消息最终一致性方案**:这是一种常见的分布式事务解决方案,通过消息队列(如RabbitMQ、ActiveMQ等)来传递消息,确保各个服务之间的最终一致性。这种方式适用于那些对实时性要求不是特别高的场景,例如支付...

    基于消息通信的分布式系统最终一致性平台.pdf

    而一致性保障平台能够及时发现并处理不一致,确保系统最终达到一致性状态,从而提供了一种既高效又经济的解决方案。 关键词:分布式系统、消息通信、消息中间件、一致性、幂等、事务、体系结构设计 总结来说,本文...

Global site tag (gtag.js) - Google Analytics