分佈式事務解決方案—本地消息表

    在微服務環境下,分佈式事務是我們開發中經常的遇到的問題,下面我們來聊聊如何使用本地消息表機制來解決分佈式事務的問題。

    本地消息表是 Base 理論的應用,核心思路就是將分佈式事務拆解爲本地事務和發送 MQ 消息來實現分佈式系統下數據的最終一致性的方案。

    本地消息表方案是分佈式服務中最常用的數據一致性解決方案之一,如下是本地消息表的實現流程圖:

(1)系統 A 首先寫入實際的業務,同時將通知消息保存到專門的消息表中,因爲消息表和業務表在一個庫中,可以保證事務的同時生效,即在同一個事務中執行業務操作並將消息寫入消息表中(消息表字段設計爲主鍵 id、消息內容、目標系統和當前消息的狀態、創建時間、更新時間);當事務提交後,業務數據和消息記錄(消息的狀態爲待發送)都會被持久化到數據庫。

(2)系統 A 發送消息給消息中間件(如 RocketMQ),並且要獲取到消息發送成功的響應。

(3)MQ 消息發送成功後,修改系統 A 對應的數據庫中消息表的狀態(如記錄狀態爲消息發送成功)。

(4)定時任務定期查詢消息表中消息記錄的狀態爲待發送的數據,然後做補償消息的操作,即重新發送消息到消息隊列中 。

(5)系統 B 監聽消息,然後消費隊列中的消息數據做自己的業務,這裏系統 B 收到消息之後需要確保冪等性操作,因爲消息可能會被重複處理。

總結:

(1)本地消息表通過在數據庫中維護一張專門的消息表來管理與外部系統的交互狀態更新,由於消息表的寫入是與業務操作同在一個本地事務中完成的,天然具有同時成功和同時失敗的特性。

(2)本地消息表機制是一種最大努力通知思想,在分佈式服務中,雖然不能提供強一致性,但通過本地事務與消息表相結合,可以確保消息不會丟失,並最終實現事務的一致性。

(3)本地消息表機制的優點:

    (a)實現簡單:基於數據庫的事務機制和消息隊列,不需要引入複雜的分佈式事務框架,降低了開發和維護的難度。

    (b)數據一致性保障:通過本地消息表和消息隊列的結合,確保了在分佈式環境下,即使部分服務出現故障,也能通過消息的重發等機制保證數據的最終一致性。

    (c)兼容性好:可以與各種不同的技術棧和系統進行集成,適用於多種業務場景

(3)本地消息表機制的缺點:

    (a)消息表維護成本:需要額外維護本地消息表,包括消息的插入、更新和刪除等操作,增加了數據庫的負擔和數據管理的複雜性。

    (b)依賴消息隊列:系統的可靠性依賴於消息隊列的穩定性和可靠性,如果消息隊列出現故障,可能會導致消息丟失或處理延遲,影響分佈式事務的正常執行。

    (c)性能問題:在高併發場景下,消息的發送和消費可能會成爲性能瓶頸,需要對消息隊列和相關服務進行優化。

    本地消息表方案適用於對數據一致性要求較高、可容忍一定的數據一致性延遲、業務場景相對簡單的分佈式系統。所以在實際應用中,需要根據具體的業務需求和系統架構特點,合理選擇解決分佈式事務的方案。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/vV4TeIMt8jjMaDc5Q9Nyxg