Java微服务系统分布式事务解决方案(上)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,182元/月
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
简介: Java微服务系统分布式事务解决方案(上)

0 分布式事务-微服务系统的最大挑战

单体系统通过事务解决的问题

  • 数据的并发访问、修改
  • 不同请求之间的数据隔离- 事务
  • 一个业务请求修改多个数据,保证都完成或失败
  • 发生异常时的数据回滚
  • Springcloud微服务系统架构

image.png

Event Sourcing 系统实例

image.png

分布式事务

定义

在分布式系统中实现事务。

1 CAP 定理

1.1 概念

CAP 理论在分布式系统中:

  • 一致性
    多个节点的数据是否强一致
  • 可用性
    分布式服务能一直保证可用状态。当用户发出一个请求后,服务能在有限时间内返回结果
  • 分区容忍性
    对网络分区的容忍性


对于共享数据系统,最多只能同时拥有CAP其中的两个,无法三者兼顾。

  • 任两者的组合都有其适用场景
  • 真实系统应当是ACID与BASE混合体
  • 不同类型的业务可以也应当区别对待
  • 分区容忍性不可或缺

1.png

分布式系统中,最重要的是满足业务需求,而不是追求抽象、绝对的系统特性。

2.2 中间件实例

  • 优先选择AP,弱化C
    Cassandra、Dynamo 等
  • 优先选择CP,弱化A
    HBase、MongoDB 等

2 BASE 理论

2.1 核心思想

  • 基本可用(BasicallyAvailable)
    分布式系统在出现故障时,允许损失部分的可用性来保证核心可用。
  • 软状态(SoftState)
    允许分布式系统存在中间状态,该中间状态不会影响到系统的整体可用性。
  • 最终一致性(EventualConsistency)
    分布式系统中的所有副本数据经过一定时间后,最终能够达到一致的状态

2.2 数据的一致性模型

分类

  • 强一致性
    数据更新成功后,任意时刻所有副本中的数据都是一致的。一般采用同步实现
  • 弱一致性
    数据更新成功后,系统不承诺立即可以读到最新写入的值,也不承诺具体多久后可读到
  • 最终一致性
    弱一致性的一种形式,数据更新成功后,系统不承诺立即可以返回最新写入的值,但是保证最终会返回上一次更新操作的值


分布式系统数据的强一致性、弱一致性和最终一致性可通过Quorum NRW算法分析。


3 分布式事务的解决方案

  • 异步校对数据
    支付宝、微信支付主动查询支付状态、对账单的形式;
  • 基于可靠消息(MQ)
    异步场景;通用性较强;拓展性较高
  • TCC编程式解决方案
    严选、阿里、蚂蚁金服自己封装的DTX

3.1 实现思路

理想状态

像单机数据库事务一样,多个数据库自动通过某种协调机制,实现跨数据库节点的一致性。

  • 使用场景
    要求严格的一致性,比如金融交易类业务。

一般情况

可容忍一段时间的数据不一致,最终通过超时终止,调度补偿等方式,实现数据的最终状态一致性。

  • 使用场景
    准实时或非实时的处理,比如 T+1 的各类操作,或者电商类操作。

3.2 实现方案

3.2.1 XA方案

3.2.2 TCC方案

三阶段

  • Try
    对各个服务的资源做检测,对资源进行提前锁定或者预留
  • Confirm
    在各个服务中执行实际的操作
  • Cancel
    如果任何一个服务的业务方法执行出错,那么这里就需要进行补偿,即执行已操作成功的业务逻辑的回滚操作

4.2 跨行转账案例

涉及到两个银行的分布式事务,如果用TCC实现:


Try阶段

先把两个银行账户中的资金给它冻结住,不让操作


Confirm阶段

执行实际的转账操作,A银行账户的资金扣减,B银行账户的资金增加


Cancel阶段

如果任何一个银行的操作执行失败,那么就需要回滚进行补偿

比如A银行账户如果已经扣减了,但是B银行账户资金增加失败了,那么就得把A银行账户资金给加回去。


该方案很少使用,但也有使用场景。

因为这个事务的回滚实际上严重依赖于你自己写代码来回滚和补偿了,会造成补偿代码巨大,非常恶心!

比如说我们,一般来说和钱相关的支付、交易等相关的场景,我们会用TCC,严格严格保证分布式事务要么全部成功,要么全部自动回滚,严格保证资金的正确性!

4.3 适用场景

除非你是真的一致性要求太高,是系统中核心之核心的场景!

常见的就是资金类的场景,那可以用TCC方案,自己编写大量的业务逻辑,自己判断一个事务中的各个环节是否ok,不ok就执行补偿/回滚代码。


而且最好是你的各个业务执行的时间都比较短。

但尽量别这么搞,自己手写回滚逻辑,或者是补偿逻辑,实在太恶心了,业务代码也很难维护。

4.4 方案示意图

image.png



目录
相关文章
|
5天前
|
存储 算法 安全
“卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
本文深入解析分布式系统核心机制:数据分片与冗余副本实现扩展与高可用,租约、多数派及Gossip协议保障一致性与容错。探讨节点故障、网络延迟等挑战,揭示CFT/BFT容错原理,剖析规模与性能关系,为构建可靠分布式系统提供理论支撑。
63 2
|
11天前
|
安全 Cloud Native Java
Java 模块化系统(JPMS)技术详解与实践指南
本文档全面介绍 Java 平台模块系统(JPMS)的核心概念、架构设计和实践应用。作为 Java 9 引入的最重要特性之一,JPMS 为 Java 应用程序提供了强大的模块化支持,解决了长期存在的 JAR 地狱问题,并改善了应用的安全性和可维护性。本文将深入探讨模块声明、模块路径、访问控制、服务绑定等核心机制,帮助开发者构建更加健壮和可维护的 Java 应用。
76 0
|
17天前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
108 1
|
20天前
|
机器学习/深度学习 算法 安全
新型电力系统下多分布式电源接入配电网承载力评估方法研究(Matlab代码实现)
新型电力系统下多分布式电源接入配电网承载力评估方法研究(Matlab代码实现)
|
1月前
|
Java 数据库 前端开发
分享44个java系统,总有一款适合您
分享44个微信小程序,总有一款适合您
37 0
|
1月前
|
消息中间件 Java Kafka
Java 事件驱动架构设计实战与 Kafka 生态系统组件实操全流程指南
本指南详解Java事件驱动架构与Kafka生态实操,涵盖环境搭建、事件模型定义、生产者与消费者实现、事件测试及高级特性,助你快速构建高可扩展分布式系统。
157 7
|
1月前
|
安全 Oracle Java
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
187 0
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
|
11天前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
46 0
|
23天前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
57 16