註冊中心的實現有很多種方式, 如下圖所示。
這是註冊中心定義的介面, 分別給不同的角色使用。 例如協調者: 註冊,取消註冊,關閉。 事務管理器和資源管理器: 訂閱,取消訂閱,查詢
public
inte***ce
registryservice
return configurationfactory.
getinstance()
.getconfig
(key);}
setservice_group_name =
newhashset
<
>()
;}
註冊中心有什麼意義呢?
註冊中心主要就是為了讓tm,rm動態感知協調者的變更。 在向協調者傳送請求的時候,會從註冊中心裡的協調者列表用負載均衡演算法選擇乙個協調者,然後傳送請求。 從這裡可以看出協調者必須是對等的, 每個請求發給哪一台協調者都是一樣的。
例如seata中的各個角色和註冊中心的互動圖:
在建立 globaltransactionscanner 時,會確認事物分組名稱,例如: my_test_tx_group
註冊中心的載入
接下來看獲取註冊中心的協調者(tc)列表
首先從本地快取中獲取, 不存在從註冊中心獲取
獲取協調者列表, zk的節點資料: /registry/zk/default = [192.168.1.103:8091]
將協調者列表加入本地快取
負載均衡演算法在1.3.0 還沒有最少使用演算法和一致性hash演算法, 這裡是1.4.0 的負載均衡圖
負載均衡演算法,用來在多台協調者中選擇一台機器,將訊息傳送給協調者。 例如tc1,tc2,tc3 通過負載均衡演算法選擇了tc2, 將全域性事物開啟請求傳送給tc2。
當只有一台機器的時候,是不會採用任何負載均衡演算法的
從當前機器總數5, 通過 threadlocalrandom 隨機乙個下標, 例如 隨機到 3, 選擇3的下標,就是第四臺機器
1.4.0 的負載均衡演算法
最少使用的演算法由rpcstatus實現,remotingclient 內部有通過spi機制載入的列表: list,
發訊息前對rpcstatus計數+1, 收到響應後對計數-1
發訊息變更 rpcstatus 的流程
首先遍歷invoker, 然後通過rpcstatus拿到對應的呼叫次數。
首先過濾到一組最少的呼叫次數,如果只有乙個,就只用這乙個, 如果有多個最少的,就隨機乙個。
例如有五颱機器的呼叫次數如下: (4,8,9,29,4), 篩選到新陣列(0,5) , 新陣列的內容是老陣列的下標, 然後新陣列隨機乙個值: 下標1, 取得裡面的值:5. 那麼就取原陣列的第5個下標。 最終呼叫第五臺機器。
例如有五颱機器呼叫次數如下: (5,8,19,6,2), 只有2是最少的, 所以呼叫第五臺機器
1.4.0 的負載均衡演算法
在 [0,integer,max_value) 範圍看成乙個環, 如果環上用實際節點,很容易會不均勻。 例如 0,max_value-100 屬於節點a, 其他的屬於節點b。 那麼這種負載均衡演算法就沒有意義了, 99.99%都是選擇節點a。
為了解決節點分布不均勻的問題, 引入了虛擬節點。 例如原先的節點a的hash是max_value-1000, 虛擬節點就是計算 節點a+1,節點a+2,節點a+n 重新計算的hash值, 會有更大概率分布在整個環上。 根據呼叫的全域性事物id 計算乙個hash值, 找到環上的下乙個虛擬幾點, 最後找到實際節點進行呼叫。
一致性hash聽起來還是很高大上的,實現方式乙個是虛擬節點的hash計算, 另乙個是用 sortedmap.tailmap 找到下乙個hash值
先從 [0,integer.max_value) 取值, 然後用當前值 % 機器總數
例如輪詢到 18, 總共 5 太機器 , 18%5 = 3, 選擇3的下標,就是第四臺機器
seata 的註冊中心和配置中心
註冊中心 服務端註冊中心 位於seata server的registry.conf配置檔案中的registry.type引數 為了實現seata server集群高可用不會使用file型別,例如下邊 表示 使用zookeeper作為seata服務們的註冊管理中心,當前seata服務將會交由這個zk管...
seata 配置中心使用 nacos
在上篇筆記中 seata 的配置中心使用的是 file 也就是本地配置檔案方式,現在修改為 nacos 配置中心方式。1 修改 registry.conf 配置檔案中的 config.type 修改為 nacos 並修改nacos中的配置。配置檔案如下 config 2 將seata 需要的配置資訊...
Seata客戶端使用配置中心
核心類 io.seata.config.configurationfactory static 初始化current file instance 載入registry 環境隔離 ps 使用nacos做配置中心時,如果namespace是public應該這麼配置namespace 獲取tmrpccli...