Seata-golang grpc 通信版本与 Transaction Mesh

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 随着云原生时代的到来,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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
12小时前
|
SQL Oracle 关系型数据库
seata版本问题之码云拉取代码异常如何解决
Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题。
230 1
|
12小时前
|
存储 Java Nacos
Seata常见问题之springboot 2.3.7 和高版本 seata 2.0.0,1.6.1不兼容如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
159 0
|
12小时前
|
自然语言处理 Java 编译器
【Go语言专栏】Go语言中的gRPC框架应用
【4月更文挑战第30天】Go语言的gRPC是一个高性能RPC框架,基于HTTP/2和Protocol Buffers,支持多语言。其特点包括高性能、强类型和双向流。在Go中使用gRPC,需定义接口(如hello.proto),生成Go代码,实现服务器端(注册服务到gRPC服务器)和客户端(调用服务)。此外,gRPC还提供流、错误处理和拦截器等高级特性,适用于复杂通信场景。
|
12小时前
|
Java Go API
玩转gRPC—Go使用gRPC通信实战
玩转gRPC—Go使用gRPC通信实战
34 1
|
12小时前
|
Java Go Rust
Golang每日一练(leetDay0095) 第一个错误的版本、完全平方数
Golang每日一练(leetDay0095) 第一个错误的版本、完全平方数
24 0
Golang每日一练(leetDay0095) 第一个错误的版本、完全平方数
|
12小时前
|
Cloud Native 安全 Go
Go语言与gRPC的完美结合
Go语言与gRPC的完美结合
67 0
Go语言与gRPC的完美结合
|
12小时前
|
Go
golang安装protoc和gRPC步骤
golang安装protoc和gRPC步骤
62 0
|
12小时前
|
Go
golang力扣leetcode 278.第一个错误的版本
golang力扣leetcode 278.第一个错误的版本
20 0
|
12小时前
|
Java Go
浅谈Golang 不同版本的defer
浅谈Golang 不同版本的defer
29 1
|
12小时前
|
存储 Java 关系型数据库
Seata 2.x 首个版本正式发布,支持 Raft 集群模式
Seata 2.x 首个版本正式发布,支持 Raft 集群模式

热门文章

最新文章