RabbitMQ 延遲佇列實現訂單支付結果非同步階梯性通知

weixin_34321977發表於2019-01-21

場景

在第三方支付中,例如支付寶、或者微信,對於訂單請求,第三方支付系統採用的是訊息同步返回、非同步通知+主動補償查詢的補償機制
1.商戶請求交易介面成功。
2.接受銀行的非同步通知。
3.處理業務,將通知URL和通知的資料放到佇列中。通知佇列是常駐的。
4.如果通知商戶成功/失敗更新通知狀態。如果通知失敗,根據通知間隔重新把通知資料放到通知佇列裡。

5*(2^n-1)秒後再次通知,n指回撥次數,最大為5次!
每次通知超時時間5秒。

支付計費中心對於訂單請求資訊的處理:
通過訊息同步返回、非同步通知、主動補償查詢相結合的機制
其中對於訂單的非同步通知,目前的通知策略為3s、30s、60s、120s、180、300s的階梯性通知。
返回成功情況下就不繼續通知了

使用rabbitmq的訊息延遲+死信佇列來實現

2021342-efc7fd95c95a8c3d.png
QQ截圖20190121172821.png

producer釋出訊息,通過exchangeA的訊息會被分發到QueueA,Consumer監聽queueA,一旦有訊息到來就被消費,這邊的消費業務就是通知前端,如果通知失敗,就建立一個延遲佇列declareQueue,設定每個訊息的ttl然後通過declare_exchange將訊息分發到declare_queue,因為declare_queue沒有consumer並且declare_queue中的訊息設定了ttl,當ttl到期後,將通過DLX路由到queueA,被重新消費。

相關文章