【消息中間件】RabbitMQ入門基礎篇

一、消息通信模型

 

生產者創建消息,消費者接收這些消息。消息的媒介爲建立在真實TCP連接上的虛擬信道(channel)。

二、什麼是信道?爲什麼要建立信道?

發佈消息到RabbitMQ,首先需要先連接到RabbitMQ,才能消費或發佈消息。此時,在應用程序和RabbitMQ代理服務器之間創建一條TCP連接,一旦TCP連接打開(通過認證),應用程序就可以創建一條AMQP信道。信道是建立在"真實的"TCP連接內的虛擬連接。AMQP命令都是通過信道發送出去的。每條信道都會被指派一個唯一的ID(保存在AMQP庫)。

對操作系統來說,建立和銷燬TCP連接都是非常昂貴的開銷。且操作系統能建立的TCP連接是有限的,在高併發下,大量的線程需要大量的TCP連接,這時就遇到性能瓶頸了。信道就是爲了解決這一問題而產生的,線程啓動後建立會在現成的TCP連接上創建一條信道,也就獲得了連接到RabbitMQ上的私密通信路徑,而不會給操作系統的TCP棧造成額外負擔。並且在一條TCP連接上創建多少條信道是沒有限制的。

三、隊列

3.1、消費者如何從隊列獲取消息?

(1)推送模式。通過AMQP的basic.consume命令訂閱。消費者在消費(或拒絕)最近接收的那條消息後,就能從隊列中自動接收下一條消息。

(2)拉取模式。通過AMQP的basic.get命令可以向隊列請求單條消息。

3.2、消息到達無人訂閱的隊列後消息怎麼辦?

消息會在隊列中等待。一旦有消費者訂閱到該隊列,那麼隊列上的消息就會發送給消費者。

3.3、多個消息訂閱同一個隊列,消息如何分發?

當RabbitMQ隊列擁有多個消費者時,隊列收到的消息將循環(負載均衡)的方式發送給消費者。每條消息只會發送給一個訂閱的消費者。

3.4、消費者對消息的確認。

消費者接收到的每一條消息都必須進行確認,RabbitMQ接收到確認消費消息才能安全地把消息從隊列中刪除。

消息確認的兩種方式:

(1)通過AMQP的basic.ack命令顯示地向RabbitMQ發送一個確認。

(2)在訂閱隊列時將auto_ack設置爲true。

3.5、消費者處理消息時沒有確認消息怎麼辦?

(1)如果消費者收到一條消息,然後確認之前從RabbitMQ斷開連接(或者從隊列上取消訂閱),RabbitMQ會認爲這條消息沒有分發,然後重新分發給下一個訂閱消費者。

(2)如果應用程序忘記確認消息,RabbitMQ將不會給該消費者發送更多消息了。這是因爲在上一條消息被確認之前,RabbitMQ會認爲這個消費者沒有準備好接收下一條消息,直至上一條消息處理完成,收到響應。

(3)消費者拒絕消息。AMQP的basic.reject允許消費者拒絕RabbitMQ發送的消息。如果把reject命令的requeue參數設置成true,RabbitMQ會將消息重新發送給下一個訂閱的消費者。如果設置成false,RabbitMQ立即會把消息從隊列中移除,而不會把它發送給新的消費者。如果配置了死信隊列,拒絕的消息會被路由到死信隊列中。

死信隊列:用來存放那些被拒絕而不重新入隊列的消息。死信隊列讓你通過檢測拒絕或者未送達的消息來發現問題。

3.6、如何創建隊列?

消費者和生產者都能使用AMQP的queue.declare命令來創建隊列。

隊列參數:

exclusive----如果設置爲true,隊列將變成私有的,此時只有你的應用程序才能夠消費隊列消息。

auto-delete-----如果設置爲true,當最後一個消費者取消訂閱的時候,隊列就會自動移除。

3.7、重複聲明隊列會發生什麼?

如果聲明參數完全匹配現存的隊列的話,RabbitMQ什麼也不做,併成功返回,如果參數不匹配,隊列聲明失敗。

四、交換器(exchange)

4.1、消息是怎麼到達隊列的?

當把消息(帶有路由鍵【routing key】)發送到交換器時,RabbitMQ會根據路由鍵匹配隊列,匹配成功後,RabbitMQ將該消息投遞到匹配到的隊列。否則,消息將進入"黑洞",即丟失。

4.2、 交換器的類型

  • direct

    如果路由鍵匹配到的話,消息就被投遞到對應的隊列。

  • fanout

將收到的消息廣播到綁定的隊列上。

  • topic

    如果路由鍵匹配到的話,消息就被投遞到對應的隊列。路由鍵支持使用通配符去匹配。'*'匹配單個位置的文本,'#'匹配多個位置的文本。

  • headers

    通過AMQP消息的header匹配隊列而非路由鍵。

    direct和topic類型的區別是一個是精確匹配隊列,另一個是模糊匹配隊列。

五、虛擬主機(vhost)

        每一個RabbitMQ服務器都能創建虛擬消息服務器,即虛擬主機(vhost)。每一個vhost本質上是一個mini版的RabbitMQ服務器,擁有自己的隊列、交換器和綁定,自己的權限控制機制。vhost之於RabbitMQ就像虛擬機之於物理服務器一樣,它們通過各個實例間提供邏輯上分離,爲不同應用程序提供安全保密地運行數據。

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