当前位置: 首页 > news >正文

小事务架构下的业务完整性保障:基于业务处理记录与补偿机制的技术实现

随着微服务架构、事件驱动架构(EDA)和最终一致性理念的普及,传统的大事务管理方式被更细粒度的“小事务”所取代。在这种架构中,全局业务流程被拆解成多个局部事务节点,通过异步消息进行编排。这种解耦提高了可扩展性和可用性,但也带来了 业务完整性难以追踪和保障 的挑战。

为此,引入“业务处理记录机制 + 补偿调度机制”成为保障业务一致性与可回溯性的关键手段。


🧱 一、为什么需要业务处理记录机制

在去中心化的微服务架构中,以下问题变得普遍:

问题描述
无全局事务跨多个服务/数据库的操作无法使用分布式事务(XA/2PC效率差、易死锁)
异步消息丢失/重复消费可能某个节点未处理成功或被重复触发,需判断是否已执行
补偿逻辑难以判定执行状态无记录无法判断是否需要补偿、是否已经补偿、是否补偿成功
业务异常排查困难无法得知哪个节点失败、失败原因、是否重试过、失败是否可重入

因此,必须显式记录业务每个节点的处理状态,以便实现幂等控制、链路追踪、补偿重试与审计可视化


🛠 二、核心技术机制:业务处理记录表设计

设计一个通用的“业务节点处理日志表”(如下示例),用于记录每个微服务节点对某一业务的处理状态:

表结构:process_node_log

CREATE TABLE process_node_log (id BIGINT PRIMARY KEY AUTO_INCREMENT,biz_type VARCHAR(50) NOT NULL COMMENT '业务类型',biz_id VARCHAR(100) NOT NULL COMMENT '业务ID,如订单ID',node_code VARCHAR(50) NOT NULL COMMENT '处理节点编码,如扣库存',status TINYINT NOT NULL COMMENT '0待处理,1成功,2失败,3已补偿',execute_time DATETIME DEFAULT NULL COMMENT '执行时间',retry_count INT DEFAULT 0 COMMENT '重试次数',error_message VARCHAR(500) DEFAULT NULL COMMENT '错误详情',trace_id VARCHAR(100) DEFAULT NULL COMMENT '调用链追踪ID',created_at DATETIME NOT NULL,updated_at DATETIME NOT NULL,UNIQUE KEY uq_biz_node (biz_id, node_code)
);

技术要点:

  • biz_id + node_code 联合唯一,保障同一业务节点只能处理一次(用于幂等校验);

  • status 表示处理状态(成功、失败、补偿中等);

  • retry_counterror_message 支持补偿调度与问题诊断;

  • trace_id 与链路追踪平台(如 Jaeger、Skywalking)结合;

  • created_at/updated_at 支持故障排查、超时监控。


🔁 三、结合事件驱动架构的典型处理流程

订单创建业务为例(包含库存扣减、账户扣款、消息通知):

Step 1:主服务记录所有节点处理计划

订单服务 → 写入 3 条节点记录到 process_node_log:
- node_code = stock_freeze(冻结库存)
- node_code = balance_freeze(冻结余额)
- node_code = notify_user(用户通知)

Step 2:子服务消费消息时:

  • 根据 biz_id + node_code 查询记录;

  • 若无记录或状态=1,跳过(幂等);

  • 执行业务逻辑;

  • 成功后更新状态为1,失败记录错误信息、更新状态为2。

Step 3:定时补偿器定时轮询失败记录

  • 执行失败节点的补偿操作;

  • 成功后更新为状态3(补偿完成);

  • 支持最大重试次数、失败告警通知。


🔁 四、补偿机制的工程实现建议

1. 补偿调度器(Compensator)

部署一个异步补偿调度器服务(可作为独立微服务或定时任务):

功能:
- 定时查询所有 status = 2 的处理记录;
- 通过 node_code 路由到对应的补偿逻辑;
- 自动执行补偿方法;
- 更新处理状态;
- 支持并发调度、分布式锁(避免重复补偿)。

2. 补偿接口规范(每个子服务都需实现)

