一、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...