Connection和Channel
本文介紹云消息隊列 RabbitMQ 版中Connection和Channel的概念及其使用建議。
Connection
Connection是物理TCP連接。Connection將應用與云消息隊列 RabbitMQ 版連接在一起。Connection會執行認證、IP解析、路由等底層網絡任務。應用與云消息隊列 RabbitMQ 版完成Connection建立大約需要15個TCP報文交互,因而會消耗大量的網絡資源和云消息隊列 RabbitMQ 版資源。大量的Connection會對云消息隊列 RabbitMQ 版造成巨大壓力,甚至觸發云消息隊列 RabbitMQ 版SYN洪水攻擊防護,導致云消息隊列 RabbitMQ 版無響應,進而影響您的業務。
Channel
Channel是物理TCP連接中的虛擬連接。當應用通過Connection與云消息隊列 RabbitMQ 版建立連接后,所有的AMQP協議操作(例如創建隊列、發送消息、接收消息等)都會通過Connection中的Channel完成。Channel可以復用Connection,即一個Connection下可以建立多個Channel。Channel不能脫離Connection獨立存在,而必須存活在Connection中。當某個Connection斷開時,該Connection下的所有Channel都會斷開。當大量應用需要與云消息隊列 RabbitMQ 版建立多個連接時,建議您使用Channel來復用Connection,從而減少網絡資源和云消息隊列 RabbitMQ 版資源消耗。
使用建議
保持Connection長連接,請勿頻繁開啟或關閉Connection。如果確實需要頻繁開啟或關閉連接,請使用Channel。單實例開啟Connection或Channel的接口限制,請參見使用限制。
Connection數量較少而消費的數據量較大時,可能會出現消費傾斜問題,您可以在保證每個消費者Connection數一致的同時,增加每個消費者的Connection數或增加消費者數量。建議所有消費者的Connection之和大于30。
多個進程可以共享同一個Connection,共享時請不要頻繁建立和關閉Connection,否則可能會出現
ChannelNotFind
錯誤。Producer和Consumer分別使用不同的Connection進行消息發送和消費。