Vhost
虛擬主機(Virtual Host),類似于 Namespace 命名空間的概念,邏輯隔離,每個用戶里可以創建多個 Vhost,每個 Vhost 可以創建若干個 Exchange 和 Queue。
Queue
消息隊列,每個消息都會被投入到一個或者多個 Queue 里。
Producer
消息生產者,即投遞消息的程序。
Consumer
消息消費者,即接受消息的程序。
Connection
TCP 連接,Producer 或 Consumer 與消息隊列間的物理 TCP 連接。
Connection將應用與分布式消息服務RabbitMQ連接在一起。Connection會執行認證、IP解析、路由等底層網絡任務。應用與分布式消息服務RabbitMQ建立Connection需要多個TCP報文交互,因而會消耗較多的網絡資源和分布式消息服務RabbitMQ資源。大量的Connection會對分布式消息服務RabbitMQ造成巨大壓力,甚至觸發分布式消息服務RabbitMQ SYN洪水攻擊防護,導致分布式消息服務RabbitMQ無響應,進而影響業務。

Channel
在客戶端的每個物理 TCP 連接里,可建立多個 Channel,每個 Channel 代表一個會話任務。
Channel是物理TCP連接中的虛擬連接。當應用通過Connection與分布式消息服務RabbitMQ建立連接后,所有的AMQP協議操作(例如創建隊列、發送消息、接收消息等)都會通過Connection中的Channel完成。Channel可以復用Connection,即一個Connection下可以建立多個Channel。Channel不能脫離Connection獨立存在,而必須存活在Connection中。當某個Connection斷開時,該Connection下的所有Channel都會斷開。當大量應用需要與分布式消息服務RabbitMQ建立多個連接時,建議您使用Channel來復用Connection,從而減少網絡資源和分布式消息服務RabbitMQ資源消耗。

Connection和Channel的使用建議
保持Connection長連接,請勿頻繁開啟或關閉Connection。如果確實需要頻繁開啟或關閉連接,請使用Channel。
一個進程對應一個Connection,一個進程中的多個線程則分別對應一個Connection中的多個Channel。
Producer和Consumer分別使用不同的Connection進行消息發送和消費。
Exchange
Producer 將消息發送到 Exchange ,由 Exchange 將消息路由到一個或多個 Queue 中(或者丟棄),Exchange 按照相應的 Binding 邏輯將消息路由到 Queue。
Exchange 類型
- Fanout:該類型路由規則非常簡單,會把所有發送到該 Exchange 的消息路由到所有與它綁定的 Queue 中,相當于廣播功能。
適用于廣播消息的場景。
路由示例:
| Message | Routing Key | Binding Key | Queue |
|---|---|---|---|
| Message A | key.a | key.c.# key.e |
Queue A Queue B |
| Message B | key.b | key.c.# key.e |
Queue A Queue B |
- Direct:該類型路由規則會將消息路由到 Binding key 與 Routing key 完全匹配的 Queue 中。
適用于通過簡單字符標識符區分消息的場景,常用于單播路由。
匹配示例:
| Message | Routing Key | Binding Key | Queue |
|---|---|---|---|
| Message A | key.a | key.a | Queue A |
| Message B | key.b | key.b | Queue B |
- Topic:該類型與 Direct 類型相似,只是規則沒有那么嚴格,可以模糊匹配和多條件匹配,即該類型 Exchange 使用 Routing key 模式匹配和字符串比較的方式將消息路由至綁定的 Queue;
支持的通配符包括星號( )和井號(#)。星號( )代表一個英文單詞(例如cn)。井號(#)代表零個、一個或多個英文單詞,英文單詞間通過英文句號(.)分隔;適用于通過通配符區分消息的場景,常用于多播路由。
路由示例:
| Message | Routing Key | Binding Key | Queue |
|---|---|---|---|
| Message A | key.a.b | key.a.b.# | Queue A |
| Message B | key.a.b.c | key.a.b.# key.a.*.c |
Queue A Queue B |
| Message C | key.a.d.c | key.a.*.c | Queue B |
Binding
一套綁定規則,用于告訴 Exchange 消息應該被存儲到哪個 Queue。它的作用是把 Exchange 和 Queue 按照路由規則綁定起來。
Routing Key
Producer 在發送消息給 Exchange 時,需要指定一個 Routing key 來設定該消息的路由規則,而 Routing key 需要與 Exchange 類型及 Binding key 聯合使用才能生效;一般情況下,Exchange 類型與 Binding key 提供配置好,Producer 在發送消息給 Exchange 時,可以通過指定 Routing key 來決定消息投放到哪個 Queue。