1. 發訊息的時候確定訊息發出去了(訊息確認)
2. rabbitmq伺服器也不會丟訊息(儲存到硬碟中)
3. 收訊息的時候,確保業務完成(手動應答)
下面來介紹下,如何保證訊息的絕對不丟失的問題,下面分享的絕對乾貨,都是在知名網際網路產品的產線中使用。
1.訊息持久化
2.ack確認機制
3.設定集群映象模式
4.訊息補償機制
第一種:訊息持久化
rabbitmq 的訊息預設存放在記憶體上面,如果不特別宣告設定,訊息不會持久化儲存到硬碟上面的,如果節點重啟或者意外crash掉,訊息就會丟失。
所以就要對訊息進行持久化處理。如何持久化,下面具體說明下:
要想做到訊息持久化,必須滿足以下三個條件,缺一不可。
1) exchange 設定持久化
2)queue 設定持久化
3)message持久化傳送:傳送訊息設定傳送模式deliverymode=2,代表持久化訊息
第二種:ack確認機制
多個消費者同時收取訊息,比如訊息接收到一半的時候,乙個消費者死掉了(邏輯複雜時間太長,超時了或者消費被停機或者網路斷開鏈結),如何保證訊息不丟?
這個使用就要使用message acknowledgment 機制,就是消費端消費完成要通知服務端,服務端才把訊息從記憶體刪除。
這樣就解決了,及時乙個消費者出了問題,沒有同步訊息給服務端,還有其他的消費端去消費,保證了訊息不丟的case。
第三種:設定集群映象模式
我們先來介紹下rabbitmq三種部署模式:
1)單節點模式:最簡單的情況,非集群模式,節點掛了,訊息就不能用了。業務可能癱瘓,只能等待。
2)普通模式:預設的集群模式,某個節點掛了,該節點上的訊息不能用,有影響的業務癱瘓,只能等待節點恢復重啟可用(必須持久化訊息情況下)。
3)映象模式:把需要的佇列做成映象佇列,存在於多個節點,屬於rabbitmq的ha方案
為什麼設定映象模式集群,因為佇列的內容僅僅存在某乙個節點上面,不會存在所有節點上面,所有節點僅僅存放訊息結構和元資料。下面自己畫了一張圖介紹普通集群丟失訊息情況:
如果想解決上面途中問題,保證訊息不丟失,需要採用ha 映象模式佇列。
下面介紹下三種ha策略模式:
1)同步至所有的
2)同步最多n個機器
3)只同步至符合指定名稱的nodes
命令處理ha策略模版:rabbitmqctl set_policy [-p vhost] name pattern definition [priority]
1)為每個以「rock.wechat」開頭的佇列設定所有節點的映象,並且設定為自動同步模式
rabbitmqctl set_policy ha-all "^rock.wechat" ''
rabbitmqctl set_policy -p rock ha-all "^rock.wechat" ''
2)為每個以「rock.wechat.」開頭的佇列設定兩個節點的映象,並且設定為自動同步模式
rabbitmqctl set_policy -p rock ha-exacly "^rock.wechat" \
''3)為每個以「node.」開頭的佇列分配指定的節點做映象
rabbitmqctl set_policy ha-nodes "^nodes\." \
''但是:ha 映象佇列有乙個很大的缺點就是:系統的吞吐量會有所下降
第四種:訊息補償機制
為什麼還要訊息補償機制呢?難道訊息還會丟失,沒錯,系統是在乙個複雜的環境,不要想的太簡單了,雖然以上的三種方案,基本可以保證訊息的高可用不丟失的問題,
但是作為有追求的程式設計師來講,要絕對保證我的系統的穩定性,有一種危機意識。
比如:持久化的訊息,儲存到硬碟過程中,當前佇列節點掛了,儲存節點硬碟又壞了,訊息丟了,怎麼辦?
產線網路環境太複雜,所以不知數太多,訊息補償機制需要建立在訊息要寫入db日誌,傳送日誌,接受日誌,兩者的狀態必須記錄。
然後根據db日誌記錄check 訊息傳送消費是否成功,不成功,進行訊息補償措施,重新傳送訊息處理。
RabbitMQ 如何保證訊息不丟失?
rabbitmq 如何保證訊息不丟失?rabbitmq一般情況很少丟失,但是不能排除意外,為了保證我們自己系統高可用,我們必須作出更好完善措施,保證系統的穩定性。下面來介紹下,如何保證訊息的絕對不丟失的問題,下面分享的絕對乾貨,都是在知名網際網路產品的產線中使用。1.訊息持久化 2.ack確認機制 ...
RabbitMQ如何保證訊息不丟失
rabbitmq 大致有三種場景會發生訊息丟失 1 consumer沒有接收到訊息,消費之前 2 consumer接收到訊息,訊息暫存記憶體,還未消費 3 consumer消費時 第一種丟失場景就像我剛剛到達便利店,還沒選好買什麼商品,這個時候便利店突然斷電,無法消費 這種場景下使用message ...
rabbitmq如何保證訊息可靠性不丟失
目錄mq丟失資訊 消費者丟失資訊 之前我們簡單介紹了rabbitmq的功能。他的作用就是方便我們的訊息解耦。緊接著問題就會暴露出來。解耦就設計到雙方系統不穩定問題。在mq中有生產者 mq 消費者三個角色。其中乙個角色down機或者重啟後。就設計到訊息的丟失問題。因為mq整個訊息週期設計到上述的三個角...