Seata-golang grpc 通信版本与 Transaction Mesh

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
注册配置 MSE Nacos/ZooKeeper,182元/月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 随着云原生时代的到来,kubernetes 被广泛地使用,seata-golang v1 版本的设计并不完全符合云原生的理念。所以最近作者又将 Seata-golang 的 TCC 模式集成到了 Mosn 中,尝试去实现Transaction Mesh。

作者 |  刘晓敏 郝洪范


分布式事务简介


在这里简单介绍下分布式事务的原理:


  • 事务的发起者(TM)要向事务协调器(TC)发起开启全局事务的请求
  • 在业务执行完毕后,事务的发起者(TM)向事务协调器(TC)发起全局事务提交或者全局事务回滚
  • 在全局事务开启后,事务的参与者(RM)要向事务协调器(TC)注册分支事务
  • RM 本地业务执行完毕后,要向事务协调器(TC)报告分支事务的执行状态,即本地事务执行成功还是失败
  • 事务协调器(TC)在收到全局提交或者全局回滚的请求后,会通知执行成功的事务参与者(RM)执行本地提交或者本地回滚


417.008.jpeg


所以,TM 到 TC 都是发起单向的请求,RM 和 TC 之间的通信是双向的。


seata-golang 历史问题


从 2020 年 4 月 开始正式开源了 seata-golang 分布式事务框架,功能基本对齐 seata(java)。


需要着重强调的是:


  • 为了双向通信,seata-golang 底层网络库使用的是 getty。(核心网络库:
    http://seata.io/zh-cn/blog/seata-golang-communication-mode.html dubbogo )
  • 在 TC 上保存了 client 的连接注册信息,在需要回调时,TC 才能准确地向对应的 client 发起回调请求。
  • 为了 TC 的高可用,client 端需要保存每个 TC 的连接注册信息,以便在其中一个 TC 当机后选择另一个 TC 通信。


这个版本目前已经完全稳定,同时也在积极的改进中,支持了更多的特性,吸引了一些企业用户深度参与其中。


不过随着云原生时代的到来,kubernetes 被广泛的使用,seata-golang v1 版本的设计并不完全符合云原生的理念。


首先,client 需要知道每个 TC 的连接地址,并与每个 TC 保持连接,TC 也将每个 client 的连接信息保存在内部。在 kubernetes 环境下,每个容器重启后由于 ip 地址重新分配,client 要知道 TC 的 IP 地址必须依靠注册中心。

image.gif

其次,RPC 协议采用了自己实现的编码协议,对协议栈的扩展不友好,对接入云原生产品增加了难度。


seata-golang grpc 版本


基于上述原因,我在今年 6 月使用 grpc 将 seata-golang 重构了一个版本。

(v2 版本:https://github.com/opentrx/seata-golang/tree/v2


大概流程如下:

  • client 端将 TC 的在 kubernetes 中的域名和端口配置到 serverAddressing,并将自己在 kubernetes 中的域名和端口配置到 addressing
  • 在 client 端和 TC 用 grpc 进行通信的时候,使用 serverAddressing 去对 TC 进行服务发现
  • TC 在回调 client 端时,通过 addressing 来对 client 进行服务发现。


client 端配置如下:

port: 8083 #分支事务暴露的端口,用于 TC 回调

addressing: aggregation.default.svc:8083 #client 端在 kubernetes 中的域名及端口

serverAddressing: seata.default.svc:8091 #TC 部署在 kubernetes 中的域名及端口


Transaction Mesh


Transaction Mesh 是一个美好的梦想,去年我在将 seata-golang 开源后就一直在思考怎么实现 transaction mesh。其实当时思路已经成型,但由于认识了解 seata-golang 的人比较少,我也担心我在闭门造车,就将这个想法搁置了。


今年 4 月、5 月,有幸得到 GOCN 社区和阿里的支持,在线下和许多开发者进行了面对面的交流,并且 seata-golang 也有了商业用户,通过交流认为 Transaction Mesh 还是有必要去实现的。


所以最近我又将 Seata-golang 的 TCC 模式集成到了 Mosn 中(pr 正在 review:

https://github.com/mosn/mosn/pull/1728 ),下面是 Mosn 集成 TCC 模式的原理图。


图片.gif


之所以选择 Mosn 而不是 Envoy 是因为自从毕业后就很少接触 C++,在 Envoy 上集成有些力不从心。而 Seata-golang 已经定义好和 TC 交互的 grpc 接口描述语言 seata.proto,要在 Envoy 上完成 Transaction Mesh 可以参考 Mosn 的实现,熟悉 C++ 对 Transaction Mesh 感兴趣的朋友,欢迎您来完成这个美好的梦想!


如果你有任何疑问,欢迎钉钉扫码加入交流群【钉钉群号 33069364】:

image.gif

作者简介


刘晓敏 (GitHubID dk-lockdown),目前就职于 h3c 成都分公司,擅长使用 Go/Java 语言,在云原生和微服务相关技术方向均有涉猎,目前专攻分布式事务。


郝洪范 (GitHubID georgehao),dubbogo committer,目前就职于京东,擅长使用 Go/C++ 语言,目前在输出 Go 源码阅读与实战系列教程,擅长微服务相关事宜。


参考资料


http://seata.io/zh-cn/blog/seata-golang-communication-mode.html

https://mp.weixin.qq.com/s/CB6BCai1k2tCJBOWJ9o1_g

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
SQL Oracle 关系型数据库
seata版本问题之码云拉取代码异常如何解决
Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题。
377 82
|
存储 Java Nacos
Seata常见问题之springboot 2.3.7 和高版本 seata 2.0.0,1.6.1不兼容如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
1669 0
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
524 3
Golang语言之gRPC程序设计示例
|
前端开发 Java API
Apache Seata(incubating) 首个版本重磅发布!
2.1.0 是 Seata 进入 Apache 基金会的第一个 Release Version。此次发布将 io.seata 包名更改为 org.apache.seata。除了按原有的 Roadmap 技术演进外,2.1.0 进行了大量兼容性工作,实现了 API、数据和协议的兼容。用户无需修改原有的 API 和配置,即可实现到 Apache 版本的平滑升级。
373 105
Apache Seata(incubating) 首个版本重磅发布!
|
存储 Java 关系型数据库
Seata 2.x 首个版本正式发布,支持 Raft 集群模式
Seata 2.x 首个版本正式发布,支持 Raft 集群模式
704 104
|
网络协议 Go
|
自然语言处理 Java 编译器
【Go语言专栏】Go语言中的gRPC框架应用
【4月更文挑战第30天】Go语言的gRPC是一个高性能RPC框架,基于HTTP/2和Protocol Buffers,支持多语言。其特点包括高性能、强类型和双向流。在Go中使用gRPC,需定义接口(如hello.proto),生成Go代码,实现服务器端(注册服务到gRPC服务器)和客户端(调用服务)。此外,gRPC还提供流、错误处理和拦截器等高级特性,适用于复杂通信场景。
298 1
|
Java Go API
玩转gRPC—Go使用gRPC通信实战
玩转gRPC—Go使用gRPC通信实战
228 1
|
Java Go Rust
Golang每日一练(leetDay0095) 第一个错误的版本、完全平方数
Golang每日一练(leetDay0095) 第一个错误的版本、完全平方数
114 0
Golang每日一练(leetDay0095) 第一个错误的版本、完全平方数
|
Cloud Native 安全 Go
Go语言与gRPC的完美结合
Go语言与gRPC的完美结合
425 0
Go语言与gRPC的完美结合

推荐镜像

更多