成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

那些用 Go 實現的分布式事務框架

開發 后端 分布式
eata是由阿里開源的分布式事務服務,目前為用戶提供了AT、TCC、SAGA、XA的事務模式,整體采用的是兩階段提交協議。Go版的seata-golang 目前好像只實現了mysql的AT、TCC模式,作者現在不咋更新了。

[[439474]]

本文轉載自微信公眾號「RememberGo」,作者吳親庫里 。轉載本文請聯系RememberGo公眾號。

開篇

不知不覺竟然一個月沒更新了,人一旦懶下來只會越來越懶。

最近對分布式事務產生了一些興趣,查閱了一些文章以及論文。這篇文章主要介紹我看的兩個項目,不涉及一些理論知識。

  • 阿里開源版本的Seata,主要看了Go實現的seata-golang(落后java版)
  • 以及前段時間很多公眾號都發的dtm。

Seata簡介

Seata是由阿里開源的分布式事務服務,目前為用戶提供了AT、TCC、SAGA、XA的事務模式,整體采用的是兩階段提交協議。Go版的seata-golang 目前好像只實現了mysql的AT、TCC模式,作者現在不咋更新了。

Seata 有幾個核心角色:

  • TC(Transaction Coordinator) -事務協調者。(維護全局和分支事務的狀態,驅動全局事務提交或回滾)
  • TM(Transaction Manager)-事務管理器。(定義全局事務的范圍:開始全局事務、提交或回滾全局事務。)
  • RM(Resource Manager)-資源管理器。(管理分支事務處理的資源,與TC交談以注冊分支事務和報告分支事務的狀態,并驅動分支事務提交或回滾)

當然這樣看,可能還不是很理解,我拿一張官網的圖加以解釋。

從上圖中可以看出,這三個角色所負責的工作如下,

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部分結構。

至于managers,保存支持的各大事務模式實現(TCC、XA等),每個模式只需要實現此接口即可。

再看TC部分結構(去除部分字段)。

TC對數據的存儲目前支持mysql和pgsql,即只要實現SessionManager接口,然后注入到SessionHolder的manager。

介紹完這兩個基本結構,還記得我們上面說過他們之間的關系嗎?

二階段TC會根據當前事務狀態去通知RM是commit還是rollback。

在初始化ResourceManager 的時候,

我們看到最終會調用TC一個 grpc 接口branchCommunicate。

對應到服務端。

我們知道gRPC有四種基礎的通信模式。

  • 一元模式(Unary RPC)
  • 服務器端流RPC(Server Sreaming RPC)
  • 客戶端流RPC(Client Streaming RPC)
  • 雙向流RPC(Bidirectional Streaming RPC)

想要流的形式也很簡單,只需要在proto方法定義中將對應的請求|響應 參數前加上stream標記,那么這個接口就是流式傳送了。至于是哪種流,取決于你把stream加在哪邊,如果請求和響應都加,那么就是雙向流了。

客戶端和服務端都可以通過stream.Send 發送請求,通過stream.Recv 接收數據。

當RM調用BranchCommunicate時,

最終處理分支事務調用manager.BranchCommit,

相應的,當TC被RM調用BranchCommunicate 后,

上面要發送給RM 通知commit 或者 rollback 數據是咋么來的呢?

當TC要通知RM進行分支commit 的時候,

最后一個就是TM,沒啥理解難度。

其實seat-golang還有別的可以提一提的。

比如說,它里面通過go反射實現的動態代理功能(雖然我覺得完全沒必要?),我懶得寫了。

這篇文章再寫就更長了,不繼續寫dtm了,感興趣的留個言,我看看要不要寫一篇dtm。

參考

https://seata.io/zh-cn/docs/overview/what-is-seata.html

https://github.com/opentrx/seata-golang

 

責任編輯:武曉燕 來源: RememberGo
相關推薦

2021-12-15 10:00:21

分布式事務框架

2022-06-27 08:21:05

Seata分布式事務微服務

2019-12-27 16:00:56

分布式事務框架Java

2024-01-05 07:28:50

分布式事務框架

2014-07-22 10:42:04

2025-06-11 08:01:06

2021-08-06 08:33:27

Springboot分布式Seata

2022-06-21 08:27:22

Seata分布式事務

2017-07-26 15:08:05

大數據分布式事務

2020-03-31 08:05:23

分布式開發技術

2021-07-09 05:49:53

分布式代碼算法

2024-12-02 09:19:44

2019-10-10 09:16:34

Zookeeper架構分布式

2023-01-06 09:19:12

Seata分布式事務

2009-06-19 15:28:31

JDBC分布式事務

2021-09-14 13:55:15

Go開發分布式

2009-09-18 15:10:13

分布式事務LINQ TO SQL

2021-09-29 09:07:37

分布式架構系統

2010-06-03 19:46:44

Hadoop

2021-11-05 07:18:15

分布式事務業務
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区在线 | 一区二区三区四区av | 美女视频一区 | av在线一区二区三区 | 欧美综合国产精品久久丁香 | 日韩免费视频 | 91在线电影 | 亚洲狠狠 | 午夜色婷婷 | 国产在线精品一区 | 99久久日韩精品免费热麻豆美女 | 91精品国产91久久综合桃花 | 欧美一区免费 | 五月花丁香婷婷 | 人人爽人人草 | 一级毛片在线播放 | 中文字幕精品一区 | 激情在线视频网站 | 极情综合网| 欧美久久国产精品 | 日本天天操 | 欧美高清视频一区 | 天天干b| 国产成人免费视频网站高清观看视频 | 免费午夜视频 | 国产乱码精品一区二三赶尸艳谈 | 激情一区二区三区 | 在线免费观看毛片 | 精品一二三 | 亚洲第一在线 | 999免费网站 | 亚洲免费网址 | 亚洲国产成人精品女人 | 国产一区二区三区久久久久久久久 | 伊人超碰 | 精品欧美乱码久久久久久1区2区 | 99热在线免费 | 国产一二三视频在线观看 | 欧美日韩国产一区二区三区 | 欧美成人精品 | av av在线|