rabbitmq的相關知識

2022-09-23 04:42:10 字數 1863 閱讀 1681

rabbitmq使用傳送方確認模式,確保訊息正確地傳送到rabbitmq。

傳送方確認模式:將通道設定成confirm模式(傳送方確認模式),則所有在通道上釋出的訊息都會被指派一個唯一的id。一旦訊息被投遞到目的佇列後,或者訊息被寫入磁碟後(可持久化的訊息),通道會傳送一個確認給生產者(包含訊息唯一id)。如果rabbitmq發生內部錯誤從而導致訊息丟失,會傳送一條nack(not acknowledged,未確認)訊息。

傳送方確認模式是非同步的,生產者應用程式在等待確認的同時,可以繼續傳送訊息。當確認訊息到達生產者應用程式,生產者應用程式的**方法就會被觸發來處理確認訊息。

接收方訊息確認機制:消費者接收每一條訊息後都必須進行確認(訊息接收和訊息確認是兩個不同操作)。只有消費者確認了訊息,rabbitmq才能安全地把訊息從佇列中刪除。

這裡並沒有用到超時機制,rabbitmq僅通過consumer的連線中斷來確認是否需要重新傳送訊息。也就是說,只要連線不中斷,rabbitmq給了consumer足夠長的時間來處理訊息。

下面羅列幾種特殊情況:

在訊息生產時,mq內部針對每條生產者傳送的訊息生成一個inner-msg-id,作為去重和冪等的依據(訊息投遞失敗並重傳),避免重複的訊息進入佇列;在訊息消費時,要求訊息體中必須要有一個bizid(對於同一業務全域性唯一,如支付id、訂單id、帖子id等)作為去重和冪等的依據,避免同一條訊息被重複消費。

由於tcp連線的建立和銷燬開銷較大,且併發數受系統資源限制,會造成效能瓶頸。rabbitmq使用通道的方式來傳輸資料。通道是建立在真實的tcp連線內的虛擬連線,且每條tcp連線上的通道數量沒有限制。

若該佇列至少有一個消費者訂閱,訊息將以迴圈(round-robin)的方式傳送給消費者。每條訊息只會分發給一個訂閱的消費者(前提是消費者能夠正常處理訊息並進行確認)。

從概念上來說,訊息路由必須有三部分:交換器、路由、繫結。生產者把訊息釋出到交換器上;繫結決定了訊息如何從路由器路由到特定的佇列;訊息最終到達佇列,並被消費者接收。

訊息釋出到交換器時,訊息將擁有一個路由鍵(routing key),在訊息建立時設定。

通過佇列路由鍵,可以把佇列繫結到交換器上。

訊息到達交換器後,rabbitmq會將訊息的路由鍵與佇列的路由鍵進行匹配(針對不同的交換器有不同的路由規則)。如果能夠匹配到佇列,則訊息會投遞到相應佇列中;如果不能匹配到任何佇列,訊息將進入 “黑洞”。

常用的交換器主要分為一下三種:

訊息持久化的前提是:將交換器/佇列的durable屬性設定為true,表示交換器/佇列是持久交換器/佇列,在伺服器崩潰或重啟之後不需要重新建立交換器/佇列(交換器/佇列會自動建立)。

如果訊息想要從rabbit崩潰中恢復,那麼訊息必須:

rabbitmq確保永續性訊息能從伺服器重啟中恢復的方式是,將它們寫入磁碟上的一個持久化日誌檔案,當釋出一條永續性訊息到持久交換器上時,rabbit會在訊息提交到日誌檔案後才傳送響應(如果訊息路由到了非持久佇列,它會自動從持久化日誌中移除)。一旦消費者從持久佇列中消費了一條持久化訊息,rabbitmq會在持久化日誌中把這條訊息標記為等待垃圾收集。如果持久化訊息在被消費之前rabbitmq重啟,那麼rabbit會自動重建交換器和佇列(以及繫結),並重播持久化日誌檔案中的訊息到合適的佇列或者交換器上。

rabbitmq是訊息投遞服務,在應用程式和伺服器之間扮演路由器的角色,而應用程式或伺服器可以傳送和接收包裹。其通訊方式是一種 “發後即忘(fire-and-forget)” 的單向方式。

其中訊息包含兩部分內容:有效載荷(payload)和標籤(label)

有效載荷是需要傳輸的資料,可以是任意內容。

標籤描述了有效載荷,rabbitmq會根據標籤的描述,把訊息傳送給感興趣的接收方。

RabbitMQ RabbitMQ的一些基礎概念

工作中使用的是rabbitmq,需要對其進行熟悉。使用之前,弄清楚它是什麼東西,解決什麼問題。 開發中,有一些任務並無須實時執行,比如 如上...

RabbitMQ的應用

1 安裝 如果有docker,可以通過docker來安裝,命令 docker run it rm name rabbitmq p 5672...

RabbitMQ的安裝

所以在安裝rabbitmq之前,需要先安裝erlang 。 全部點選 下一步 就行。 有的選擇其他的安裝方式,可能需要新增一下系統環境變數...