RabbitMQ 如何保證訊息不丟失?

2021-09-29 20:03:40 字數 1897 閱讀 4733

rabbitmq 如何保證訊息不丟失?

rabbitmq一般情況很少丟失,但是不能排除意外,為了保證我們自己系統高可用,我們必須作出更好完善措施,保證系統的穩定性。

下面來介紹下,如何保證訊息的絕對不丟失的問題,下面分享的絕對乾貨,都是在知名網際網路產品的產線中使用。

1.訊息持久化

2.ack確認機制

3.設定集群映象模式

4.訊息補償機制

第一種:訊息持久化

rabbitmq 的訊息預設存放在記憶體上面,如果不特別宣告設定,訊息不會持久化儲存到硬碟上面的,如果節點重啟或者意外crash掉,訊息就會丟失。

所以就要對訊息進行持久化處理。如何持久化,下面具體說明下:

要想做到訊息持久化,必須滿足以下三個條件,缺一不可。

1) exchange 設定持久化

2)queue 設定持久化

3)message持久化傳送:傳送訊息設定傳送模式deliverymode=2,代表持久化訊息

這個使用就要使用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 大致有三種場景會發生訊息丟失 1 consumer沒有接收到訊息,消費之前 2 consumer接收到訊息,訊息暫存記憶體,還未消費 3 consumer消費時 第一種丟失場景就像我剛剛到達便利店,還沒選好買什麼商品,這個時候便利店突然斷電,無法消費 這種場景下使用message ...

RabbitMQ 如何保證訊息不丟失?

1.發訊息的時候確定訊息發出去了 訊息確認 2.rabbitmq伺服器也不會丟訊息 儲存到硬碟中 3.收訊息的時候,確保業務完成 手動應答 下面來介紹下,如何保證訊息的絕對不丟失的問題,下面分享的絕對乾貨,都是在知名網際網路產品的產線中使用。1.訊息持久化 2.ack確認機制 3.設定集群映象模式 ...

rabbitmq如何保證訊息可靠性不丟失

目錄mq丟失資訊 消費者丟失資訊 之前我們簡單介紹了rabbitmq的功能。他的作用就是方便我們的訊息解耦。緊接著問題就會暴露出來。解耦就設計到雙方系統不穩定問題。在mq中有生產者 mq 消費者三個角色。其中乙個角色down機或者重啟後。就設計到訊息的丟失問題。因為mq整個訊息週期設計到上述的三個角...