CECTC/dbpack: 用Golang編寫的分散式事務中介軟體

banq發表於2022-07-05

DBPack是一種以AT事務模式實現的DB網格解析,是一種分散式事務模型,不侵入業務邏輯,具有高效能。

分散式事務、讀寫拆分和分片的資料庫代理!支援任何語言!它可以部署為 pod 中的 sidecar。

DBPack 意為資料庫叢集工具包。它可以作為一個Pod中的sidecar部署,它遮蔽了複雜的基礎邏輯,使業務開發不需要依賴特定的SDK,簡化了開發過程,提高了開發效率。

特徵
  • 支援MYSQL協議
  • 受kubernetes啟發的簡單易用的分散式事務解決方案
  • 支援讀寫拆分,支援透過Hint自定義SQL路由
  • 作為sidecar部署,支援任何語言
  • sharding:支援分表查詢,支援order by,支援limit

DBPack 與 Seata AT 事務有點不同,它可以作為一個 sidecar 部署在 k8s 中,這樣任何程式語言都可以使用這個 sidecar 來處理分散式事務。它還支援分片資料庫和表

分散式事務中介軟體的工作流描述:
  1. Slient 向 Aggregation Service 的 DBPack 代理傳送 HTTP 請求。(注意:請求地址和埠應該配置為 DBPack 代理而不是實際的聚合服務 API 地址)。
  2. DBPack 生成唯一的 XID(全域性事務 ID),並將其儲存在 ETCD 中。
  3. 如果全域性事務開始成功(失敗將結束事務),聚合服務可以透過 HTTP 頭(X-Dbpack-Xid)獲取 XID。然後聚合服務可以向 Service1 傳送 API 請求並將 XID 傳遞給它。
  4. Service1收到XID後,向DBPack傳送業務SQL,代理會為Service1註冊分支事務(生成branchID,存入ETCD...)
  5. Service1註冊後,DBPack會為業務SQL生成undo_log,然後undo_log會隨著Service1的本地事務一起提交。
  6. Service2 將執行與 Service1 相同的 step4、5。
  7. Aggregation Service 可以從 Service1 和 Service2 獲取 API 結果,並決定是全域性提交還是回滾。如果兩個 API 都成功,它會向 DBPack 響應 HTTP 200。如果失敗,它會響應除 200 之外的其他狀態碼。DBPack 將相應地在 ETCD 中將全域性事務更新為“commiting”或“rollbacking”。
  8. 透過 ETCD watch 機制,Service1 和 Service2 將知道是提交還是回滾他們的分支事務。(如果是提交,他們會刪除 undo_log;如果是回滾,他們會執行 undo_log。)
  9. 在所有分支提交或回滾後,分支狀態將在 ETCD 中更新。Aggregation Service 的 DBPack 代理會知道全域性事務已經完成,然後它會從 ETCD 中刪除 XID 和 BranchID 資訊。


 

相關文章