訊息中介軟體 RabbitMQ 高階特性與應用問題

2021-10-05 04:50:22 字數 3780 閱讀 6402

在使用 rabbitmq 的時候,作為訊息傳送方希望杜絕任何訊息丟失或者投遞失敗場景。rabbitmq 為我們提供了兩種方式用來控制訊息的投遞可靠性模式。

rabbitmq 整個訊息投遞的路徑為:

producer—>rabbitmq broker—>exchange—>queue—>consumer

我們將利用這兩個 callback 控制訊息的可靠性投遞

使用channel下列方法,完成事務控制:

ack指acknowledge,確認。 表示消費端收到訊息後的確認方式。

有三種確認方式:

其中自動確認是指,當訊息一旦被consumer接收到,則自動確認收到,並將相應 message 從 rabbitmq 的訊息快取中移除。

但是在實際業務處理中,很可能訊息接收到,業務處理出現異常,那麼該訊息就會丟失

如果設定了手動確認方式,則需要在業務處理成功後,呼叫channel.basicack(),手動簽收

如果出現異常,則呼叫channel.basicnack()方法,讓其自動重新傳送訊息

死信佇列,英文縮寫:dlx 。dead letter exchange(死信交換機),當訊息成為dead message後,可以被重新傳送到另乙個交換機,這個交換機就是dlx

訊息成為死信的三種情況:

1. 佇列訊息長度到達限制;

2. 消費者拒接消費訊息,basicnack/basicreject,並且不把訊息重新放入原目標佇列,requeue=false;

3. 原佇列存在訊息過期設定,訊息到達超時時間未被消費;

佇列繫結死信交換機:

給佇列設定引數: x-dead-letter-exchange 死信交換機名稱和 x-dead-letter-routing-key 傳送給死信交換機的routingkey

1. 死信交換機和死信佇列和普通的沒有區別

2. 當訊息成為死信後,如果該佇列繫結了死信交換機,則訊息會被死信交換機重新路由到死信佇列

延遲佇列,即訊息進入佇列後不會立即被消費,只有到達指定時間後,才會被消費。

很可惜,在rabbitmq中並未提供延遲佇列功能。

但是可以使用:ttl+死信佇列 組合實現延遲佇列的效果。

延遲佇列 指訊息進入佇列後,可以被延遲一定時間,再進行消費。

rabbitmq沒有提供延遲佇列功能,但是可以使用 : ttl + dlx 來實現延遲佇列效果

rabbitmq日誌
rabbitmq預設日誌存放路徑: /var/log/rabbitmq/rabbit@***.log

日誌包含了rabbitmq的版本號、erlang的版本號、rabbitmq服務節點名稱、cookie的hash值、rabbitmq配置檔案位址、記憶體限制、磁碟限制、預設賬戶guest的建立以及許可權配置等等。

web管控臺監控
rabbitmqctl管理和監控

檢視佇列

# rabbitmqctl list_queues

檢視exchanges

# rabbitmqctl list_exchanges

檢視使用者

# rabbitmqctl list_users

檢視連線

# rabbitmqctl list_connections

檢視消費者資訊

# rabbitmqctl list_consumers

檢視環境變數

# rabbitmqctl environment

檢視未被確認的佇列

# rabbitmqctl list_queues name messages_unacknowledged

檢視單個佇列的記憶體使用

# rabbitmqctl list_queues name memory

檢視準備就緒的佇列

# rabbitmqctl list_queues name messages_ready

在使用任何訊息中介軟體的過程中,難免會出現某條訊息異常丟失的情況。對於rabbitmq而言,可能是因為生產者或消費者與rabbitmq斷開了連線,而它們與rabbitmq又採用了不同的確認機制;也有可能是因為交換器與佇列之間不同的**策略;甚至是交換器並沒有與任何佇列進行繫結,生產者又不感知或者沒有採取相應的措施;另外rabbitmq本身的集群策略也可能導致訊息的丟失。這個時候就需要有乙個較好的機制跟蹤記錄訊息的投遞過程,以此協助開發和運維人員進行問題的定位。

在rabbitmq中可以使用firehose和rabbitmq_tracing外掛程式功能來實現訊息追蹤。

訊息追蹤-firehose

firehose的機制是將生產者投遞給rabbitmq的訊息,rabbitmq投遞給消費者的訊息按照指定的格式傳送到預設的exchange上。這個預設的exchange的名稱為amq.rabbitmq.trace,它是乙個topic型別的exchange。傳送到這個exchange上的訊息的routing key為 publish.exchangename 和deliver.queuename。其中exchangename和queuename為實際exchange和queue的名稱,分別對應生產者投遞到exchange的訊息,和消費者從queue上獲取的訊息。

注意:開啟 trace 會影響訊息寫入功能,適當開啟後請關閉。

rabbitmqctl trace_on:開啟firehose命令

rabbitmqctl trace_off:關閉firehose命令

訊息追蹤-rabbitmq_tracing

rabbitmq_tracing和firehose在實現上如出一轍,只不過rabbitmq_tracing的方式比firehose多了一層gui的包裝,更容易使用和管理。

啟用外掛程式:rabbitmq-plugins enable rabbitmq_tracing

100%確保訊息傳送成功

訊息補償

冪等性指一次和多次請求某乙個資源,對於資源本身應該具有同樣的結果。也就是說,其任

意多次執行對資源本身所產生的影響均與一次執行的影響相同。

在mq中指,消費多條相同的訊息,得到與消費該訊息一次相同的結果。

訊息中介軟體RabbitMQ

rabbitmq 是用erlang實現的乙個高併發高可靠amqp訊息佇列伺服器。rabbitmq 依賴於erlang環境,所以先要安裝erlang 執行 otp win32 r16b03.exe 再安裝rabbitmq 執行 rabbitmq server 3.2.3.exe 新增環境變數 rabb...

訊息中介軟體RabbitMQ

1非同步 不等待 2解耦 任務的序列變並行 3流量削峰 大任務量負載均衡 rabbitmq,kafka,flume amqp advanced message queue protocol 0 訊息 分為訊息頭和訊息體,訊息頭包含 路由鍵 routing key,優先順序priority,deliv...

訊息中介軟體RabbitMQ

1.1.為什麼使用訊息佇列 應用場景 常見的訊息中介軟體有?用於實現分布式系統模組與模組之間的訊息通訊。原理 原理就是生產者生產訊息,把訊息傳送給activemq。activemq接收到訊息,然後檢視有多少個消費者,然後把訊息 給消費者,此過程中生產者無需參與。消費者接收到訊息後做相應的處理和生產者...