AMQP(高級消息隊列協議 Advanced Message Queue Protocol)服務器
AMQP當中有四個概念很是重要: 虛擬主機(virtual host),交換機(exchange),隊列(queue)和綁定(binding)。一個虛擬主機持有一組交換機、隊列和綁定。爲何須要多個虛擬主機呢?很簡單,RabbitMQ當中,用戶只能在虛擬主機的粒度進行權限控制。所以,若是須要禁止A組訪問B組的交換機/隊列/綁定,必須爲A和B分別創 建一個虛擬主機。每個RabbitMQ服務器都有一個默認的虛擬主機「/」。spa
Producer 要產生消息必需要建立一個 Exchange ,Exchange 用於轉發消息,可是它不會作存儲,若是沒有 Queue bind 到 Exchange 的話,它會直接丟棄掉 Producer 發送過來的消息,固然若是消息老是發送過去就被直接丟棄那就沒有什麼意思了,一個 Consumer 想要接受消息的話,就要建立一個 Queue ,並把這個 Queue bind 到指定的 Exchange 上,而後 Exchange 會把消息轉發到 Queue 那裏,Queue 會負責存儲消息,Consumer 能夠經過主動 Pop 或者是 Subscribe 以後被動回調的方式來從 Queue 中取得消息。
blog
Exchange,Queue,RoutingKey隊列
藍色-- Client(相對於Rabbitmq Server來講)ci
綠色--Exchange路由
紅色—Queue消息隊列
- 交換器(Exchange),它是發送消息的實體。權限控制
- 隊列(Queue),這是接收消息的實體。it
- 綁定器(Bind),將交換器和隊列鏈接起來,而且封裝消息的路由信息。io
Exchange指向Queue的黑色線—RoutingKey,能夠將它簡單的理解爲一條鏈接Exchange和Queue的路線
Exchange和Queue都須要經過channel來進行定義,而RoutingKey則只須要在binding時取個名字就好了。
這一塊的理解是不正確的,
Exchange Queue RoutingKey關係說明:
Exchange Name |
Queue Name |
Routing Key |
|
test.queue |
test.queue |
|
test.queue2 |
test.queue2 |
test.exchange |
test.queue |
test.routingkey |
test.exchange |
test.queue2 |
test.routingkey |
test.exchange |
test.queue |
test.routingkey2 |
test.exchange1 |
test.queue |
test.routingkey |
由結果能夠看出,由Exchange,Queue,RoutingKey三個才能決定一個從Exchange到Queue的惟一的線路。
左邊的Client向右邊的Client發送消息,流程:
1, 獲取Conection
2, 獲取Channel
3, 定義Exchange,Queue
4, 使用一個RoutingKey將Queue Binding到一個Exchange上
5, 經過指定一個Exchange和一個RoutingKey來將消息發送到對應的Queue上,
6, 接收方在接收時也是獲取connection,接着獲取channel,而後指定一個Queue直接到它關心的Queue上取消息,它對Exchange,RoutingKey及如何binding都不關心,到對應的Queue上去取消息就OK了
一個Client發送消息,哪些Client能夠收到消息,其核心就在於Exchange,RoutingKey,Queue的關係上。
|
Exchange |
RoutingKey |
Queue |
1 |
E1 |
R1 |
Q1 |
2 |
|
R2 |
Q2 |
3 |
E2 |
R3 |
Q1 |
4 |
|
R4 |
Q2 |
5 |
E1 |
R5 |
Q1 |
6 |
E2 |
R6 |
Q1 |
咱們能夠這樣理解,RoutingKey就像是個中間表,將兩個表的數據進行多對多關聯,只不過對於相同的Exchange和Queue,可使用不一樣的RoutingKey重複關聯屢次。