在我写的本文中,我将详细讨论分布式事务的概念,并对两阶段提交模式进行解释。
我们需要了解什么是事务。在编程中,事务是指一系列操作作为单个原子工作单元执行。事务的特点包括原子性、一致性、隔离性和持久性。
在单体应用中,由于所有组件紧密耦合且运行在同一个进程中,管理事务相对容易,可以保持一致性、隔离性和回滚更改。但是,在分布式系统中,如微服务架构中,由于服务分布在多个机器和进程中,维护事务的ACID属性变得困难。
分布式事务涉及多个数据库或其他资源分布在不同服务器上的事务,用于协调这些资源的动作,以确保事务的更改是具有ACID特性的。
举例说明,在处理在线支付的服务中,第一个数据库包含发送方的数据,第二个数据库包含接收方的数据。当一个数据库执行扣款操作,另一个数据库必须执行收款操作,但如果其中一个数据库事务失败,数据将不一致。
为了解决这个问题,可以采用两阶段提交。两阶段提交是一种协议,用于在分布式系统中实现原子提交,其包括准备阶段和提交阶段。
Java中的JTA(Java Transaction API)允许应用程序执行分布式事务,定义了事务管理器和各方之间的标准Java接口。
结论:分布式事务对于每个分布式系统至关重要,尽管两阶段提交解决了一些问题,但也存在一些限制。因此,一些软件工程师提出了SAGA模式,超越了传统分布式事务模式。
分布式事务是一种解决分布式系统中数据一致性问题的技术方案。随着分布式系统的普及和应用,由于数据分散在不同的地方并且系统之间存在着所谓的异地数据复制、数据同步和数据共享,因此在进行跨系统事务处理时就变得非常复杂。分布式事务技术的出现,在很大程度上解决了这个问题。
分布式事务的实现依赖于分布式事务管理器(DTM)。DTM可以通过调用各个系统的本地事务来管理事务的提交和回滚,从而保证了分布式系统中数据的一致性。另外,DTM还可以通过采用隔离级别来避免数据冲突问题,确保数据的正确性和完整性,使得分布式系统的事务管理变得更加简单可靠。
在分布式系统中,分布式事务可以进一步提升系统的性能和扩展性,实现分布式系统的高可用和故障恢复。采用分布式事务技术可以整合各个系统的业务逻辑,避免不必要的数据拷贝和传输,减少不必要的网络开销和系统资源的消耗,提升分布式系统的整体性能和稳定性。随着大数据、云计算和物联网技术的不断发展,分布式事务技术的重要性将越来越凸显,必将成为分布式系统中不可或缺的关键技术。
1、两阶段提交协议 分为两个阶段:一个准备阶段 ,一个提交阶段。 基于两阶段协议,事务管理器能够最大限度地保证跨数据库操作的事务原子性,是分布式系统环境下最严格的事务实现方法。 但是两阶段协议存在性能方面问题,难于进行水平伸缩,因为在提交事务过程中,事务管理器需要每个参与者进行准备和提交的操作协调,在准备阶段锁定资源,在提交阶段消费资源。 由于参与者众多,锁定资源和消费资源之间的时间差被拉长,导致响应速度较慢,产生死锁或不确定结果的可能性较大。 在互联网很少使用两阶段提交协议。 两阶段提交协议是阻塞协议,在极端情况下不能快速响应请求方,因此提出了三阶段提交协议,解决了两阶段提交协议的阻塞问题,但仍然需要事务管理器在参与者之间协调,才能完成一个分布式事务。 2、最大努力保证模式 这是一种非常通用的保证分布式一致性的模式,很多开发人员一直在使用,但是未认识到这是一种模式,最大努力保证模式适用于对一致性要求并不十分严格但是对性能要求较高的场景。 具体的实现方式是:在更新多个资源时,将多个资源的提交尽量延后到最后一刻处理,如果业务流程出现问题,则所有的资源更新都可以回滚,事务仍然保持一致。 唯一可能出现问题的是在提交多个资源时发生了系统问题,比如网络问题等。 但是这种情况是非常罕见的,一旦出现这种情况,就需要进行实时补偿,将已提交的事务进行回滚。 当然在使用这种模式时,我们要考虑每个资源的提交顺序。 我们在生产实践中遇到的一种反模式,就是在数据库事务中嵌套远程调用,而且远程调用的是耗时任务,导致数据库事务被拉长,最后拖垮数据库。 3、事务补偿机制 在对性能要求很高的场景中,两阶段提交协议不是一种好方案,最大努力保证模式也会使多个分布式操作相互嵌套,有可能相互影响。 这里我们给出事务补偿机制,其性能很高,并且能尽最大可能地保证事务的一致性。 在数据库分库分表后,如果涉及的多个更新操作在某一个数据库范围内完成,则可以使用数据库内的本地事务保证一致性。 对于跨库的多个操作,可通过补偿和重试,使其在一定的时间窗口内完成操作,这样就可以实现事务的最终一致性,突破事务遇到问题就回滚的传统思路。 如果采用事务补偿机制,则在遇到问题时,需要记录遇到问题的环境、信息、步骤、状态等,后续通过重试机制使其达到最终一致性。
ActiveMQ工作原理:
首先来看本地通讯的情况,应用程序A和应用程序B运行于同一系统A,它们之间可以借助消息队列技术进行彼此的通讯:应用程序A向队列1发送一条信息,而当应用程序B需要时就可以得到该信息。
其次是远程通讯的情况,如果信息传输的目标改为在系统B上的应用程序C,这种变化不会对应用程序A产生影响,应用程序A向队列2发送一条信息,系统A的MQ发现Q2所指向的目的队列实际上位于系统B,它将信息放到本地的一个特殊队列-传输队列(Queue)。我们建立一条从系统A到系统B的消息通道,消息通道代理将从传输队列中读取消息,并传递这条信息到系统B,然后等待确认。只有MQ接到系统B成功收到信息的确认之后,它才从传输队列中真正将该信息删除。如果通讯线路不通,或系统B不在运行,信息会留在传输队列中,直到被成功地传送到目的地。这是MQ最基本而最重要的技术--确保信息传输,并且是一次且仅一次(once-and-only-once)的传递。
MQ提供了用于应用集成的松耦合的连接方法,因为共享信息的应用不需要知道彼此物理位置(网络地址);不需要知道彼此间怎样建立通信;不需要同时处于运行状态;不需要在同样的操作系统或网络环境下运行。
标签: 分布式事务、 分布式存储、 分布式服务器、本文地址: https://yihaiquanyi.com/article/85b14457887c99e03655.html
上一篇:利用1024节点成功PolarDB一天玩转利用1000t...