1. 程式人生 > >基於訊息的分散式事務簡單方案

基於訊息的分散式事務簡單方案

System-A為主系統


流程描述

1. system-A執行本地事務,

傳送msg到redis,此時msg狀態為unknown(這裡全是unknown狀態的msg,訊息需要持久化,只有msg存在,即使system-b處理失敗也可以有其他方式處理,一般是人工)

2.1本地事務提交

2.1.1 更改redis的msg狀態為提交,從老的記憶體佇列刪除,並放入另一個記憶體佇列(這裡全是commit狀態的msg)

2.1.2 monitorsystem負責把commit狀態的msg傳送到MQ,並把msg轉移到commited的儲存中

2.2.本地事務回滾

2.2.1刪除redis中的msg

3.System-B執行事務

3.1從MQ接收msg,執行本地事務,需要有重試的機制和避免重複處理的能力。(當超過最大重試次數後還失敗,則需要預警,人工參與處理。)

3.2處理成功後需通知system-a,system-a做相應處理,並刪除redis中的msg

4.處理完通知

5.補償通知

Monitorsystem的作用

1.      監控commit狀態的msg 進行傳送

2.      監控unknown狀態的msg,根據具體邏輯去檢查system-a,看看system-a的事務是否成功,來變更msg的狀態。

3.      監控commited狀態的msg,若過了一段時間還存在,則可能system-b通知失敗,則monitor system去查system-b,然後進行補償通知。

用來保證system-a成功的事務的訊息可以傳送,如果事務失敗,則訊息是unknown狀態也不會被下游系統處理。

Messageresend system

基於某些情況,訊息丟失,需要可以從system-a生成msg重新投遞。

Precommit 階段選擇redis的理由

本來開始想用MQ來儲存,由於這是訊息的中轉階段,因為需要根據msgId對訊息進行查詢,然後還得更新已存在的訊息的資料(狀態值),然後查看了幾個mq中介軟體,比較activemq,metaq,前者不支援查詢訊息,而對於更新訊息狀態則都不支援。所以mq無法支援這種訊息中轉儲存。


參考:

http://blog.jobbole.com/89140/