架構師進階實戰隨堂筆記十

場景十:分佈式數據管理問題 分佈式事務和分庫分表方法介紹與實踐經驗分享

目錄

分庫分表

爲什麼分片

分庫分表策略

  • 按照指定字段區間,按照查詢維度來,儘量使得查詢落在單庫單表上,如時間段、ID段、區域等

  • 按指定維度取模


  • 一致性哈希進行分片



    環形Hash 空間



    把數據通過一定的Hash算法處理後映射到環上

機器的添加


機器的刪除


平衡性


平衡性- 虛擬節點


映射關係
相對均衡


進一步優化均衡
二次Hash,把負載大的節點再拆分後,對Hash值再進行二次Hash對應到拆分後的表上


分佈式事務五種方法

爲服務中數據存儲層一致性如何做到?
五種分佈式事務解決方案,按出現時間順序進行講解

兩階段提交 2PC

  • 例子


  • 2PC流程



    應用場景相對較少了,主要超時機制影響體驗

TCC操作

  • 例子


總結

  • 複雜場景下不推薦使用,逆向邏輯很複雜
  • 只有非常簡單的場景,非常容易提供回滾時使用


本地消息表

來源於早一代的支付公司,如ebay、支付寶。
設計思想:將遠程分佈式事務拆分成一系列的本地事務

轉賬例子

  • 本地插入消息表


  • 本地消息表
    通過本地事務繞過遠程事務


第二步執行失敗怎麼處理?
再次重試,直到加成功爲止,比如數據庫故障導致的臨時不成功。真實場景下第一步回滾很困難

業務導致的失敗,比如對方賬戶銷戶,這需要通過一定的業務機制結合人工進行處理。
有些情況不一定在系統中實現,比如流單,有時可以從業務上解決比如贈送優惠券進行用戶補償等。

  • 總結
    比較經典的解決方案,依賴關係型數據庫,存在吞吐量和性能方面的瓶頸


MQ非事務消息

  • 示例 僞代碼
public void trans(){
  try{
    //1.操作數據庫
  bool result= dao.update(model);//操作數據庫失敗,會拋出異常
    //2.如果第一步成功,則操作消息隊列投遞消息

  }catch(Exception ex){
  }
}
  • 總結
    缺點:MQ的可靠性,消息延遲、擠壓、丟失
    做到冪等性避免消息重複消費


MQ事務消息

新出現的解決方案
本地成功後修改消息狀態爲可投遞


  • 總結
    2018年主流開源MQ都沒有實現對事務消息的支持
    2019年RocketMQ等開源出來了事務性消息,雖然社區比較活躍,但建議核心流程暫時先不要使用事務型MQ。非核心業務可以嘗試。


分佈式事務的最佳實踐

本章小結

  • 分庫分表的常用手段:指定字段區間、按指定維度取模、一致性哈希進行分片
  • 介紹分佈式事務的五種方法:兩階段提交、TCC、本地消息表、MQ(非事務)、MQ(事務)
  • 分佈式事務的最佳實踐介紹
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章