那些用Go实现的分布式事务框架

简介: 那些用Go实现的分布式事务框架

Seata简介


Seata是由阿里开源的分布式事务服务,目前为用户提供了AT、TCC、SAGA、XA的事务模式,整体采用的是两阶段提交协议。Go版的seata-golang 目前好像只实现了mysql的AT、TCC模式,作者现在不咋更新了。

Seata 有几个核心角色

  • TC(Transaction Coordinator) -事务协调者。(维护全局和分支事务的状态,驱动全局事务提交或回滚)
  • TM(Transaction Manager)-事务管理器。(定义全局事务的范围:开始全局事务、提交或回滚全局事务。)
  • RM(Resource Manager)-资源管理器。(管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚)

当然这样看,可能还不是很理解,我拿一张官网的图加以解释


1668514011631.jpg


从上图中可以看出,这三个角色所负责的工作如下

TC

  • 维护全局和分支事务状态,需要进行存储。
  • 当一个分布式事务处理结束,需要通知到每个RM是commit还是rollback

TM

  • 向TC请求开启一个分布式事务,得到一个全局唯一的分布式id。
  • 根据每个参与分布式事务的RM一阶段的反馈,决定二阶段向TC请求此次分布式事务是commit还是rollback(绝大部分场景下,一阶段任一RM失败,本次分布式事务失败)

RM

说的白一点就是管理参与分布式事务的各个服务(比如经典下单场景中涉及到的:订单服务、库存服务、营销服务等)

ps:个人感觉,这里的RM有点类似微服务中的中间处理层(专业术语他们管这叫bff->backend for fronted)。

  • 一阶段 prepare 行为(主动):每个RM调用 自定义 的 prepare 逻辑。
  • 二阶段 commit 行为(被动触发):如果本次分布式事务第一阶段全部RM成功,TC处理完自身状态变更后,调用各个RM自定义 的 commit 逻辑。(一阶段RM全部成功)
  • 二阶段 rollback 行为(被动触发):如果本次分布式事务第一阶段任一RM失败,TC处理完自身状态变更后,调用各个RM自定义 的 rollback 逻辑。(一阶段任意RM失败)


好了。下面可以看看seata-golang 实现的一些细节了,seata-golang 底层采用gRPC进行通信。


seata-golang


我们先看RM部分结构。


1668514031704.jpg


至于managers,保存支持的各大事务模式实现(TCC、XA等),每个模式只需要实现此接口即可


1668514045175.jpg


再看TC部分结构(去除部分字段)


1668514057304.jpg


TC对数据的存储目前支持mysql和pgsql,即只要实现SessionManager接口,然后注入到SessionHolder的manager。


介绍完这两个基本结构,还记得我们上面说过他们之间的关系吗?


二阶段TC会根据当前事务状态去通知RM是commit还是rollback。


在初始化ResourceManager 的时候,


1668514073133.jpg


我们看到最终会调用TC一个 grpc 接口branchCommunicate。


1668514084360.jpg


对应到服务端


1668514094386.jpg


我们知道gRPC有四种基础的通信模式。

  • 一元模式(Unary RPC)
  • 服务器端流RPC(Server Sreaming RPC)
  • 客户端流RPC(Client Streaming RPC)
  • 双向流RPC(Bidirectional Streaming RPC)

想要流的形式也很简单,只需要在proto方法定义中将对应的请求|响应 参数前加上stream标记,那么这个接口就是流式传送了。至于是哪种流,取决于你把stream加在哪边,如果请求和响应都加,那么就是双向流了。


客户端和服务端都可以通过stream.Send 发送请求,通过stream.Recv 接收数据。

当RM调用BranchCommunicate时


1668514109258.jpg


最终处理分支事务调用manager.BranchCommit


1668514123302.jpg


相应的,当TC被RM调用BranchCommunicate 后,


1668514134351.jpg


上面要发送给RM 通知commit 或者 rollback 数据是咋么来的呢?


当TC要通知RM进行分支commit 的时候,


1668514150175.jpg


最后一个就是TM,没啥理解难度。


1668514161451.jpg


其实seat-golang还有别的可以提一提的。


比如说,它里面通过go反射实现的动态代理功能(虽然我觉得完全没必要?),我懒得写了。


这篇文章再写就更长了,不继续写dtm了,感兴趣的留个言,我看看要不要写一篇dtm。


参考


相关文章
|
5月前
|
人工智能 测试技术 Go
Go 语言的主流框架
本文全面解析了 Go 语言主流技术生态,涵盖 Web 框架、微服务、数据库工具、测试与部署等多个领域。重点介绍了 Gin、Echo、Beego 等高性能框架,以及 gRPC-Go、Go-Micro 等微服务组件。同时分析了 GORM、Ent 等 ORM 工具与测试部署方案,并结合场景提供选型建议,助力开发者构建高效稳定的 Go 应用。
1399 0
|
3月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
309 86
|
2月前
|
JavaScript 前端开发 Java
【GoWails】Go做桌面应用开发?本篇文章带你上手Wails框架!一步步带你玩明白前后端双端的数据绑定!
wails是一个可以让你使用Go和Web技术编写桌面应用的项目 可以将它看作Go的快并且轻量级的Electron替代品。可以使用Go的功能,并结合现代化UI完成桌面应用程序的开发
561 4
|
2月前
|
开发框架 前端开发 Go
【GoGin】(0)基于Go的WEB开发框架,GO Gin是什么?怎么启动?本文给你答案
Gin:Go语言编写的Web框架,以更好的性能实现类似Martini框架的APInet/http、Beego:开源的高性能Go语言Web框架、Iris:最快的Go语言Web框架,完备的MVC支持。
389 1
|
9月前
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
962 0
分布式爬虫框架Scrapy-Redis实战指南
|
6月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
6月前
|
开发框架 安全 前端开发
Go Web开发框架实践:模板渲染与静态资源服务
Gin 是一个功能强大的 Go Web 框架,不仅适用于构建 API 服务,还支持 HTML 模板渲染和静态资源托管。它可以帮助开发者快速搭建中小型网站,并提供灵活的模板语法、自定义函数、静态文件映射等功能,同时兼容 Go 的 html/template 引擎,具备高效且安全的页面渲染能力。
|
6月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
7月前
|
监控 Java 调度
SpringBoot中@Scheduled和Quartz的区别是什么?分布式定时任务框架选型实战
本文对比分析了SpringBoot中的`@Scheduled`与Quartz定时任务框架。`@Scheduled`轻量易用,适合单机简单场景,但存在多实例重复执行、无持久化等缺陷;Quartz功能强大,支持分布式调度、任务持久化、动态调整和失败重试,适用于复杂企业级需求。文章通过特性对比、代码示例及常见问题解答,帮助开发者理解两者差异,合理选择方案。记住口诀:单机简单用注解,多节点上Quartz;若是任务要可靠,持久化配置不能少。
703 4
|
10月前
|
开发框架 前端开发 Go
eino — 基于go语言的大模型应用开发框架(二)
本文介绍了如何使用Eino框架实现一个基本的LLM(大语言模型)应用。Eino中的`ChatModel`接口提供了与不同大模型服务(如OpenAI、Ollama等)交互的统一方式,支持生成完整响应、流式响应和绑定工具等功能。`Generate`方法用于生成完整的模型响应,`Stream`方法以流式方式返回结果,`BindTools`方法为模型绑定工具。此外,还介绍了通过`Option`模式配置模型参数及模板功能,支持基于前端和用户自定义的角色及Prompt。目前主要聚焦于`ChatModel`的`Generate`方法,后续将继续深入学习。
1359 7