RabbitMQ 中 Connection 和 Channel 詳解

咱們知道不管是生產者仍是消費者,都須要和 RabbitMQ Broker 創建鏈接,這個鏈接就是一條 TCP 鏈接,也就是 Connection。性能

一旦 TCP 鏈接創建起來,客戶端緊接着能夠建立一個 AMQP 信道(Channel),每一個信道都會被指派一個惟一的 ID。操作系統

信道是創建在 Connection 之上的虛擬鏈接,RabbitMQ 處理的每條 AMQP 指令都是經過信道完成的。線程

 

 

咱們徹底可使用 Connection 就能完成信道的工做,爲何還要引入信道呢?3d

試想這樣一個場景,一個應用程序中有不少個線程須要從 RabbitMQ 中消費消息,或者生產消息,那麼必然須要創建不少個 Connection,也就是多個 TCP 鏈接。blog

然而對於操做系統而言,創建和銷燬 TCP 鏈接是很是昂貴的開銷,若是遇到使用高峯,性能瓶頸也隨之顯現。資源

RabbitMQ 採用相似 NIO(Non-blocking I/O)的作法,選擇 TCP 鏈接複用,不只能夠減小性能開銷,同時也便於管理。it

 

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

 

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

好比 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 用於監聽多個信道的時間(好比鏈接打開,數據到達等)。所以,單線程能夠監聽多個數據的信道。

相關文章
相關標籤/搜索