1. 程式人生 > >rocketmq事務訊息的理解

rocketmq事務訊息的理解

http://www.cnblogs.com/wxd0108/p/6038543.html

RocketMQ第一階段傳送Prepared訊息時,會拿到訊息的地址,第二階段執行本地事物,第三階段通過第一階段拿到的地址去訪問訊息,並修改狀態。細心的你可能又發現問題了,如果確認訊息傳送失敗了怎麼辦?RocketMQ會定期掃描訊息叢集中的事物訊息,這時候發現了Prepared訊息,它會向訊息傳送者確認,Bob的錢到底是減了還是沒減呢?如果減了是回滾還是繼續傳送確認訊息呢?RocketMQ會根據傳送端設定的策略來決定是回滾還是繼續傳送確認訊息。這樣就保證了訊息傳送與本地事務同時成功或同時失敗。

如果endTransaction

方法執行失敗,導致資料沒有傳送到brokerbroker會有回查執行緒定時(預設1分鐘)掃描每個儲存事務狀態的表格檔案,如果是已經提交或者回滾的訊息直接跳過,如果是prepared狀態則會向Producer發起CheckTransaction請求,Producer會呼叫DefaultMQProducerImpl.checkTransactionState()方法來處理broker的定時回撥請求,而checkTransactionState會呼叫我們的事務設定的決斷方法,最後呼叫endTransactionOnewaybroker來更新訊息的最終狀態。

再回到轉賬的例子,如果Bob的賬戶的餘額已經減少,且訊息已經發送成功,Smith端開始消費這條訊息,這個時候就會出現消費失敗和消費超時兩個問題?解決超時問題的思路就是一直重試,直到消費端消費訊息成功,整個過程中有可能會出現訊息重複的問題,按照前面的思路解決即可。

本質上還是個二階段提交

重複消費冪等性要自己做

問題

要是本地事務提交,然後掛了,然後確認訊息沒傳送,然後又沒法回查確認,導致分散式事務的失敗?