Netflix Conductor整合Apache Seata实现支持分布式事务的服务编排方案

一、背景

Netflix Conductor是Netflix开源的一个微服务编排引擎。它旨在简化和自动化微服务架构中复杂的业务流程和工作流处理。Conductor允许开发人员使用声明性的方式定义工作流,将多个服务和任务组合成一个完整的业务流程。它提供了一个用户友好的UI界面,可以可视化地创建和编辑工作流。同时,Conductor还提供了一组强大的API,可以通过编程方式创建和管理工作流。

由于Netflix Conductor本身并不直接支持分布式事务,因此无法满足对可靠性和事务一致性要求较高的业务场景。

Apache Seata是阿里巴巴开源的分布式事务解决方案。在Spring cloud,Dubbo等微服务框架上可以直接使用。Conductor不在官方支持列表中,因此需要设计一套Seata与Conductor的集成的解决方案。

二、Seata 基本原理

TC (Transaction Coordinator) - 事务协调者

维护全局和分支事务的状态,驱动全局事务提交或回滚。

TM (Transaction Manager) - 事务管理器

定义全局事务的范围:开始全局事务、提交或回滚全局事务。

RM (Resource Manager) - 资源管理器

管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

在一个完整的Seata事务中,有以下关键步骤:

  1. 在全局事务开始时开启一个全局事务;
  2. 全局事务XID在事务参与者中传递;
  3. 全局事务结束时提交/回滚事务。

三、事务管理器TM

在 Spring 项目中可以在需要全局事务的方法上增加@GlobalTransaction。该方法可以称为TM。它在方法开始前开启全局事务,并把xid加到上下文中传递 ,在方法执行完成后(或异常结束)提交或回滚全局事务。

在 Conductor 中,由于 worker 是独立执行的没有一个固定的顺序,也不存在一个统一的方法内被一起执行(任务驱动),因此无法简单通过增加@GlobalTransaction来开始全局事务、提交或回滚全局事务。因此需要显式地手动在 Conductor 中通过 API 方式完成 TM角色所需要做的事。

开启全局事务

在 Conductor 开始一个工作流时增加以下代码

  public String startWorkflow(         
      GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();
        try {
            //开启全局事务
            tx.begin(timeout, name);
            //do something         
            // 获取 XID 
            String xid = RootContext.getXID();
            //通过 InputData 传递 XID 到 worker
            taskModle.setInputData(RootContext.KEY_XID,xid)
          }
  }

提交全局事务

在 Conductor 结束一个工作流时增加以下代码

if (outcome.isComplete) {
    GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();
    //提交事务
tx.commit();
}

回滚全局事务

所有 worker 在发生异常时需要回滚事务则需要 catch 异常并设置状态为FAILED

