訊息的重發以及補充策略

2021-09-27 06:30:53 字數 943 閱讀 8502

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收不到訊息消費者c的ack,重複向訊息消費者c發訊息。

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

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

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

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

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

socket訊息超時重發的設想

我們經常遇到的乙個問題就是 傳送一條訊息,若在t秒內沒有收到回應,我們將需要對訊息進行重發,若重發n次後再失敗,則不再重發。對於這個問題,我們可以給每條訊息乙個id,為yyyymmddhhmmsssss 當前的時間,精確到毫秒 再定義n 1個hashmap,key為訊息id,value為訊息內容。首...

重發布解決的問題以及重發布的架構及規則

重發布主要解決4個問題 1.多協議重發布的路由環路問題 2.次優路徑的問題 3.冗餘的問題 4.路由過濾的問題。重發布的規則和架構 規則 1.當一台路由器有多條去往目標的路由時總是信任內部路由而非外部路由 2.末節路由域做成水平分割的形式。架構 ospf的星型結構實現了乙個無環內部網路架構體系,所有...

訊息的分發策略

訊息的分發策略最基礎的就是推,拉機制,這有個最好的理解就是git pull 和 push 在這基礎上制定了有5中訊息的分發策略。支援,不支援 1.發布訂閱 生產者生產多少條訊息,每個消費者就消費多少條訊息 push 2.輪詢分發 訊息數 消費者數 每個消費者消費的訊息數 除不盡剩下條數隨機 3.公平...