RabbitMQ基礎知識詳解

2021-08-30 17:37:15 字數 1925 閱讀 2272

什麼是mq?

mq全稱為message queue, 訊息佇列(mq)是一種應用程式對應用程式的通訊方法。mq是消費-生產者模型的乙個典型的代表,一端往訊息佇列中不斷寫入訊息,而另一端則可以讀取佇列中的訊息。

rabbitmq是mq的一種。下面詳細介紹一下rabbitmq的基本概念。

1、佇列、生產者、消費者

佇列是rabbitmq的內部物件,用於儲存訊息。生產者(下圖中的p)生產訊息並投遞到佇列中,消費者(下圖中的c)可以從佇列中獲取訊息並消費。

多個消費者可以訂閱同乙個佇列,這時佇列中的訊息會被平均分攤給多個消費者進行處理,而不是每個消費者都收到所有的訊息並處理。

剛才我們看到生產者將訊息投遞到佇列中,實際上這在rabbitmq中這種事情永遠都不會發生。實際的情況是,生產者將訊息傳送到exchange(交換器,下圖中的x),再通過binding將exchange與queue關聯起來。

在繫結(binding)exchange與queue的同時,一般會指定乙個binding key。在繫結多個queue到同乙個exchange的時候,這些binding允許使用相同的binding key。

生產者在將訊息傳送給exchange的時候,一般會指定乙個routing key,來指定這個訊息的路由規則,生產者就可以在傳送訊息給exchange時,通過指定routing key來決定訊息流向**。

rabbitmq常用的exchange type有三種:fanout、direct、topic。

fanout:把所有傳送到該exchange的訊息投遞到所有與它繫結的佇列中。

direct:把訊息投遞到那些binding key與routing key完全匹配的佇列中。

topic:將訊息路由到binding key與routing key模式匹配的佇列中。

最後來具體解析一下幾個問題:

1、可以自動建立佇列,也可以手動建立佇列,如果自動建立佇列,那麼是誰負責建立佇列呢?是生產者?還是消費者? 

如果佇列不存在,當然消費者不會收到任何的訊息。但是如果佇列不存在,那麼生產者傳送的訊息就會丟失。所以,為了資料不丟失,消費者和生產者都可以建立佇列。那麼如果建立乙個已經存在的佇列呢?那麼不會有任何的影響。需要注意的是沒有任何的影響,也就是說第二次建立如果引數和第一次不一樣,那麼該操作雖然成功,但是佇列屬性並不會改變。

佇列對於負載均衡的處理是完美的。對於多個消費者來說,rabbitmq使用輪詢的方式均衡的傳送給不同的消費者。

2、rabbitmq的訊息確認機制

預設情況下,如果訊息已經被某個消費者正確的接收到了,那麼該訊息就會被從佇列中移除。當然也可以讓同乙個訊息傳送到很多的消費者。

那麼什麼是正確收到呢?通過ack。每個訊息都要被acknowledged(確認,ack)。我們可以顯示的在程式中去ack,也可以自動的ack。如果有資料沒有被ack,那麼:

rabbitmq server會把這個資訊傳送到下乙個消費者。

而且ack的機制可以起到限流的作用(benefitto throttling):在消費者處理完成資料後傳送ack,甚至在額外的延時後傳送ack,將有效的均衡消費者的負載。

RabbitMQ基礎知識詳解

什麼是mq?mq全稱為message queue,訊息佇列 mq 是一種應用程式對應用程式的通訊方法。mq是消費 生產者模型的乙個典型的代表,一端往訊息佇列中不斷寫入訊息,而另一端則可以讀取佇列中的訊息。rabbitmq是mq的一種。下面詳細介紹一下rabbitmq的基本概念。1 佇列 生產者 消費...

RabbitMQ基礎知識詳解

什麼是mq?mq全稱為message queue,訊息佇列 mq 是一種應用程式對應用程式的通訊方法。mq是消費 生產者模型的乙個典型的代表,一端往訊息佇列中不斷寫入訊息,而另一端則可以讀取佇列中的訊息。rabbitmq是mq的一種。下面詳細介紹一下rabbitmq的基本概念。1 佇列 生產者 消費...

RabbitMQ基礎知識詳解

2017年08月28日 20 42 57 dreamchasering 閱讀數 41890 標籤 rabbitmq 什麼是mq?mq全稱為message queue,訊息佇列 mq 是一種應用程式對應用程式的通訊方法。mq是消費 生產者模型的乙個典型的代表,一端往訊息佇列中不斷寫入訊息,而另一端則可...