RabbitMQ 實現原理

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重複關聯屢次。

相關文章
相關標籤/搜索