一致性框架:供应链分布式事务问题解决方案

来源:得物技术

一、前言

二、一致性理论基础

1. 一致性模型概述

2. 最终一致性的必要性

三、供应链一致性框架总体架构

1. 一致性框架的核心功能

2. 一致性框架整体框架

3. 一致性框架整体流程

四、一致性框架实现原理

1. 核心组件设计

2. 异步执行实现原理

3. 重试机制实现

五、领域模型

六、数据模型

七、一致性框架案例

八、结语


 

前言

在当今微服务架构盛行的时代,分布式系统已经成为企业级应用的标准模式。然而,随之而来的分布式事务问题也成为了开发人员的一大挑战。在复杂的供应链系统中,

各个业务模块之间的数据一致性一直是一个重要且棘手的问题。物流、库存、订单等系统相互协作,如何在保证业务高效运转的同时,确保跨系统操作的数据一致性?


 

今天,我们将深入探讨一个专为解决供应链分布式事务问题而设计的框架——「一致性框架」。

一致性理论基础

一致性模型概述

在分布式系统中,一致性模型主要分为几种类型。

一致性模型类型

※ 强一致性

任何时刻,所有节点看到的数据都是一样的。

※ 弱一致性

不保证所有节点同时看到相同的数据。

※ 最终一致性

在一段时间后,所有节点最终会看到相同的数据。

其中,最终一致性是CAP理论(一致性、可用性、分区容忍性)中的一个重要妥协方案,它在保证系统高可用性的同时,通过异步机制确保数据的最终一致。

最终一致性的必要性

在微服务架构的系统中,我们常常面临着跨服务调用中的分布式事务问题、网络暂时性故障导致的调用失败、第三方系统响应慢导致的超时问题等。这些问题如果使用强一致性方案解决,往往会导致系统可用性下降、响应时间增加。因此,"先完成本地事务,异步确保远程调用的最终成功"的最终一致性方案被广泛采用。

供应链一致性框架总体架构

一致性框架的核心功能

供应链一致性框架包含以下核心功能:

  • 声明式API:简洁易用的接口供开发者使用
  • 操作记录持久化:记录操作信息,以便重试
  • 自动重试机制:失败后按策略自动重试
  • 并发控制:避免并发重试导致的问题
  • 超时与熔断:防止无效重试消耗资源
  • 监控与告警:重试失败达阈值时进行告警

一致性框架整体框架

一致性框架整体流程

供应链的一致性框架基于Spring Boot生态,这提供了简单易用的注解式API 。其总体流程如下:

初始化阶段

  1. 应用启动时,加载一致性框架配置。
  2. 初始化线程池、策略组件、监听器等核心组件。
  3. 注册定时任务(重试任务、清理任务)。

方法拦截阶段

  1. AOP拦截标注了 @EventualConsistency 注解的方法。
  2. 解析注解参数(referenceNo、是否异步、重试策略等)。
  3. 创建一致性操作上下文(ConsistencyContext)。

事务处理阶段

  1. 执行业务方法,记录执行结果。
  2. 事务提交后,进行一致性操作的执行。

一致性框架执行阶段

  1. 根据配置决定同步执行或异步执行。
  2. 保存执行记录到数据库。
  3. 同步执行直接调用目标方法,异步执行提交到线程池。
  4. 根据执行结果更新记录状态(DONE、EXCEPTION、FAILED)。

重试阶段

  1. 从数据库找出异常状态的记录,包含执行方法名、方法参数等。
  2. 执行器重试方法。
  3. 根据执行结果更新记录状态(DONE、EXCEPTION、FAILED)。

一致性框架整体流程如下

一致性框架实现原理

核心组件设计

我们的一致性框架包含以下核心组件:

注解层

@EventualConsistency 注解是框架的入口,它是一个运行时注解,可以应用于方法和类。其核心属性如下:

  • async() :控制第一次执行是否为异步执行,默认为 true 。
  • maxRetryTimes() :设置最大重试次数,默认为6次。
  • delay() : 配置重试延迟策略,使用嵌套的 @Delay 注解。
  • listeners() :指定监听器的Bean名称,用于监听重试过程。
  • beanName() :指定Bean名称,用于定位执行目标。
  • referenceNo() :设置业务参考号,用于业务追踪和幂等性控制。
  • serializerListener() :指定用于序列化和反序列化的监听器Bean名称。

拦截层

AnnotationAwareRetryOperationsInterceptor 负责拦截带有注解 @EventualConsistency 的方法,根据注解配置创建相应的执行策略。

执行层

执行层负责根据当前带有一致性注解方法的状态来选择合适的执行器,执行带有一致性框架注解的方法。一致性框架会记录执行方法的状态,包含初始化、异常、失败和完成状态。

