回覆列表
-
1 # 淺析架構
-
2 # MiLi影片
訊息中介軟體訊息不丟失主要從以下幾個方面考慮
投遞生產者向訊息中介軟體投遞訊息是push的方式,這種方法會出現以下情況
1、生產者掛掉了
情況是這樣的,你的生產者收到了資料,並存到了資料庫中,同時生產者要降訊息push到訊息中介軟體做非同步處理。這時候如果生產者掛掉了,就導致訊息資料沒有push到訊息中介軟體裡,也就會出現資料不一致的問題。
這時候我們可以在資料庫設定是否投遞成功標誌位,在生產者push之後,再將標誌位設定為已經投遞。另外,客氣啟動一個定時任務,檢測是否有訊息沒有投遞,保證訊息資料一定會進入中介軟體。
2、訊息重試
生產者沒有掛掉,但是因為網路等其他問題,導致生產者不知道有沒有投遞成功。這時候生產者可以失敗重試,這保證訊息可以再次投遞。但是這有可能會出現重複投遞,導致出現中介軟體訊息資料重複。
儲存訊息中介軟體是存到磁碟上的,存入磁碟的訊息一般是不會丟失的,同時磁碟檔案還會做備份。如果一個丟失了,可以透過備份檔案恢復。
消費一般消費者需要在消費者消費成功之後再設定提交消費位點。如果消費失敗,消費者不提交消費位點還是可以消費該資料的。這就引出一個問題就是訊息重複消費。這個問題和上邊提到的訊息重複投遞相同,都會導致重複消費,這就需要考慮消費的冪等性,可以做消費記錄,防止重複消費。
-
3 # 閒林素素
討論訊息丟失的前提是訊息已經發送到MQ,如果傳送都沒成功,何來丟失的說法?然後傳送訊息只是一個普通的RPC遠端呼叫而已,如果失敗,那是訊息生產者自己要處理的事情。就像寫入資料到資料庫失敗一樣。所以我覺得樓主提這個問題本身就沒有理解什麼叫做訊息丟失。
1.先來看下訊息的投遞過程,訊息傳送分為三步,見圖
2.傳送方透過這三步便可以保證訊息傳送到mq的可靠性:
第一步send將訊息傳送給mq,
第二步mq將訊息持久化,mq需要保證高可用, 訊息持久化化後不會丟失,一般都會存在多個副本,多個副本之間可以使用raft協議保證資料一致性。
第三步mq應答到send方確認訊息已投遞。
但是因為1,2,3步中都可能出現故障,需要重試傳送請求。如果是1,2步失敗直接重試就可以了,如果第三步失敗了,就可能一條訊息會出現多條,這就需要消費端去保證消費的冪等性。