Seata-golang grpc 通信版本与 Transaction Mesh

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 随着云原生时代的到来,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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6月前
|
SQL Oracle 关系型数据库
seata版本问题之码云拉取代码异常如何解决
Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题。
278 5
|
6月前
|
存储 Java Nacos
Seata常见问题之springboot 2.3.7 和高版本 seata 2.0.0,1.6.1不兼容如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
847 0
|
2月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
104 3
Golang语言之gRPC程序设计示例
|
1月前
|
前端开发 Java API
Apache Seata(incubating) 首个版本重磅发布!
2.1.0 是 Seata 进入 Apache 基金会的第一个 Release Version。此次发布将 io.seata 包名更改为 org.apache.seata。除了按原有的 Roadmap 技术演进外,2.1.0 进行了大量兼容性工作,实现了 API、数据和协议的兼容。用户无需修改原有的 API 和配置,即可实现到 Apache 版本的平滑升级。
108 12
Apache Seata(incubating) 首个版本重磅发布!
|
3月前
|
网络协议 Go
|
6月前
|
自然语言处理 Java 编译器
【Go语言专栏】Go语言中的gRPC框架应用
【4月更文挑战第30天】Go语言的gRPC是一个高性能RPC框架,基于HTTP/2和Protocol Buffers,支持多语言。其特点包括高性能、强类型和双向流。在Go中使用gRPC,需定义接口(如hello.proto),生成Go代码,实现服务器端(注册服务到gRPC服务器)和客户端(调用服务)。此外,gRPC还提供流、错误处理和拦截器等高级特性,适用于复杂通信场景。
83 1
|
6月前
|
存储 Java 关系型数据库
Seata 2.x 首个版本正式发布,支持 Raft 集群模式
Seata 2.x 首个版本正式发布,支持 Raft 集群模式
372 11
|
6月前
|
Java Go API
玩转gRPC—Go使用gRPC通信实战
玩转gRPC—Go使用gRPC通信实战
93 1
|
6月前
|
Java Go Rust
Golang每日一练(leetDay0095) 第一个错误的版本、完全平方数
Golang每日一练(leetDay0095) 第一个错误的版本、完全平方数
45 0
Golang每日一练(leetDay0095) 第一个错误的版本、完全平方数
|
6月前
|
Cloud Native 安全 Go
Go语言与gRPC的完美结合
Go语言与gRPC的完美结合
216 0
Go语言与gRPC的完美结合
下一篇
无影云桌面