基於RabbitMQ的分佈式事務解決方案

具體實現代碼:https://github.com/Go007/springboot-mq

一. 多系統間的分佈式事務問題
假設一個外賣系統,其中有訂單系統和運單系統,用戶下單,在訂單系統生成訂單後,調用運單系統,生成派送信息,外賣小哥接單進行派送。下面是沒有考慮分佈式事務的示例代碼:
在這裏插入圖片描述
在這裏插入圖片描述
二. 如何解決分佈式事務?

  • 相關理論依據
    CAP理論
    BASE理論
    2PC協議
    3PC協議
    Paxos算法
    Raft一致性協議

  • 解決方案

  1. 基於數據庫XA/JTA協議的方式
    需要數據庫廠商的支持,Java組件有atomikos等;

  2. 異步校對數據的方式
    支付寶,微信支付主動查詢支付狀態,對賬單的形式
    數據校對系統:定時比對多個系統的數據是否正常或人工對賬

  3. 基於可靠消息(MQ)的解決方案
    異步場景,通用性較強,拓展性較高

  4. TCC編程式解決方案
    阿里,螞蟻金服自己封裝的DTX

分佈式事務的解決方案,業務針對性很強,沒有什麼開箱即用的方案,需要和業務系統結合編碼。

三. 基於RabbitMQ的通用解決方案

  • RabbitMQ簡介
    在這裏插入圖片描述

  • 整體設計思路
    在這裏插入圖片描述

  • step1 - 可靠消息生產 - 記錄消息發送
    在這裏插入圖片描述
    remark: 在生產端需要開啓消息發送確認機制,重要!
    以下是 Spring Boot集成RabbitMQ配置示例:

spring:
  rabbitmq:
    addresses: 192.168.157.129:5672
    username: root
    password: 123456
    virtual-host: /
    # mq生產端配置
    # publisher-confirms: true
    publisher-confirm-type: correlated  # 重要!開啓消息發送確認機制,監聽回調
    publisher-returns: true
  • step2 - 可靠消息生產 - 修改消息發送狀態
    在這裏插入圖片描述

  • step3 - 可靠消息處理 - 正常處理
    在這裏插入圖片描述

spring:
  rabbitmq:
    addresses: 192.168.157.129:5672
    username: root
    password: 123456
    virtual-host: /
    # mq消費端配置
    listener:
      simple:
        acknowledge-mode: manual # 開啓手動ack,控制消息在mq中的刪除,重發。。。處理完畢
  • step4 - 可靠消息處理 - 消息重發
    在這裏插入圖片描述
    在這裏插入圖片描述

  • 整體流程圖
    在這裏插入圖片描述

  • 優缺點

  • 優點
    1.通用型強
    2.拓展性高
    3.方案成熟

  • 缺點
    1.基於消息中間件,只適合異步場景
    2.消息處理會延遲,需要業務上能容忍

儘量避免分佈式事物;
儘量將非核心事物做成異步;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章