所有具备幂等补偿能力的服务暴露统一接口,如:

POST /api/compensate
{"biz_id": "ORDER123456","node_code": "stock_freeze"
}

服务内部:

  • 校验处理状态;

  • 执行补偿逻辑(如库存解冻、余额释放);

  • 返回补偿是否成功;

  • 写入补偿日志(可与主日志复用或单独记录)。


🔐 五、技术注意事项

项目建议
幂等设计每个业务节点必须具备幂等执行能力:查询日志状态决定是否执行。
异常可视化日志中记录完整错误栈,便于监控平台报警与开发排查。
分布式锁补偿调度需使用 Redisson/Etcd/Zookeeper 控制并发(防重复补偿)。
审计合规所有节点处理记录需具备追踪链路,满足审计要求。
调试工具补偿平台建议支持人工触发/终止补偿任务,用于灰度、人工兜底。

🧠 六、总结观点:小事务架构中构建业务级事务日志系统

在小事务架构中,通过显式记录业务流程各节点状态,我们构建出一套业务级的“事务日志系统”,取代传统数据库事务机制,实现以下目标:

  • ✅ 异步事件幂等控制;

  • ✅ 节点级异常监控与诊断;

  • ✅ 自动补偿调度与状态回退;

  • ✅ 支持人工介入的可操作性平台;

  • ✅ 全链路可追溯、可审计、可再现。

相关文章:

小事务架构下的业务完整性保障:基于业务处理记录与补偿机制的技术实现

随着微服务架构、事件驱动架构(EDA)和最终一致性理念的普及,传统的大事务管理方式被更细粒度的“小事务”所取代。在这种架构中,全局业务流程被拆解成多个局部事务节点,通过异步消息进行编排。这种解耦提高了可扩展性和…...

DELL电脑开机进入自检界面

