MQ分佈式環境下保持數據一致性

業務場景:

支付寶的餘額系統與螞蟻金服的餘額寶是兩個對立的平臺,相互之間通過ActiveMQ進行通信。當用戶把1000塊錢從餘額存進餘額寶的時候,餘額系統數據庫減1000,然後發送一個消息到MQ,餘額寶端接收到這個消息後,在其數據庫中加1000.

可能存在的問題:

1. 消息丟失問題。用戶發起1000塊錢的轉賬,支付寶餘額平臺減了1000,觸發消息放到了隊列,餘額寶端成功消費了消息,但是在修改數據庫的時候發生了異常,進行了回滾。這時候消息就丟失了。

解決辦法,支付寶餘額端要有消息重發機制。當餘額寶端接受到消息之後,更新完數據庫之後,要回調支付寶平臺的接口,告訴支付寶我這裏操作成功完成了。如果長時間沒有回調,則支付寶端應該察覺到問題纔可以。我們可以在支付寶餘額端建立一個賬本,記錄每一次的操作。這個賬本就是歷史訂單表。創建一個訂單歷史表,message_id用來定義每一次操作,並且會將這個值放到消息隊列中。status字段用於標記餘額寶端是否成功回調了告訴了支付寶這次操作是否成功。字段值爲confirmed或者unconfirmed.

餘額寶端有一個job在一直監視着訂單歷史表,如果發現有記錄一直處於unconfirm狀態,會再次發一個相同的消息給餘額寶端。這樣就避免了消息丟失問題。

 

2. 這樣會引發新的問題,重複消費問題。餘額寶端成功消費了消息,成功更新了數據庫,都是由於網絡原因回調失敗,那麼支付寶端會再次發出一個MQ,這樣如果餘額寶端再次消費,那麼就成了增加2次1000塊。解決辦法,可以在餘額寶端也加一個賬本,記錄歷史記錄。這個表中包含message_id,每次成功更新數據庫之後,就在這個表中加入一條記錄。那麼第二次同一個消息過來的時候,因爲是用一個message_id,那麼就會被丟棄。這樣,消息重複問題也就解決了。

 

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