MQ解決訊息重發 做到冪等性

2021-08-27 03:15:43 字數 1129 閱讀 5168

一、mq訊息傳送

1、傳送端mq-client(訊息生產者:producer)將訊息傳送給mq-server;

2、mq-server將訊息落地;

3、mq-server回ack給mq-client(producer);

4、mq-server將訊息傳送給訊息接受端mq-client(訊息消費者:customer);

5、mq-client(customer)消費接受到訊息後傳送ack給mq-server;

6、mq-server將落地訊息刪除

二、訊息重**送原因

為了保證訊息必達,mq使用了訊息超時、重傳、確認機制。使得訊息可能被重**送,如上圖中,由於網路不可達原因:3和5中斷,可能導致訊息重發。訊息生產者a收不到mq-server的ack,重複向mq-server傳送訊息。mq-server收不到訊息消費者b的ack,重複向訊息消費者b發訊息。

三、訊息重**送產生的後果

舉個例子:購買會員卡,上游支付系統負責給使用者扣款,下游系統負責給使用者發卡,通過mq非同步通知。不管是上半場的ack丟失,導致mq收到重複的訊息,還是下半場ack丟失,導致購卡系統收到重複的購**知,都可能出現,上游扣了一次錢,下游發了多張卡。

四、mq內部如何做到冪等性的

對於每條訊息,mq內部生成乙個全域性唯

一、與業務無關的訊息id:inner-msg-id。當mq-server接收到訊息時,先根據inner-msg-id判斷訊息是否重**送,再決定是否將訊息落地到db中。這樣,有了這個inner-msg-id作為去重的依據就能保證一條訊息只能一次落地到db。

五、訊息消費者應當如何做到冪等性

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

2、對於非冪等性業務可不實現冪等性的業務:權衡去重所花的代價決定是否需要實現冪等性,如:購物會員卡成功,向使用者傳送通知簡訊,傳送一次或者多次影響不大。不做冪等性可以省掉寫去重日誌的操作。

MQ解決訊息重發 做到冪等性

一 mq訊息傳送 1 傳送端mq client 訊息生產者 producer 將訊息傳送給mq server 2 mq server將訊息落地 3 mq server回ack給mq client producer 4 mq server將訊息傳送給訊息接受端mq client 訊息消費者 custo...

mq冪等mysql MQ解決訊息重發 做到冪等性

一 mq訊息傳送 1 傳送端mq client 訊息生產者 producer 將訊息傳送給mq server 2 mq server將訊息落地 3 mq server回ack給mq client producer 4 mq server將訊息傳送給訊息接受端mq client 訊息消費者 custo...

mq冪等mysql MQ解決訊息重發 做到冪等性

一 mq訊息傳送 1 傳送端mq client 訊息生產者 producer 將訊息傳送給mq server 2 mq server將訊息落地 3 mq server回ack給mq client producer 4 mq server將訊息傳送給訊息接受端mq client 訊息消費者 custo...