疑难解答 - 如何解决开机直接进入BIOS画面 添加链接描述 一、DELL电脑开机自检提示please run setup program 未设置一天中的时间-请运行安装程序(Time-of-day not set - please run SETUP program) 配置信息无效-请运行安装程序(Invalid configuration information - ple…...

Spring Boot 微服务中集成 MyBatis-Plus 与集成原生 MyBatis 有哪些配置上的不同?

在Spring Boot 微服务中集成 MyBatis-Plus (MP) 与集成原生 MyBatis (MB) 在配置上的主要不同点。MyBatis-Plus 是在 MyBatis 基础上进行的增强,它兼容 MyBatis 的所有配置方式,并提供了更简洁、更强大的配置选项。 相同点: 基础数据源配置 (DataSource…...

最近准备写个Playbook,详细点的指导手册,作为后续的销售培训文件,也趁着这个机会整理下产品思路,尤其是对于UALink,UEC新的联盟规范的测试用例

# 最近准备写个Playbook,详细点的指导手册,作为后续的销售培训文件,也蹭这个机会整理下产品思路。随着产品线越来越多(其实也是越来越少),东西越来越杂,已经不是三言两语就能解释得清楚了。 其…...

Kimi-VL:开源多模态视觉语言模型的崭新突破

近年来,人工智能在多模态模型的领域取得了显著的进展,特别是在能够处理文本和视觉输入的模型方面。MoonshotAI团队近期开源发布了Kimi-VL模型,这一模型凭借其在视觉理解、推理和智能体任务中的优异表现,受到了广泛关注。与GPT-4o等…...

NLP专业技能2025

Linux: 熟练使用Linux操作系统,熟练使用Linux常用命令进行开发。 熟悉掌握shell脚本编程技术的使用,能够编写简单的Shell脚本并熟练使用shell脚本四剑客(find、sed、grep、awk)进行日志解析。 熟练使用Linux环境进行开…...

C++STL循环队列实现

核心概念 循环队列(Circular Queue),也称为环形队列,是一种特殊的队列数据结构。它通过将队列的首尾相连,解决了传统队列因出队操作导致的空间浪费问题(即“假溢出”),从而更高效地…...

YOLOv3实践教程:使用预训练模型进行目标检测

目录 简介环境准备获取预训练模型图像目标检测视频目标检测模型性能优化常见问题解答进阶学习路径 简介 YOLOv3(You Only Look Once version 3)是一种高效的实时目标检测算法,由Joseph Redmon和Ali Farhadi于2018年提出。与传统的目标检测…...

confluent-kafka入门教程

文章目录 官方文档与kafka-python的对比配置文档配置项 Producer代码示例Consumer代码示例 官方文档 confluent_kafka API — confluent-kafka 2.8.0 documentation Quick Start for Confluent Cloud | Confluent Documentation 与kafka-python的对比 对比维度confluent-ka…...

网络安全-Http\Https协议和Bp抓包

1. http协议,有请求必有相应, 请求协议, 响应协议; 2. 密码学加密机制及常用算法和常用名称说明: 算法 密钥 明文数据 密文; 加密算法分类和常用算法: 加密算法可以归结为三大类&#xff…...

TDengine 语言连接器(C#)

简介 TDengine.Connector 是 TDengine 提供的 C# 语言连接器。C# 开发人员可以通过它开发存取 TDengine 集群数据的 C# 应用软件。 .NET 版本兼容性 .NET Framework 4.6 及以上版本。.NET 5.0 及以上版本。 支持的平台 原生连接支持的平台和 TDengine 客户端驱动支持的平台…...

AI对百度搜索与抖音社区的影响差异?

在AIGC(生成式人工智能)快速发展的背景下,用户获取内容的方式确实变得更加直接和便捷。抖音、小红书等视频内容社区的流量下降速度可能比百度搜索更慢,这一现象可以从以下几个角度分析: 1. 内容形式的差异:…...

《ADVANCING MATHEMATICAL REASONING IN LAN- GUAGE MODELS》全文阅读

《ADVANCING MATHEMATICAL REASONING IN LAN- GUAGE MODELS: THE IMPACT OF PROBLEM-SOLVING DATA, DATA SYNTHESIS METHODS, AND TRAINING STAGES》全文阅读 提升语言模型中的数学推理能力:问题求解数据、数据合成方法及训练阶段的影响 \begin{abstract} 数学推…...

是德科技KEYSIGHT Agilent U2004A功率传感器

是德科技KEYSIGHT Agilent U2004A功率传感器 Keysight U2004A USB功率传感器的特性和规格包括: 频率范围为 9 kHz 至 6 GHz -60 至 20 dBm 的宽动态范围 内部调零功能消除了外部校准 测量速度高达 250 个读数/秒 在 PC 或其他 Agilent 仪器上显示功率测量值 频率…...

Kubernetes(K8S)内部功能总结

Kubernetes(K8S)是云技术的最核心的部分,也是构建是云原生的基石 K8S K8S,是Kubernetes的缩写,是Google开发的容器编排平台,现在由云原生计算基金会(CNCF)进行维护。 K8S&#xff…...

智谱最新模型GLM4是如何练成的

写在前面 这篇博客将基于《ChatGLM: A Family of Large Language Models from GLM-130B to GLM-4 All Tools》,深入剖析 GLM-4 系列在**模型架构设计、预训练、后训练(对齐)、以及关键技术创新(如长上下文处理、Agent 能力构建)**等环节的实现逻辑与设计考量,带你全面了…...

类头文件相互包含的问题

1.预编译指令: #ifndef CLASS_A_ #define CLASS_A_#include CLASS_B.h#endif 2.#pragma once 3.将类A中声明类B,并类中声明类B的指针,在类中的实现文件中包含类B的头文件。在类B中包含类A的头文件 a.h:class Bclass A {public:private:B*…...

云原生周刊:K8s 中的 GPU 共享

开源项目推荐 A2A Google 的 Agent2Agent(A2A)协议是一个开源标准,旨在促进不同框架和供应商构建的 AI 代理之间的互操作性。它允许代理通过统一的协议安全地交换信息、协同执行任务,并在多种企业平台和云环境中无缝协作。 A2A…...

(五)机器学习---决策树和随机森林

在分类问题中还有一个常用算法:就是决策树。本文将会对决策树和随机森林进行介绍。 目录 一.决策树的基本原理 (1)决策树 (2)决策树的构建过程 (3)决策树特征选择 (4&#xff0…...

DeepReaserch写的文献综述示例分享

目录 DeepReaserch提供的文献综述: 人工智能在医疗影像诊断中的研究进展综述(2015–2025) 引言 1 近十年研究进展回顾 1.1 深度学习崛起阶段(2015–2017年) 1.2 方法完善与临床初探(2018–2020年&…...

Token安全存储的几种方式

文章目录 1. EncryptedSharedPreferences示例代码 2. SQLCipher示例代码 3.使用 Android Keystore加密后存储示例代码1. 生成密钥对2. 使用 KeystoreManager 代码说明安全性建议加密后的几种存储方式1. 加密后采用 SharedPreferences存储2. 加密后采用SQLite数据库存储1. Token…...

阶段性使用总结-通义灵码

序言 前段时间用通义灵码,参加了下数字中国闽江流域的比赛。https://www.dcic-china.com/competitions/10173 最后成绩一般般,106名,大概有2000多人参加这题目,估计有一堆小号。 按照下面这个思路建模的,迭代了大概15…...

SpringBoot 与 Vue3 实现前后端互联全解析

在当前的互联网时代,前后端分离架构已经成为构建高效、可维护且易于扩展应用系统的主流方式。本文将详细介绍如何利用 SpringBoot 与 Vue3 构建一个前后端分离的项目,展示两者如何通过 RESTful API 实现无缝通信,让读者了解从环境搭建、代码实…...

Flutter 图标和按钮组件

引言 在 Flutter 应用开发中,图标和按钮是构建用户界面不可或缺的元素。图标能够以直观的图形方式传达信息,增强应用的视觉吸引力;而按钮则是用户与应用进行交互的重要途径。本文将详细介绍 Flutter 中图标和按钮组件的使用,涵盖…...

大模型平台Dify工作流高效调用Ragflow知识库,解决其原生知识库解析和检索能力不足的问题

Dify调用Ragflow知识库的详细步骤,安装详细部署在我之前文章 多图超详细:Docker安装知识库AI客服RAGFlow的详细步骤、使用教程及注意事项:。超详细:Dify大语言模型工作流开发平台的安装与使用,deepseek知识库客服等。…...

数据库的基本原则

数据库的核心原则 原子性与持久性:原子性(Atomicity)确保一个事务中的所有操作要么全部完成,要么完全不执行,不会出现部分完成的情况。持久性(Durability)则保证一旦事务提交成功,即…...

项目集管理汇报报告 (范本)

该文档适用于企业管理层、项目经理、项目团队成员以及对项目集管理感兴趣的人员。它对企业项目管理至关重要,通过全面分析 揭示了如目标达成率低、数据缺失严重、成本进度管控有风险等关键问题,为管理层提供决策依据,助力其了解项目整体状况&…...

阿里云 MSE Nacos 发布全新“安全防护”模块,简化安全配置,提升数据保护

作者:张文浩 阿里云在其微服务引擎(MSE)注册配置中心 Nacos 上正式推出全新“安全防护”功能模块,旨在帮助企业用户有效管理安全状态和降低开启安全相关功能的学习成本,提升微服务架构的安全性。首期推出的“安全防护…...

Pydantic v2 的使用

一、前言 Pydantic 是一个 Python 数据验证 和 设置管理 库,使用 Python 类型 注解。具有以下特点: 1.1 核心功能 数据验证:自动验证数据类型和约束条件类型转换:自动将输入数据转换为声明类型Schema 生成:自动生成…...

从零开始学A2A二 : A2A 协议的技术架构与实现

A2A 协议的技术架构与实现 学习目标 技术架构掌握 深入理解 A2A 协议的分层架构设计掌握各层次的功能和职责理解协议的工作原理和数据流 实现能力培养 能够搭建基本的 A2A 服务端掌握客户端开发方法实现智能体间的有效通信 架构设计理解 理解与 MCP 的本质区别掌握多智能体协…...

设计模式每日硬核训练 Day 12:装饰器模式(Decorator Pattern)完整讲解与实战应用

🔄 回顾 Day 11:适配器模式小结 在 Day 11 中,我们学习了适配器模式(Adapter Pattern): 用于将“不兼容”的接口适配为目标接口,解决新旧系统之间的桥接问题。强调“接口兼容、外部桥接”&…...

[CMake] CMakePresets.json简单使用

解决的问题 CMakePresets.json是为了解决在使用命令行编译使用CMake的项目时&#xff0c;可能会十分麻烦。如类似的参数-DCMAKE_BUILD_TYPEDebug所以有了CMakePresets.json来配置configure和build时的命令&#xff0c;然后在使用时 cmake --preset<configure-preset-name&…...

智能办公如何创建e10流程

智能办公如何创建e10流程 配置e10流程前&#xff0c;您要做的事情&#xff1a; 1、进入e10管理后台&#xff0c;创建应用&#xff0c;开放接口权限&#xff1b;2、进入e10管理后台&#xff0c;配置千里聆套件&#xff0c;配置同步人员&#xff1b;3、进入千里聆系统&#xff…...

Mac关闭sip方法

Mac关闭sip方法 导航 文章目录 Mac关闭sip方法导航完整操作流程图详细步骤 完整操作流程图 这东西是我在网上搬运下来的&#xff0c;但是我在为业务实操过程中&#xff0c;根据实操情况还是有新的注意点的 详细步骤 1.在「关于本机」-「系统报告」-「软件」;查看SIP是否开启…...

Flutter 播放利器:`media_kit` 的详细介绍与使用指南

在 Flutter 项目中实现音视频播放&#xff0c;开发者过去主要依赖如 video_player、just_audio 等第三方库&#xff0c;但这些库或多或少存在一些局限性&#xff0c;比如平台兼容性差、定制能力不足、播放格式有限等问题。 而 media_kit 是近年崛起的一款全平台音视频播放解决…...

GEO优化中的关键底座:知识图谱如何提升生成式AI的准确性与实时性?

今天&#xff0c;我将与大家分享如何通过GEO优化&#xff08;生成式人工智能优化&#xff09;和动态知识图谱&#xff0c;帮助企业提升智能化水平并实现高效的业务运营。首先&#xff0c;GEO优化利用生成式AI为企业提供内容生成、客服自动化和智能销售等服务&#xff0c;而知识…...

案例 - 登录认证:保障系统安全访问的实现

摘要&#xff1a;本文介绍了为Tlias智能学习辅助系统添加登录认证功能的过程&#xff0c;涵盖从需求分析、接口文档设计&#xff0c;到思路分析、功能开发以及最后的测试等多个关键环节&#xff0c;旨在实现只有通过登录认证的用户才能安全访问后台系统功能的目标。 关键词&am…...

Node.js Session 原理简单介绍 + 示例代码

目录 ✅ Session 原理简要说明 &#x1f9e9; 示例项目 - 使用 Node.js Express 实现简单 Session 登录 &#x1f4c1; 文件结构 &#x1f539; server.js (JavaScript) &#x1f538; index.html (HTML) ▶️ 程序运行步骤 ✅ 程序运行效果 &#x1f3af; 总结 在 We…...

C# 类型、存储和变量(C#程序是一组类型声明)

本章内容 C#程序是一组类型声明 类型是一种模板 实例化类型 数据成员和函数成员 预定义类型 用户定义类型 栈和堆 值类型和引用类型 变量 静态类型和dynamic关键字 可空类型 C#程序是一组类型声明 如果广泛地描述C和C程序源代码的特征&#xff0c;可以说C程序是一组函数和数据…...

复变函数摘记3

复变函数摘记3 5. 留数5.1 可去奇点、极点、本性奇点5.2 零点与极点的关系5.3 在无穷远点处的情形5.4 留数 5. 留数 \quad 如果函数 f ( z ) f(z) f(z) 在 z 0 z_0 z0​ 及 z 0 z_0 z0​ 的邻域内处处可导&#xff0c;那么称 f ( z ) f(z) f(z) 在点 z 0 z_0 z0​ 处解析。…...

深入定制 QSlider——实现精准点击跳转与拖拽区分

在使用 Qt 编写界面应用时,QSlider 是一个常用的滑动控件。但你可能会注意到,默认情况下点击滑轨(groove)区域时,滑块并不会直接跳到鼠标点击的位置,而是按照内部的分页步进(page step)行为响应。此外,垂直 Slider 在点击最底部时还存在 releaseEvent(或 sliderRelea…...

Summary

一、数据结构 1.1 哈希 主要是HashMap和HashSet&#xff1b;其中HashSet底层是一个HashMap属性。 // 获取HashMap元素,HashSet均不支持 map.keySet (); // Set<k> map.values (; // Collection<V> map.entrySet();//Set<Map.Entry<K,V>> for (Map.E…...

MCP Server 开发实战 | 大模型无缝对接 Grafana

前言 随着大模型的飞速发展&#xff0c;越来越多的 AI 创新颠覆了过往很多产品的使用体验。但你是否曾想过&#xff0c;在向大型语言模型提问时&#xff0c;它能否根据你的需求精准返回系统中的对应数据&#xff1f;例如&#xff0c;当用户查询 Grafana 服务时&#xff0c;模型…...

【ROS2】行为树 BehaviorTree(六):各种各样的节点

1、装饰器节点 Decorators 1)否操作 Inverter 如果子项失败则返回 SUCCESS,如果子项成功则返回 FAILURE。 如果子节点返回 RUNNING,则该节点也返回 RUNNING。 2)强制成功 ForceSuccess 如果子节点返回 RUNNING,则该节点也返回 RUNNING。 否则,它总是返回 SUCCESS。 3)…...

Docker Swarm 集群使用指南概述

概述 对于简单轻量级集群管理&#xff0c;利用 Docker Swarm 就够用了&#xff0c;适合中小型应用程序的容器编排。如果是比较重的中心化集群管理方案或需要更复杂的功能&#xff0c;可以考虑使用 Kubernetes Helm Consul 等更强大的容器编排工具。 Docker Swarm 1. Docke…...

【行业树选择器组件:基于Vue3与Element Plus的高性能树形选择组件优化与重构】

行业树选择器组件&#xff1a;基于Vue3与Element Plus的高性能树形选择组件优化与重构 组件概述与背景 行业树选择器是一个基于Element Plus的ElTreeSelect封装的业务组件&#xff0c;主要应用于能源管理系统中&#xff0c;用于展示和选择国标行业分类体系的四级层级结构。该…...

PasteForm框架开发之Entity多级嵌套的表单的实现

你相信么,使用PasteForm框架开发&#xff0c;管理端居然不要写代码&#xff01;&#xff01;&#xff01; 一起来看看PasteForm是否支持多级表模式(外表) 需求假设 假如有这么一个需求&#xff0c;就是订单表&#xff0c;包含了多级的信息&#xff0c;比如这个订单包含了哪些…...

Anaconda笔记

下载Anaconda 清华源 官方源 本文下载&#xff1a;Anaconda3-2024.10-1-Windows-x86_64.exe 建议不要安装到C盘&#xff0c;我的安装到D&#xff1a;Anaconda目录 设置环境变量 WinR cmd命令行输入&#xff1a; conda --version&#xff1a;可以查看到版本信息安装成功c…...

Linux——共享内存

目录 一、共享内存概念 二、共享内存的一些函数 2.1 shmget 创建共享内存 2.2 shmat 访问共享内存 2.3 shmdt 解除共享内存的映射 2.4 shnctl 删除共享内存段 三、共享内存 3.1 创建测试进程 3.2 使用循环测试 ​编辑 3.3 共享内存写入程序 3.4 带有信号量的共享内…...

计算机系统---烤机(性能测评)

计算机烤机 一、烤机的定义与核心目的 烤机&#xff08;Burn-in Test&#xff09; 是通过对计算机硬件施加持续高负载&#xff0c;模拟极端运行环境&#xff0c;以验证硬件稳定性、性能极限、散热能力及潜在缺陷的测试方法。核心目标包括&#xff1a; 硬件稳定性验证&#x…...