TaskResult result = new TaskResult(task);
result.setStatus(TaskResult.Status.FAILED);
此时会引发 conductor 异常处理,并在 conductor 异常处理时增加以下代码
public boolean decide(String workflowId) {
try{
  //do something
} catch (TerminateWorkflowException twe) {
    LOGGER.info("Execution terminated of workflow: {}", workflowId, twe);
    terminate(workflow, twe);
    GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();
    //回滚事务
     tx.rollback();
     return true;
}

四、事务XID传递

一、在 conductor 开始全局事务或设置下一个任务时,会把 XID 设置到 task 的 InputData 中,由此把 XID 传到 worker

// 获取 XID 
String xid = RootContext.getXID();
//通过 InputData 传递 XID 到 worker
taskModle.setInputData(RootContext.KEY_XID,xid)
二、在 worker 中通过 InputData 获取到 XID 并设置到上下文中
public class someWorker  implements Worker {
@Override
public TaskResult execute(Task task) {
   String xid = (String) task.getInputData().get(RootContext.KEY_XID);
   // 绑定 XID 
   RootContext.bind(xid);
}
}
三、woker 输出参数 OutputData 中设置 XID 回传到 conductor 并设置到上下文中 worker
public class someWorker  implements Worker {
    public TaskResult execute(Task task) {
        @Override
        public TaskResult execute(Task task) {
            result.setOutputData(new HashMap<String,Object>(){{
                put(RootContext.KEY_XID,xid);
            }});
    }
}
conductor
public void updateTask(TaskResult taskResult) {
 String xid = (String) taskResult.getOutputData().get(RootContext.KEY_XID);
   // 绑定 XID 
   RootContext.bind(xid);

}
经过以上3个步骤,即可实现全局事务XID在Netflix Conductor参与者中传递,最终实现分布式事务一致性,提升系统的可靠性和稳定性。


作者介绍:

道一云,成立于2004年,是中国低代码领域的领导厂商、腾讯战略投资企业、腾讯生态核心合作伙伴。拥有自主知识产权管理软件产品百余项,涵盖数字化应用构建低代码平台-七巧、全场景智能业务分析BI-七析、千人千面、数智化办公企业级门户-七星以及30多款开箱即用的场景应用。

欢迎关注:

官网:道一云七巧 - 可视化、智能化、数字化应用构建

免费体验:道一云产品免费试用

公众号:道一云低代码(do1info)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

echarts- 热力图, k线图,雷达图

热力图 热力图可以看成是一种矩形的散点图。 热力图的矩形受itemStyle的影响。 通常配合visualmap组件来根据值的大小做颜色的变化。 热力图主要通过颜色去表现数值的大小&#xff0c;必须要配合 visualMap 组件使用。 visualMap:视觉映射组件 let options {tooltip: {},xAx…

车辆相关识别API优化您的车辆系统

车辆相关识别API是开发者们所需的重要工具&#xff0c;它们基于先进的计算机视觉和深度学习技术&#xff0c;提供了强大的车辆识别和分类能力。这些API能够从图像或视频中快速准确地识别和提取车辆的关键信息&#xff0c;如车辆型号、品牌、颜色等。对于开发者而言&#xff0c;…

python-docx 在word中指定位置插入图片或表格

docx库add_picture()方法不支持对图片位置的设置 1、新建一个1行3列的表格&#xff0c;在中间的一列中插入图片 from docx import Document from docx.shared import Pt from docx.oxml.shared import OxmlElement from docx.enum.text import WD_ALIGN_PARAGRAPHdef add_cen…

Jenkins安装 :Aws EC2下Docker镜像安装

1 安装docker # 安装docker $ sudo yum install -y docker# 启动docker daemon $ sudo systemctl start docker# 用户加入docker组 $ sudo usermod -aG docker username 2 docker安装jenkins $ docker pull jenkins/jenkins:lts# 安装成功 $ docker images REPOSITORY …

动手学深度学习22 池化层

动手学深度学习22 池化层 1. 池化层2. 实现3. QA 课本&#xff1a; https://zh-v2.d2l.ai/chapter_convolutional-neural-networks/pooling.html 视频&#xff1a; https://www.bilibili.com/video/BV1EV411j7nX/?spm_id_fromautoNext&vd_sourceeb04c9a33e87ceba9c9a2e5f0…

第三方软件测试机构进行代码审计需要哪些专业的知识?

代码审计 进行代码审计需要专业的知识&#xff0c;包括编程语言、操作系统、数据库、网络知识以及安全知识等。 1.编程语言知识是进行代码审计的基础&#xff0c;因为你需要理解代码的语法和结构。对于不同的应用程序&#xff0c;你需要了解其所使用的编程语言的特点和语法规…

IO多路复用模型原理

在linux没有实现epoll事件驱动机制之前,常规的手段是选择select和poll等IO多路复用的方法来实现并发服务程序。但是在大数据、高并发、集群情况下,select和poll的性能瓶颈就出现了,于是epoll就诞生了 Select select函数监视的文件描述符分三类:writefds、readfds和exceptf…

Windows64位操作系统安装汇编语言环境

1、下载好MASM工具, 并存放在指定路径 2、再安装一个DOSBox 3、打开DOSBox, 并使用 mount 将刚刚存放MASM的路径挂在到C盘&#xff0c;然后进入C盘就可以使用 MASM的命令工具了。 例如&#xff1a; mount c G:\install\study\MASM C:但是DOSBox默认打开的窗口是很小的&…

openwrt 官方版 安装配置 AdGuard Home + smartdns 告别广告烦扰 教程 软路由实测 系列五

1 安装 adguard home opkg update opkg install adguardhome #启动 /etc/init.d/adguardhome start /etc/init.d/adguardhome enable #查看 rootOpenWrt:~# ps| grep AdGuardHome5101 root 1233m S /usr/bin/AdGuardHome -c /etc/adguardhome.yaml -w /var/adguardhom…

深入解读力扣154题:寻找旋转排序数组中的最小值 II(多种方法及详细ASCII图解)

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

深入了解Nginx(一):Nginx核心原理

一、Nginx核心原理 本节为大家介绍Nginx的核心原理,包含Reactor模型、Nginx的模块化设计、Nginx的请求处理阶段. &#xff08;本文源自微博客,且已获得授权&#xff09; 1.1、Reactor模型 Nginx对高并发IO的处理使用了Reactor事件驱动模型。Reactor模型的基本组件包含时间收集…

vue实现页面渲染时候执行某需求

1. 前言 在之前的项目中&#xff0c;需要实现一个监控token是否过期从而动态刷新token的功能&#xff0c;然而在登录成功后创建的监控器会在浏览器刷新点击或者是通过导航栏输入网址时销毁... 2. 试错 前前后后始过很多方法&#xff0c;在这里就记录一下也许也能为各位读者排…

JWT的生成

引依赖 生成JWT JWT校验 注意

从alpine构建预装vcpkg的docker image用于gitea actions CI

动机 想要构建一个基于vcpkg的交叉编译容器平台用于cpp项目的CI(自动集成),此处仅提供最基础的image,amd64的机子上构建完成后大小为533兆(着实不小😓),各位看官可以在此基础上自行构建需要的版本。 hello world效果展示 corss_compiler.dockerfile FROM alpine:la…

数据结构篇之二叉树(binary tree)的介绍和应用

欢迎光临&#xff1a; 男神 目录 一树的介绍和表示&#xff1a; 二二叉树的介绍及性质&#xff1a; 三堆的介绍及创建&#xff1a; 1堆的创建&#xff1a; 2堆的应用&#xff1a; 四二叉树的创建&#xff1a; ①// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二…

2024年中国电机工程学会杯数学建模思路 - 案例:最短时间生产计划安排

# 前言 2024电工杯(中国电机工程学会杯)数学建模思路解析 最新思路更新(看最新发布的文章即可): https://blog.csdn.net/dc_sinor/article/details/138726153 最短时间生产计划模型 该模型出现在好几个竞赛赛题上&#xff0c;预测2022今年国赛也会与该模型相关。 1 模型描…

Flink常见面试题总结

文章目录 1. 简单介绍一下Flink2. Flink 的运行必须依赖Hadoop组件吗?3. Flink 和 Spark Streaming 的区别&#xff1f;4. Flink集群角色5. Flink核心概念5.1 并行度5.2 算子链&#xff08;Operator Chain&#xff09;5.3 任务槽&#xff08;Task Slots&#xff09;5.4 任务槽…

【PCI】PCIe高级错误上报能力AER(十二)

本文参考PCIe协议 5.0&#xff1a;https://download.csdn.net/download/zz2633105/89204842 本文参考intel IP用户指南&#xff1a;https://www.intel.cn/content/www/cn/zh/docs/programmable/683501/23-2-10-0-0/debugging-data-transfer-and-performance-25123.html 本文参…

技术前沿:三品PLM系统引领工程变更管理新趋势

引言 在当今快速变化的制造行业&#xff0c;产品生命周期管理&#xff08;PLM&#xff09;系统已成为企业不可或缺的工具之一。PLM系统不仅帮助企业优化产品开发流程&#xff0c;还对工程变更管理&#xff08;ECM&#xff09;起着至关重要的作用。本文将探讨PLM系统在工程变更…

机器学习之词袋模型

目录 1 词袋模型基本概念 2 词袋模型的表示方法 2.1 三大方法 1 独热表示法&#xff08;One-Hot&#xff09; 2 词频表示法&#xff08;Term Frequency, TF&#xff09; 3 词频-逆文档频率表示法&#xff08;TF-IDF&#xff09; 2.2 例子 1 词袋模型基本概念 词袋模型&a…