PS:本文全是理论没有感情
分布式事务的基本概念
1.1 什么是分布式事务?
分布式事务是指在分布式系统中,多个独立的服务或节点之间协同完成的一个事务操作。这个事务操作需要满足ACID特性(原子性、一致性、隔离性和持久性)。
原子性(Atomicity):在分布式事务中,所有参与事务的服务或节点协同完成操作,形成一个完整的事务单元。这个单元中的一系列操作要么全部成功提交,确保事务的完整性和数据的一致性,要么在出现错误或异常时全部回滚撤销,保证事务的原子性。
一致性(Consistency):在分布式事务中,所有参与事务的服务或节点必须确保数据在逻辑上的一致性,即使系统发生异常或故障,也必须保证数据的准确性和完整性。
隔离性(Isolation):在分布式事务环境中,各参与事务的服务或节点间的操作具有高度的独立性,彼此之间的操作相互隔离,确保一个事务的执行不会受到其他并发事务的干扰。这种隔离性保障了事务的原子性和一致性,从而提升了系统的稳定性和可靠性。
持久性(Durability):在分布式事务环境中,一旦事务成功提交,其处理结果将被永久性地存储在各个参与事务的服务节点或本地存储中,确保数据的持久性。即使在系统遭遇异常或故障的情况下,已提交的事务结果依然保持可靠且不会丢失。
事务原本主要局限于对单一数据库资源的访问控制,但随着架构服务化的趋势,事务的概念得到了进一步的拓展和应用。当我们将一个服务操作视为一个整体的事务时,这个服务操作应当仅涉及一个特定的数据库资源。这类事务,基于单个服务对单一数据库资源的访问,被称为本地事务(Local Transaction)。
1.2 分布式事务的背景
引发思考:
随着微服务架构的普及,系统被拆分为多个独立的服务,每个服务运行在不同的节点上。当这些服务需要协同完成一个业务操作时,就涉及到分布式事务的问题。
在本地环境中,事务主要局限于单个会话内,不涉及跨多个数据库资源的操作。然而,随着基于SOA的分布式应用的普及,对访问多个数据库资源和多种服务的需求日益增长,需要在同一事务中整合这些操作。因此,分布式事务应运而生。
分布式事务是指事务的操作跨越不同的节点或服务进行。由于事务的各个操作位于不同的位置,需要服务间的远程协作来完成整个事务操作。在这种分布式系统环境下,不同服务通过网络进行远程协作以完成事务,这被称为分布式事务。
分布式事务的核心是保证其中的小操作要么全部成功执行,要么全部失败回滚。其本质目的是确保在不同数据库间的数据保持一致性。
CAP定理
分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。
一致性(Consistency):在分布式系统中,所有的数据备份在某一时刻拥有相同的值。
可用性(Availability):确保每个请求都能得到响应,无论请求是否成功。
分区容错性(Partition tolerance):即使在部分组件出现故障或网络分区的情况下,系统仍然能够继续操作并提供服务。
BASE理论
BASE理论是CAP理论中有关一致性和可用性的权衡结果。其核心思想在于:在分布式系统中,无法同时实现强一致性和所有请求的即时可用性。然而,根据每个应用的业务特点,我们可以通过牺牲部分一致性来确保系统的基本可用性。这种平衡体现在三个方面:Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)。通过采用这些原则,我们可以使系统达到最终一致性,同时保持足够的可用性。
酸碱平衡
ACID属性确保事务的强一致性及数据的实时一致性,在本地事务中这是可行的。但在分布式事务环境中,强一致性可能会对分布式系统的性能产生影响。因此,分布式系统通常遵循Base理论。然而,不同业务场景对一致性的要求是不同的。例如,在交易场景中,需要保证强一致性以确保数据的准确性和完整性;而在发送短信验证码的场景中,对实时性要求不高,可以遵循Base理论的要求。这种在不同场景下对一致性的灵活调整,可以看作是一种“酸碱平衡”的理念,以优化系统性能和满足业务需求。
分布式事务的核心技术
2.1最佳实践
一如既往的电子订单系统,用户下单后,需要更新库存、扣减用户积分、生成订单等多个服务协同完成!
就是说用户的一个操作我们需要访问三个不同的微服务和三个不同的数据库 行为如下
这这三件事实际上构成了一个完整的业务流程,每一步都至关重要,缺少任何一个环节都会导致整个流程的失败。它们包括更新库存、扣减用户积分以及生成订单,每一步都必须成功执行,以确保事务的一致性。如果其中任何一个环节出现问题或失败,都必须进行回滚操作,以确保数据的完整性和准确性。这就体现了事务的一致性要求,即在分布式系统中,多个操作必须作为一个整体一起提交或回滚,以确保数据的逻辑一致性和系统的可靠性。
3.1 基于XA协议的JTA事务管理
3.1.1 XA协议概述
XA协议是由X/Open组织提出的一种分布式事务管理协议。其核心作用在于协调不同资源管理器之间的事务,确保数据在各种操作过程中的一致性和完整性。
3.1.2 JTA(Java Transaction API)与XA协议的结合
在Java平台上,JTA作为事务管理API,完美支持基于XA协议的分布式事务管理。其主要组件包括:
一、UserTransaction
是JTA中用于管理全局事务的核心接口。通过此接口,开发者可以编程控制事务的提交、回滚等关键操作。
二、TransactionManager
负责注册和管理资源管理器。通过此接口,系统可以协调各个资源管理器之间的事务,确保事务的原子性和一致性。此外,它还提供了一系列功能,如事务的挂起、恢复等。
综上所述,JTA与XA协议的结合,为Java平台上的分布式事务管理提供了强大而灵活的工具。
3.2 基于Spring的分布式事务
3.2.1 Spring的事务管理概览
Spring框架提供了两种主要的事务管理方式:声明式事务管理和编程式事务管理。
声明式事务管理:通过注解或XML配置文件,以简洁的方式定义事务的边界和操作属性。这种方式使得业务逻辑与事务管理分离,降低了代码的复杂性。
编程式事务管理:在这种方式下,开发者需要手动编写代码来控制事务的开启、提交和回滚。虽然这种方式相对繁琐,但在某些特定场景下(如需要动态决定事务属性时)仍然有其用途。
3.2.2 Spring与JTA的集成
Spring可以与Java事务API(JTA)无缝集成,支持基于XA协议的分布式事务处理。这种集成提供了在分布式系统中进行复杂事务管理的能力,增强了Spring事务管理的功能。
3.3 基于TCC(Try-Confirm-Cancel)模式
3.3.1 概念简述
TCC模式是一种基于补偿机制的分布式事务管理方法。其核心流程包括三个主要阶段:尝试阶段(Try阶段)、确认阶段(Confirm阶段)和取消阶段(Cancel阶段)。在Try阶段,尝试执行本地事务操作;在Confirm阶段,若事务操作成功,则确认提交本地事务;若事务操作失败,则进入Cancel阶段,回滚本地事务。
3.3.2 实现方法
为实现TCC模式,可以采用Saga模式或自定义的补偿逻辑。通过这两种方式,可以有效地实现分布式事务的补偿管理,确保数据的一致性和系统的稳定性。
3.4 基于MQ的消息可靠传输 推荐
利用Kafka或RabbitMQ等消息队列技术,我们可以实现分布式事务的可靠传输。在这个过程中:
生产者:负责将事务相关的消息发送到消息队列中。这些消息可能包含触发事务的指令或数据。
消费者:从消息队列中接收消息,并根据接收到的消息执行相应的本地事务操作。在消费消息时,消费者需要确保事务的完整性和一致性,以便实现分布式系统的可靠传输。通过这一机制,我们可以确保即使在分布式环境中,事务的处理也能保持高效和可靠。