(一)學習RabbitMQ基礎知識

本文爲學習筆記,主要用於記錄本人學習過程。內容爲轉載!!!!

什麼是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,將有效的均衡消費者的負載。

     本文部分轉載自http://blog.csdn.net/anzhsoft/article/details/19563091

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章