RabbitMQ訊息機制的原理

2021-08-29 04:46:16 字數 2123 閱讀 3086

rabbitmq中,其通訊模式不再是傳統的伺服器\客戶端模型(b\s模型),而是一種新型的消費者、生產者和**的模型。

通訊過程:生產者(producer)負責建立訊息,並發布到**伺服器(rabbitmq)即可。消費者連線**伺服器,訂閱到自身的佇列(queue)上,即可消費自己關注的訊息。其中,訊息包含兩部分內容:有效載荷(payload)和標籤(label)。有效載荷就是真實需要傳輸的資料,而標籤用來標記訊息,讓rabbitmq將訊息傳送到感興趣的消費者。其流程大致如下:

無論是作為生產者,發布訊息之前,還是作為消費者,消費訊息之前,應用程式都需要和rabbit**伺服器建立一條tcp連線。而後,應用程式建立ampq通道將amqp命令傳送出去,實現發布訊息、訂閱佇列或接收訊息。通道是建立在「真實的」tcp連線內的虛擬連線。同時,每個通道將會被指派乙個唯一id。

為什麼需要通道,而不是通過tcp連線呢?主要原因在於對os(作業系統)而言建立和銷毀tcp的開銷非常昂貴。而當我們為所有執行緒只使用乙個tcp連線以滿足需求時,但又為了能確保每個執行緒的私密性,因此建立私密通訊路徑——通道。通道類似於使用的光纜,一根光纜代表tcp連線,而內部的不同光纖束代表不同的通道,保證通訊的高效進行。

amqp訊息路由包括三個部分:交換器、佇列和繫結。

對於佇列來說,消費者接收資訊一般有兩種方式:1)訂閱方式,採用basic.consume。只要有訊息來臨,消費者就會自動接收。2)單條接收,採用basic.get。消費者每次從佇列中只獲取一條資訊。另外,多個消費者可以訂閱同乙個佇列。

拒絕接收訊息的方式:

1.當消費者和rabbitmq伺服器斷開連線。rabbitqm自動會把訊息重新入隊,發給另外乙個消費者。

2.如果想要拒絕接收資訊,可以採用basic.reject的命令。當reject的requeue引數設定為true,rabbitmq會將訊息重新傳送給下乙個消費者,而設定為false,rabbitmmq會將訊息從佇列移除,不傳送給下乙個消費者。

對負載均衡來說,佇列是絕佳的方案。

作用:當想要將訊息傳送給佇列時,首先會傳送給交換器。然後根據確定的規則(路由鍵),決定訊息投遞到那個佇列/而佇列通過路由鍵繫結到交換器。

好處:1)可以完成不同的使用場景;2)對於傳送訊息給伺服器的發布者來說,無需關心服務的另外一端的邏輯(即佇列和消費者)。

交換器包括四種型別:direct、fanout、topic和headers。

為了將多個rabbit的客戶分開,rabbitmq提供了vhost的概念。vhost作用:通過在各個例項間提供邏輯上分離,使得不同應用程式安全保密的執行資料。不僅將統一rabbit的客戶區分開,而且避免佇列和交換器的命名衝突。因此,只需要執行乙個rabbit,然後按需啟動和關閉vhost。

檢視rabbit執行哪些vhost:rabbitmqctl list_vhosts

建立vhost:rabbitmqctl add_vhost [vhost_name]

刪除vhost:rabbitmqctl delete_vhost [vhost_name]

為了防止重啟和掉電而導致佇列和交換器消失,設定每個佇列和交換器的durable屬性為true。(注:這並不能保證資料不丟失。)

能從amqp伺服器崩潰中恢復資料,稱之為持久化訊息。為了達到這種目的,我們需要保證訊息:1)把它的投遞模式選項(delivery_mode)設定為2;2)傳送到持久化交換器;3)到達持久化佇列。

由於需要滿足上述三個條件,資料才能實現持久化。那麼如果當進行到第二步,出現宕機,訊息也同樣無法持久化。因此引入了另外兩種持久化方法:a)amqp事務;b)傳送方確認模式。一般情況,建議使用第二種。

amqp事務是將通道設定成事務模式,然後通過通道傳送所有想確認的訊息,一旦完成,提交事務。如果第一條命令執行失敗,後面的命令也將會被忽略。但是由於事務的粒度較粗,大大降低了rabbitmq的效率,因此引入了傳送方確認模式。

傳送方確認模式使得生產者可以非同步的傳送訊息,同時非同步的接收確認。如果訊息丟失,會收到乙個nack訊息,如果成功,則會收到乙個ack訊息。同時,沒有了訊息回滾的概念(同事務相比),使得對伺服器的效能影響可以忽略不計。

RabbitMQ訊息佇列 ACK機制

如果乙個consumer異常退出了,它處理的資料能夠被另外的consumer處理,這樣資料在這種情況下就不會丟失了 注意是這種情況下 為了保證資料不被丟失,rabbitmq支援訊息確認機制,即acknowledgments。為了保證資料能被正確處理而不僅僅是被consumer收到,那麼我們不能採用n...

RabbitMQ訊息應答 ack機制

執行乙個任務可能需要花費幾秒鐘,你可能會擔心如果乙個消費者在執行任務過程中掛掉了。一旦rabbitmq將訊息分發給了消費者,就會從記憶體中刪除。在這種情況下,如果正在執行任務的消費者宕機,會丟失正在處理的訊息和分發給這個消費者但尚未處理的訊息。但是,我們不想丟失任何任務,如果有乙個消費者掛掉了,那麼...

RabbitMQ訊息佇列 ACK機制

如果乙個consumer異常退出了,它處理的資料能夠被另外的consumer處理,這樣資料在這種情況下就不會丟失了 注意是這種情況下 為了保證資料不被丟失,rabbitmq支援訊息確認機制,即acknowledgments。為了保證資料能被正確處理而不僅僅是被consumer收到,那麼我們不能採用n...