RabbitMQ 核心概念 以及 AMQP協議總結

     

目錄

AMQP協議模型

AMQP核心概念

Exchange 交換機

交換機屬性

Exchange Type屬性

Binding-綁定

Queue-消息隊列

Message-消息

Virtual host--虛擬機

Channel 和Connection

名詞解釋:


 

   AMQP[1],即Advanced Message Queuing Protocol,一個提供統一消息服務的應用層標準高級消息隊列協議,是應用層協議的一個開放標準,爲面向消息的中間件設計。基於此協議的客戶端與消息中間件可傳遞消息,並不受客戶端/中間件不同產品、不同開發語言等條件的限制

 

AMQP協議模型

AMQP核心概念

  1. server:  又稱Broker,接受客戶端的連接,實現AMQP實體服務
  2. connection: 連接,應用程序與Broker的網絡連接
  3. Channel :  網絡通道,幾乎所有的操作都是在channel中進行,channel是進行消息讀寫的通道,客戶端可以建立多個channel,每個channel代表一個會話任務。
  4.   Message:  消息,服務器和應用之間傳遞的數據,由Properties和Body組成。Properties可以對消息進行修飾,比如消息的優先級,延遲等高級特性;body是消息體內容
  5. Virtual host :虛擬地址,用於進行邏輯隔離,最上層的消息路由,一個Virtual host裏面可以有諾幹個Exchange和Queue,同一個Virtual host裏面不能有相同的Exchange或Queue
  6. Exchange:  交換機,接收消息,根據路由鍵轉發消息到綁定的queue
  7. Binding:Exchange和Queue之間的虛擬連接,binding中可以包含routing key
  8. Routing key:  一個路由規則,虛擬機可以用它來確定如何路由一個消息
  9. Queue:  也稱爲Message queue ,消息隊列 ,保存消息並將它們轉發給消費者

Exchange 交換機

接收消息,並根據路由鍵轉發消息所綁定的隊列

交換機屬性

name:交換機名稱

Type:交換機類型 direct,topic ,fanout , headers

Durability: 是否需要持久化 ,true 爲持久化

Auto Delete:當最後一個綁定到Exchange 上的隊列刪除後,自動刪除該Exchange

Inyternal :當前交換機是否用於RabbitMQ內部使用,默認爲false

Arguments:擴展參數,用戶擴展AMQP協議自制定化使用

 

Exchange Type屬性

direct模式可以使用rabbitMQ自帶的Exchange:default Exchange ,所以不需要Exchange 進行任何綁定(binding)操作,消息傳遞時,RouteKey必須完全匹配纔會被隊列接收,否則消息會被拋棄

 

*:匹配一個單詞

#:匹配一個或者讓多個單詞

不處理路由鍵,只需要簡單的將隊列綁定到交換機上

發送到交換機的消息都會轉發到與該交換機綁定的所有隊列上

Fanout交換機是發消息最快的

四種交換機Demo:https://blog.csdn.net/qq_33366229/article/details/104244756

Binding-綁定

Exchange和Exchange,queue之間的連接關係

Binding中可以包含routingKey或者參數

Queue-消息隊列

實際存儲消息數據

Durability:是否持久化,Durable:是,Transient::否

Auto delete:Yes,代表當最後一個監聽被移除後,該queue會被自動刪除(這裏對應着Exchange的Auto delete屬性)

Message-消息

服務器和應用程序之間傳遞的數據

本質上就是一段數據,由Properties和Body組成

常用屬性:delivery mode,headers(自定義屬性)

Virtual host--虛擬機

虛擬地址,用於進行邏輯隔離,最上層的消息路由,一個Virtual host裏面可以有諾幹個Exchange和Quewue,同一個Virtual host不能有相同的Exchange或者Queue

 

Channel 和Connection

      我們知道無論是生產者還是消費者,都需要和 RabbitMQ Broker 建立連接,這個連接就是一條 TCP 連接,也就是 Connection。一旦 TCP 連接建立起來,客戶端緊接着可以創建一個 AMQP 信道(Channel),每個信道都會被指派一個唯一的 ID。信道是建立在 Connection 之上的虛擬連接,RabbitMQ 處理的每條 AMQP 指令都是通過信道完成的。

我們完全可以使用 Connection 就能完成信道的工作,爲什麼還要引入信道呢?

試想這樣一個場景,一個應用程序中有很多個線程需要從 RabbitMQ 中消費消息,或者生產消息,那麼必然需要建立很多個 Connection,也就是多個 TCP 連接。

然而對於操作系統而言,建立和銷燬 TCP 連接是非常昂貴的開銷,如果遇到使用高峯,性能瓶頸也隨之顯現。

RabbitMQ 採用類似 NIO(Non-blocking I/O)的做法,選擇 TCP 連接複用,不僅可以減少性能開銷,同時也便於管理。

 

每個線程把持一個信道,所以信道複用了 Connection 的 TCP 連接。同時 RabbitMQ 可以確保每個線程的私密性,就像擁有獨立的連接一樣。當每個信道的流量不是很大時,複用單一的 Connection 可以在產生性能瓶頸的情況下有效地節省 TCP 連接資源。但是信道本身的流量很大時,這時候多個信道複用一個 Connection 就會產生性能瓶頸,進而使整體的流量被限制了。此時就需要開闢多個 Connection,將這些信道均攤到這些 Connection 中,至於這些相關的調優策略需要根據業務自身的實際情況進行調節。

 

信道在 AMQP 中是一個很重要的概念,大多數操作都是在信道這個層面展開的。

比如 channel.exchangeDeclare、channel.queueDeclare、channel.basicPublish、channel.basicConsume 等方法。

RabbitMQ 相關的 API 與 AMQP 緊密相連,比如 channel.basicPublish 對應 AMQP 的 Basic.Publish 命令。

 

名詞解釋:

NIO,也稱非阻塞 I/O,包含三大核心部分:Channel(信道)、Buffer(緩衝區)和 Selector(選擇器)。

NIO 基於 Channel 和 Buffer 進行操作,數據總是從信道讀取數據到緩衝區中,或者從緩衝區寫入到信道中。

Selector 用於監聽多個信道的時間(比如連接打開,數據到達等)。因此,單線程可以監聽多個數據的信道。

 

 

參考博客:https://www.cnblogs.com/eleven24/p/10326718.html

 

 

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