rabbitmq 實現原理


AMQP(高級消息隊列協議 Advanced Message Queue Protocol)

AMQP當中有四個概念非常重要: 虛擬主機(virtual host),交換機(exchange),隊列(queue)和綁定(binding)。一個虛擬主機持有一組交換機、隊列和綁定。為什么需要多個虛擬主機呢?很簡單,RabbitMQ當中,用戶只能在虛擬主機的粒度進行權限控制。因此,如果需要禁止A組訪問B組的交換機/隊列/綁定,必須為A和B分別創 建一個虛擬主機。每一個RabbitMQ服務器都有一個默認的虛擬主機“/”。

Producer 要產生消息必須要創建一個 Exchange ,Exchange 用於轉發消息,但是它不會做存儲,如果沒有 Queue bind 到 Exchange 的話,它會直接丟棄掉 Producer 發送過來的消息,當然如果消息總是發送過去就被直接丟棄那就沒有什么意思了,一個 Consumer 想要接受消息的話,就要創建一個 Queue ,並把這個 Queue bind 到指定的 Exchange 上,然后 Exchange 會把消息轉發到 Queue 那里,Queue 會負責存儲消息,Consumer 可以通過主動 Pop 或者是 Subscribe 之后被動回調的方式來從 Queue 中取得消息。

 

Exchange,Queue,RoutingKey

 

藍色-- Client(相對於Rabbitmq Server來說)

綠色--Exchange

紅色—Queue

     - 交換器(Exchange),它是發送消息的實體。

     - 隊列(Queue),這是接收消息的實體。

     - 綁定器(Bind),將交換器和隊列連接起來,並且封裝消息的路由信息。

 

Exchange指向Queue的黑色線—RoutingKey,可以將它簡單的理解為一條連接ExchangeQueue的路線

 

ExchangeQueue都需要通過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

 

由結果可以看出,由ExchangeQueueRoutingKey三個才能決定一個從Exchange到Queue的唯一的線路。

 

 

 

 

左邊的Client向右邊的Client發送消息,流程:

 

1,  獲取Conection

 

2,  獲取Channel

 

3,  定義ExchangeQueue

 

4,  使用一個RoutingKeyQueue Binding到一個Exchange

 

5,  通過指定一個Exchange和一個RoutingKey來將消息發送到對應的Queue上,

 

6,  接收方在接收時也是獲取connection,接着獲取channel,然后指定一個Queue直接到它關心的Queue上取消息,它對ExchangeRoutingKey及如何binding都不關心,到對應的Queue上去取消息就OK

 

一個Client發送消息,哪些Client可以收到消息,其核心就在於ExchangeRoutingKeyQueue的關系上。

 

 

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就像是個中間表,將兩個表的數據進行多對多關聯,只不過對於相同的ExchangeQueue,可以使用不同的RoutingKey重復關聯多次。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM