什麼是mq?
mq全稱為message queue,訊息佇列(mq)是一種應用程式對應用程式的通訊方法。mq是消費-生產者模型的乙個典型的代表,一端往訊息佇列中不斷寫入訊息,而另一端則可以讀取佇列中的訊息。
rabbitmq是mq的一種。下面詳細介紹一下rabbitmq的基本概念。
1、佇列、生產者、消費者
佇列是rabbitmq的內部物件,用於儲存訊息。生產者(下圖中的p)生產訊息並投遞到佇列中,消費者(下圖中的c)可以從佇列中獲取訊息並消費。
多個消費者可以訂閱同乙個佇列,這時佇列中的訊息會被平均分攤給多個消費者進行處理,而不是每個消費者都收到所有的訊息並處理。
2、exchange、binding
剛才我們看到生產者將訊息投遞到佇列中,實際上這在rabbitmq中這種事情永遠都不會發生。實際的情況是,生產者將訊息傳送到exchange(交換器,下圖中的x),再通過binding將exchange與queue關聯起來。
3、exchange type、bingding key、routing key
在繫結(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模式匹配的佇列中。
附上一張rabbitmq的結構圖:
最後來具體解析一下幾個問題:
1、可以自動建立佇列,也可以手動建立佇列,如果自動建立佇列,那麼是誰負責建立佇列呢?是生產者?還是消費者?
如果佇列不存在,當然消費者不會收到任何的訊息。但是如果佇列不存在,那麼生產者傳送的訊息就會丟失。所以,為了資料不丟失,消費者和生產者都可以建立佇列。那麼如果建立乙個已經存在的佇列呢?那麼不會有任何的影響。需要注意的是沒有任何的影響,也就是說第二次建立如果引數和第一次不一樣,那麼該操作雖然成功,但是佇列屬性並不會改變。
佇列對於負載均衡的處理是完美的。對於多個消費者來說,rabbitmq使用輪詢的方式均衡的傳送給不同的消費者。
2、rabbitmq的訊息確認機制
預設情況下,如果訊息已經被某個消費者正確的接收到了,那麼該訊息就會被從佇列中移除。當然也可以讓同乙個訊息傳送到很多的消費者。
如果乙個佇列沒有消費者,那麼,如果這個佇列有資料到達,那麼這個資料會被快取,不會被丟棄。當有消費者時,這個資料會被立即傳送到這個消費者,這個資料被消費者正確收到時,這個資料就被從佇列中刪除。
那麼什麼是正確收到呢?通過ack。每個訊息都要被acknowledged(確認,ack)。我們可以顯示的在程式中去ack,也可以自動的ack。如果有資料沒有被ack,那麼:
rabbitmq server會把這個資訊傳送到下乙個消費者。
如果這個app有bug,忘記了ack,那麼rabbitmqserver不會再傳送資料給它,因為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基礎知識詳解
什麼是mq?mq全稱為message queue,訊息佇列 mq 是一種應用程式對應用程式的通訊方法。mq是消費 生產者模型的乙個典型的代表,一端往訊息佇列中不斷寫入訊息,而另一端則可以讀取佇列中的訊息。rabbitmq是mq的一種。下面詳細介紹一下rabbitmq的基本概念。1 佇列 生產者 消費...