具體實現代碼:https://github.com/Go007/springboot-mq
一. 多系統間的分佈式事務問題
假設一個外賣系統,其中有訂單系統和運單系統,用戶下單,在訂單系統生成訂單後,調用運單系統,生成派送信息,外賣小哥接單進行派送。下面是沒有考慮分佈式事務的示例代碼:
二. 如何解決分佈式事務?
-
相關理論依據
CAP理論
BASE理論
2PC協議
3PC協議
Paxos算法
Raft一致性協議 -
解決方案
-
基於數據庫XA/JTA協議的方式
需要數據庫廠商的支持,Java組件有atomikos等; -
異步校對數據的方式
支付寶,微信支付主動查詢支付狀態,對賬單的形式
數據校對系統:定時比對多個系統的數據是否正常或人工對賬 -
基於可靠消息(MQ)的解決方案
異步場景,通用性較強,拓展性較高 -
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.消息處理會延遲,需要業務上能容忍
儘量避免分佈式事物;
儘量將非核心事物做成異步;