MQ解決消息重發--作到冪等性

 

1、MQ消息發送html

        

  一、發送端MQ-client(消息生產者:Producer)將消息發送給MQ-server;網絡

  二、MQ-server將消息落地;異步

  三、MQ-server回ACK給MQ-client(Producer);spa

  四、MQ-server將消息發送給消息接受端MQ-client(消息消費者:Customer);日誌

  五、MQ-client(Customer)消費接受到消息後發送ACK給MQ-server;server

  六、MQ-server將落地消息刪除htm

 

2、消息重複發送緣由blog

  爲了保證消息必達,MQ使用了消息超時、重傳、確認機制。使得消息可能被重複發送,如上圖中,因爲網絡不可達緣由:3和5中斷,可能致使消息重發。消息生產者a收不到MQ-server的ACK,重複向MQ-server發送消息。MQ-server收不到消息消費者b的ACK,重複向消息消費者b發消息。it

 

3、消息重複發送產生的後果class

  舉個例子:購買會員卡,上游支付系統負責給用戶扣款,下游系統負責給用戶髮卡,經過MQ異步通知。無論是上半場的ACK丟失,致使MQ收到重複的消息,仍是下半場ACK丟失,致使購卡系統收到重複的購卡通知,均可能出現,上游扣了一次錢,下游發了多張卡。

 

4、MQ內部如何作到冪等性的

  對於每條消息,MQ內部生成一個全局惟1、與業務無關的消息ID:inner-msg-id。當MQ-server接收到消息時,先根據inner-msg-id判斷消息是否重複發送,再決定是否將消息落地到DB中。這樣,有了這個inner-msg-id做爲去重的依據就能保證一條消息只能一次落地到DB。

 

5、消息消費者應當如何作到冪等性

  一、對於非冪等性業務且要求實現冪等性業務:生成一個惟一ID標記每一條消息,將消息處理成功和去重日誌經過事物的形式寫入去重表。

  二、對於非冪等性業務可不實現冪等性的業務:權衡去重所花的代價決定是否須要實現冪等性,如:購物會員卡成功,向用戶發送通知短信,發送一次或者屢次影響不大。不作冪等性能夠省掉寫去重日誌的操做。

相關文章
相關標籤/搜索