根据状态不同,会选择不同的执行器:

  • SyncConsistencyExecutor :同步执行器,在当前线程中执行。
  • AsyncConsistencyExecutor :异步执行器,通过异步线程执行,不等待执行结果立即返回成功。
  • RetryConsistencyExecutor :重试执行器,专门对执行状态为异常的记录进行重试。
  • NestedConsistencyExecutor :嵌套执行器,专门处理嵌套一致性调用场景,记录执行信息但不立即执行方法,通过重试机制来执行嵌套任务,解决同一事务中嵌套调用的问题。

持久层

使用数据库存储执行记录,支持记录的创建、更新和查询。大消息存储到MongoDB,避免数据库性能问题。

异步执行实现原理

异步执行的核心是将操作持久化,然后在事务提交后异步执行。这种设计确保了只有当原事务提交成功后,才会执行异步操作,避免了事务回滚后执行异步操作的问题。

重试机制实现

重试机制基于以下几个关键点:

  1. 持久化记录:记录每次执行的参数和状态
  2. 定时扫描:定期扫描需要重试的记录
  3. 分布式锁:确保在集群环境下只有一个实例执行重试
  4. 反射调用:通过反射动态调用目标方法

领域模型

数据模型

一致性框架案例

买家在得物App下单后,供应链会接收商品发货单据。商品从仓库发货时,仓储域要将发货信息通知履约域,并扣减仓储库存。代码如下:

public void ship(String orderCode){    //通知履约域    notifyOfcShip(orderCode);    //库存扣减    inventorySubtract(orderCode);
}
@EventualConsistency(referenceNo = "#orderCode")public void notifyOfcShip(String orderCode){     // 发货调用履约域}

效果:即使履约系统出现异常,库存也能正常扣减,确保商品发货成功。一致性框架会重试通知履约域的方法,确保履约域发货单状态变更并通知交易域。

结语

在分布式系统中,一致性框架是确保系统可靠性的重要工具。通过正确使用一致性框架,我们可以构建既高可用又最终一致的系统,应对各种复杂的分布式场景。希望本文能帮助您更好地理解一致性框架的原理和应用,为您的系统添砖加瓦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84077.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

民国大模型:智能重构下的乱世觉醒与文明转型

引言:当外滩钟声遇见生成式AI 在历史博物馆的数字化展厅中,一幅动态的《民国百景图》正通过全息投影技术演绎十里洋场的繁华与沧桑。这个虚实交融的场景,恰似民国大模型技术的隐喻——以人工智能为纽带,连接起北洋军阀混战与民族…

ROS2 笔记汇总(2) 通信接口

在 ROS 系统中,通信接口(Interface) 是节点之间传递信息的标准“语言协议”,确保了不同功能节点之间可以正确理解和使用彼此传送的数据内容。我们可以将其理解为“数据结构格式定义”,贯穿于话题(Topic&…

微信小程序:将搜索框和表格封装成组件,页面调用组件

一、实现效果 实现搜索框,表格和翻页效果 二、组件实现 1、创建表格组件页面 (1)创建文件 在文件根目录(与pages同级)直接创建components文件夹,并创建表格的页面common-table/index (2)视图层 a、写入表头 循环由主页面传递的columns,数据为字段名label,宽度为设置…

基于贝叶斯学习方法的块稀疏信号压缩感知算法

基于贝叶斯学习方法的块稀疏信号压缩感知算法 BSBL-FM-master/BSBL_BO.m , 15593 BSBL-FM-master/BSBL_FM.m , 12854 BSBL-FM-master/Phi.mat , 131256 BSBL-FM-master/README.md , 3954 BSBL-FM-master/demo.mat , 1610 BSBL-FM-master/demo_fecg.m , 1481 BSBL-FM-master/de…

【Python爬虫】requests知识点讲解

目录 前言1. requests库基础1.1 安装requests1.2 基本导入 2. HTTP请求方法2.1 GET请求2.2 POST请求2.3 其他HTTP方法 3. 请求头设置3.1 User-Agent设置3.2 常用请求头 4. 响应处理4.1 响应内容获取4.2 响应状态码4.3 响应头信息 5. 会话管理5.1 Session对象5.2 Cookie处理 6. …

服务器上安装配置vsftpd

目录 1. 安装vsftpd服务 2、修改配置文件 3. 修改用户白名单 4. 通过ftp客户端命令登录ftp服务器 5. 参考资料 1. 安装vsftpd服务 执行命令安装vsftp服务、和ftp客户端 yum install vsftpd yum install ftp 2、修改配置文件 在服务器上先创建一个系统用户,待…

C#实现图片文字识别

这几年的AI的发展,使得文字识别难度大大降低、精度大大的提高。百度飞浆就是一个非常好的AI框架,而且是开源的。 我们利用百度飞浆就能快速简单的实现文字识别功能,几行代码就可以集成。 其中百度飞浆的PaddleOCR,就是专门针对文…

Android Framework 调用栈

在Android Framework开发中,添加调用栈(Call Stack)是调试复杂问题(如崩溃、死锁或流程追踪)的核心手段。 一、Java层调用栈添加 适用于Activity、Service等组件或Framework中的Java代码。 基础方法: 使用…

Ollama安装非系统盘操作方法(2025年6月测试通过)

Ollama是当前部署大模型比较便利的工具,但是默认会将软件和模型都安装到C盘下,导致系统盘爆表,建议将软件和模型都放置在非系统盘。 1. 软件安装在非系统盘 (1)在D盘下手动创建ollama目录 (2&#xff09…

《HTTP权威指南》 第1-2章 HTTP和URL基础

HTTP请求基础 格式化数据块称为HTTP报文 请求报文:从客户端发往服务器的HTTP报文,只有请求起始行请求首部,没有请求主体 响应报文:从服务器发往客户端的报文,包含响应起始行响应首部响应主体 HTTP报文通过传输控制…

9. TypeScript 泛型

TypeScript 中的泛型使开发者能够编写灵活、可重用的代码,同时保持类型安全。它们允许动态定义类型,确保函数、类和接口可以适用于任何数据类型。这有助于避免重复,提高代码的模块化,使其既类型安全又具备适应性。 一、认识泛型 …

Apache Iceberg与Hive集成:分区表篇

一、Iceberg分区表核心概念与Hive集成原理 1.1 分区表在大数据场景的价值 在大规模数据分析中,分区表通过将数据按特定维度(如时间、地域、业务类型)划分存储,可显著提升查询效率。Apache Iceberg的分区表设计融合了Hive的分区理…

SAST + IAST + DAST 全链路防护体系构建方案

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 1. 生命周期分层嵌入(防御纵深) 阶段工具防护重点集成触发点编码阶段SAST源码漏洞(硬编码密钥、SQL注入模式&#x…

pnpm link如何不踩坑

前提一:我有一个source-project源码库,有一个develop-project项目库。想使用pnpm link对source-project进行本地调试。 前提二:source-project源码库已打包 本地调试详细步骤如下: 1、检查是否配置了系统环境变量,P…

vue3 javascript 多字段求和技巧

在 Vue 3 中,如果你需要在一个组件中处理多个字段的求和,你可以通过计算属性(computed properties)或者方法(methods)来实现。这里我将展示两种主要的方法: 方法 1:使用计算属性&am…

【LeetCode】每日一题 —— No.3405

LeetCode 3405 统计恰好有 K 个相等相邻元素的数组数目&#xff08;DP 构造型&#xff09; 题目概述 我们需要统计长度为 n 的数组 arr 满足如下条件的方案数&#xff1a; 每个元素在区间 [1, m] 之间恰好存在 k 个位置 i (1 ≤ i < n) 满足 arr[i] arr[i - 1] 也就是说…

Elsa Workflows: .NET 的开源工作流引擎简介

文章目录 Elsa Workflows&#xff1a; .NET 的开源工作流引擎核心定位与理念关键特性与优势当前 (Elsa 3) 的已知限制/待完善项总结 Elsa Workflows&#xff1a; .NET 的开源工作流引擎 Elsa Workflows 是一个开源的、模块化的 .NET 库集合&#xff0c;旨在为 .NET 应用程序提…

linux虚拟机yum命令报错解决方案

问题 假如出现了这样的问题&#xff0c;可能是虚拟机yum库存在问题 解决方法 1、打开cmd&#xff0c;输入ssh root地址&#xff0c;比如ssh root192.168.222..111&#xff0c;选yes&#xff0c;输入虚拟机密码 2、使用yum repolist,查看仓库状态&#xff0c;status下面如果是…

C++ 第一阶段 基本语法 - 第一节:变量与数据类型详解

目录 一、变量与数据类型概述 1.1 什么是变量&#xff1f; 1.2 数据类型分类 二、基本数据类型详解 2.1 整型&#xff08;int, short, long&#xff09; 2.1.1 常见整型类型 2.1.2 代码示例 2.1.3 注意事项 2.2 浮点型&#xff08;float, double&#xff09; 2.2.1 浮…

CppCon 2017 学习:CNL: A Compositional Numeric Library

你说的这段关于浮点数的问题总结得很精准&#xff0c;我帮你整理一下&#xff0c;让理解更清晰&#xff1a; The Problem with Floating-Point&#xff08;浮点数的问题&#xff09; 复杂的表示结构 浮点数由符号位 &#xff0c;有效数&#xff08;significand/mantissa&…