以前面試的時候被問到關於mq如何保證消息的順序問題,當時沒回答好,網上也沒找到滿意的答案,因而本身想了一個面試
假設,A和B經過消息隊列通訊,A發了前後發了2條消息m1和m2。A發出的順序是m一、m2,結果m2先到達隊列,m1後進的,那麼在隊列中m2在前m1在後,假設這兩條消息是有依賴關係的,必須是先m1再m2,那麼B可能先接收到m2後接收到m1,問這個時候怎麼辦?數據庫
一、B接收到消息的順序跟A發出消息的前後順序以及消息在隊列中的順序是沒有關係的。消息到達隊列的前後順序無法保證,一樣,隊列將消息投遞出去之後接收消息的順序也無法保證,因此,我想不管怎樣做爲消費者的B都必須保證業務的正確性,不管生產者怎麼怎麼發消息,隊列怎麼投遞消息,做爲消費者都必須意識到:接收到的消息是無序的,必須作好處理,務必保證業務正常。spa
二、我以爲這是一個通用的問題,也是做爲消費者必需要考慮的問題隊列
三、消息的順序並不重要,重要的是要保證業務的最終一致性消息隊列
一、接收到消息之後,將消息保存到本地數據庫的表中,標記爲未處理方法
二、若知足處理條件,直接處理,成功之後,標記表中的記錄爲已處理,而後向隊列確認消息通信
三、若不知足處理條件,則暫不處理數據
四、定時掃描本地消息表,將那些未處理的再過一遍思考
五、冪等性判斷很重要mq
假設,簽到送積分。
再假設,簽到和送積分是分開的,簽到的邏輯是向簽到表中插入一條記錄,送積分的邏輯是判斷積分所對應的簽到記錄是否存在,存在則送積分,不然不送。
接着假設,消息隊列中有兩條消息,一條是簽到消息,另外一條是送積分消息,這條積分消息帶着簽到記錄的id。
那麼,送積分的時候就要依賴是否有簽到記錄。按照上面的理論,將消息先保存在本地,而後定時掃描,是能夠正常進行的。
~~~水平有限,暫時只想到這種方法,歡迎批評指正!!!~~~