RabbitMQ入門-相關概念介紹

   生產者和消費者
   隊列
   交換器、路由鍵、綁定
   RabbitMQ運轉流程
   連接和信道


   生產者和消費者

     生產者:Producer生產者,消息投遞方。
     生產者創建消息,然後發佈到RabbitMQ。消息一般分爲兩個部分:消息體和標籤。消息體可以稱爲payload,在實際應用中,消息體一般是一個帶有業務邏輯結構的數據,比如一個JSON字符串。可以進一步對這個消息體進行序列化操作,消息的標籤用來表述這條消息,比如一個交換器的名稱和一個路由鍵。生產者把消息由RabbitMQ,RabbitMQ會根據標籤把消息發送給感興趣的消費者。
     消費者:Consumer消費者,接受消息的一方。
     消費者連接到RabbitMQ服務器,並訂閱到隊列上。當消費者消費一條消息時,只是消費消息的消息體(payload)。在消息路由的過程中,消息的標籤會丟棄,存入到隊列中的消息只有消息體,消費者也只消費消息體。
     Broker:消息中間件服務點。
     對於RabbitMQ來說,一個RabbitMQ Broker可以簡單地看作一個RabbitMQ服務節點,或者RabbitMQ服務實例。大多數情況下也可以講一個RabbitMQ Broker看作一臺RabbitMQ服務器。
     生產者將消息存入RabbitMQ Broker,以及消費者從Broker消費數據流程:
                         在這裏插入圖片描述

  1. 生產者將業務數據進行可能的包裝封裝成消息,發送到Broker中
  2. 消費者訂閱並接受消息,經過可能的解包處理得到原始的數據,之後再進行業務邏輯(業務邏輯不一定需要和接受消息的邏輯使用同一線程,消費者進程可以使用一個線程去接受消息,存入到內存中,比如Java中的BlockingQueue,業務處理邏輯使用另一個線程從內存中讀取數據,這樣可以進一步解耦,提高整個應用的處理效率)。

   隊列
     RabbitMQ內部對象,用於存儲消息。RabbitMQ中消息都只存儲在隊列中,生產者生產消息最終投遞到隊列中,消費者從隊列中獲取消息消費。
     多個消費者可以訂閱同一個隊列,這時隊列的消息會被平均分攤(輪詢)給多個消費者進行處理,而不是每個消費者都可以收到所有的消息並處理。


   交換器、路由鍵、綁定

     Exchange:交換器。生產者發送消息流程爲:生產者將消息發送到Exchange,由交換器將消息路由到一個或多個隊列中。如果路由不到,丟棄或返回給生產者。
                                                  在這裏插入圖片描述
     RoutingKey:路由鍵。生產者將消息發送給交換器時,一般會指定一個RoutingKey,用來指定這個消息的路由規則,而這個RoutingKey需要與交換器類型和綁定鍵(BindingKey)聯合使用才能最終生效。
     Binding:綁定。RabbitMQ中通過綁定將交換器和隊列關聯起來,在綁定的時候一般會指定一個綁定鍵,這樣RabbitMQ就知道如何正確地將消息路由到隊列了。
;       ;       ;       ;       在這裏插入圖片描述
     生產者將消息發送給交換器時,需要一個RoutingKey,當BindingKey和RoutingKey相匹配時,消息會被路由到對應的隊列中。在綁定多個隊列在同一交換器時,這些綁定允許使用相同的BindingKey,fanout類型交換器會無視BindingKey,而是將消息路由到所有綁定到該交換器的隊列中。


   RabbitMQ運轉流程

     生產者發送消息:

  1. 生產者連接到RabbitMQ Broker,建立一個連接,開啓一個信道(Channel)。
  2. 生產者聲明一個交換器,並設置相關屬性,交換機類型,是否持久化等。
  3. 生產者聲明一個隊列並設置相關屬性,是否排他,是否持久化等。
  4. 生產者通過路由鍵將交換器和隊列綁定起來。
  5. 生產者發送消息至RabbitMQ Broker,其中包含路由鍵、交換器等信息。
  6. 相應的交換器根據接收到的路由鍵查找相匹配的隊列。
  7. 如果找到,則將從生產者發送過來的消息存入相應的隊列中。
  8. 如果沒找到,則根據生產者配置的屬性選擇丟棄還是會退給生產者。
  9. 關閉信道。
  10. 關閉連接。

     消費者接受消息:

  1. 消費者連接到RabbitMQ Broker,建立一個連接,開啓一個信道。
  2. 消費者向RabbitMQ Broker請求消費相應隊列中的消息,可能會設置相應的回調函數以及做一些準備工作。
  3. 等待RabbitMQ Broker迴應並投遞相應隊列中的消息,消費者接受消息。
  4. 消費者確認收到消息(ack)。
  5. RabbitMQ 從隊列中刪除相應以及被確認的消息。
  6. 關閉信道。
  7. 關閉連接。

   連接和信道

     無論是生產者還是消費者,都需要和RabbitMQ Broker建立連接,這個連接就是一條TCP連接,也就是Connection。一旦TCP連接建立起來,客戶端緊接着就可以創建一個AMQP信道(Channel),每個信道都會被指派一個唯一的ID,信道是建立在Connection之上的虛擬連接,RabbitMQ處理的每條AMQP指令都是通過信道完成的。
                                        在這裏插入圖片描述
信道(Channel)的引入:一個應用程序中有多個線程需要從RabbitMQ中消費消息或者生產消息,如果沒有Channel,必然會建立多個TCP連接,然而對於操作系統而言,建立和銷燬TCP連接是非常昂貴的開銷,如果需要高峯,性能瓶頸隨之顯現,RabbitMQ採用NIO的做法,選擇TCP連接複用,不僅可以減少開銷,同時也便於管理。
     每個線程把持一個信道,所以信道複用了Connection的TCP連接,同時RabbitMQ可以確保每個線程的私密性,就想擁有獨立的連接一樣。當每個信道的流量不是很大時,複用單一的Connection可以在產生性能瓶頸的情況下有效地節省TCP連接資源,但當信道本身流量很大時,這時候多個信道複用一個Connection就會產生性能瓶頸,此時就需要開闢多個Connection,將這些信道均攤到這些Connection中。

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