rabbitMq信道(channel)

1.與Rabbitmq Broker建立連接,這連接就是一個TCP連接,也就是connection.

2.建立TCP連接後,客戶端可以創建一個AMQP信道(Channel),每個信道都會被指派一個唯一的ID。信道是建立在Connection之上的虛擬連接,RabbitMq處理的每條AMQP指令都是通過信道完成的。

3.Connection可以創建多個Channel實例,但是Channel實例不能在線程間共享,應用程序應該爲每一個線程開闢一個Channel。多線程間共享Channel實例是非線程安全的(1.導致在網絡上出現錯誤的通信幀交錯 2.也會影響發送方確認機制的運行)

4.Channel或者Connection中有個isOpen方法可以用來檢測是否處於開啓狀態。(並不推薦在線上代碼使用,這個方法返回值依賴於shutdownCaunse的存在,有可能會產生競爭)

5.通常情況下,在調用createXXX或者newXXX方法之後,我們可以簡單滴認爲Connection或者Channel已經成功地處於開啓狀態,而並不會在代碼中使用isOpen這個檢測方法。如果在使用Channel的時候其已經處於關閉狀態,那麼程序會拋出一個com.rabbitmq.cilent.ShutdownSignalException,我們只需要捕獲這個異常即可。當然同時也要試着捕獲IOException或者SocketException,以防Connetion意外關閉。

 

使用延伸:

多個TCP連接的建立和銷燬是非常昂貴的開銷,如果遇到使用高峯,性能瓶頸也隨之顯現。RabbitMq採用類似NIO(非阻塞I/O,包含核心三大部分:Channel信道、Buffer緩衝區和Seletor選擇器。NIO基於Channel和Buffer進行操作,數據總是從信道讀取數據到緩衝區,或者從緩衝區寫去到信道中。Seletor用於監聽多個信道的事件(比如鏈接打開,數據到達等)。因此,單線程可以監聽多個數據的信道)的做法,選擇TCP連接複用,不僅可以減少性能開銷,同時也便於管理。

 

1.每個線程把持一個信道,信道複用了Cnnection的TCP連接。同時RabbitMq可以確保每個線程的私密性,就像擁有獨立的連接一樣。

2.但當每個信道的流量很大時,這時候需要開闢多個Connection,將這些信道均攤到這個TCP連接中,否則導致整個Connection連接的流量被限制。

3.總之就是根據自身情況調節:一個連接多個信道、一個信道多個消息、多個連接多個信道

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