RabbitMQ 入门:2. Exchange 和 Queue
上文RabbitMQ 入門:1. Message Broker(消息代理)提到過 RabbitMQ 實現(xiàn)了 AMQP 這個協(xié)議(RabbitMQ 所支持的 AMQP 的版本是 0.9.1),這個協(xié)議的內容很多,但為了構建入門級的分布式應用,我們只需要了解以下幾點即可。
?
在最簡單的場景下,RabbitMQ 的架構示意圖大致如下:
首先某個消息從發(fā)布者那里發(fā)往 ? ? RabbitMQ
這個消息需要聲明一個 Exchange(也可以翻譯成交換機),并被發(fā)往這個 ? ? Exchange
Exchange ? ? ?有點類似“暫存區(qū)”,消息都會發(fā)往 Exchange。用個類比來說:Exchange ? ? ?就像郵箱一樣,我們寫的信件首先都要放到郵箱里才能進行發(fā)送。
然后,Exchange ? ? 將使用消息內的一些信息以及它自己的配置來決定一條或多條發(fā)送消息的路由。
這些路由都通向一個 Queue(隊列),消息會存儲在這個 Queue 里,等待消息的接收者來進行使用。
一個消息的接收者可以使用 Queue 中的信息。一旦確認這個消息被傳遞成功,那么它將從 Queue 中被刪除。
RabbitMQ ? ? ?所提供的松耦合的特性,主要是因為 Exchange 和 Queue 的分離。
繼續(xù)使用郵箱的類比,Queue 就相當于是接收信件的郵箱。而根據(jù)郵件地址,郵件系統(tǒng)會選擇不同的郵箱來接收郵件。
?
而由于 RabbitMQ 處理的是消息,而不是信件,所以它的選項會更多:RabbitMQ 一共有 4 種 Exchange:
Direct Exchange。它是默認的 Exchange 。它會把消息發(fā)送到一個接收者。如果注冊了多個接收者來監(jiān)聽同樣的路由 Key,那么 ? ? RabbitMQ 將會向每個 Queue 輪流發(fā)送一條消息,相當于提供了一個簡單的負載均衡
Fanout Exchange。 它把消息的副本發(fā)送到每個綁定到該 ? ? Exchange 的 Queue 上面。而這里的 Queue 沒有辦法對消息進行過濾,如果需要過濾,則需要在消息接收者那里實現(xiàn)。
Topic Exchange。它和 Direct Exchange 類似,但不同的是:每個消息接收者監(jiān)聽特定的路由 Key,它們會收到消息的副本。
例如聊天室就可以使用 Topic ? ? ?Exchange。每個聊天室的 ID 可以作為路由 Key,這樣就可以保證消息只會發(fā)送給同一個聊天室的其他參與者。
Headers Exchange。這類 ? ? Exchange 會忽略路由 Key,取而代之的是,它們會查看消息的 Header,并由此來決定消息應該發(fā)往哪個 Queue。Queue 可以有一個或多個 Header 用來進行匹配。這也就開啟了復雜的路由場景,例如某個 Queue 有時可以接收到某類消息而有時則不行。
?
下面僅針對 Fanout Exchange 進行進一步說明:
?
Fanout Exchange
當消息被發(fā)往 RabbitMQ 的時候,需要指明它需要發(fā)送到哪個 Exchange。而這個Exchange 就可以被設置成為所謂的 Fanout Exchange。
使用 Fanout Exchange,消息會被克隆,并被發(fā)送到所有與這個 Exchange 綁定的 Queue 上,如下圖:
這里每一個 Queue 都會得到屬于自己的消息的副本,這些消息副本就i可以被消息的接收者所使用。
在很多大規(guī)模多人游戲的場景中,經常使用這種方式來同步玩家的數(shù)據(jù):每個玩家都訂閱到一個Fanout Exchange,你游戲的實例只需要將數(shù)據(jù)發(fā)送到一個地方即可,游戲中其他的玩家就會獲得更新,而你的游戲實例就不需要知道如何數(shù)據(jù)發(fā)往每一個玩家了。
總結
以上是生活随笔為你收集整理的RabbitMQ 入门:2. Exchange 和 Queue的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 Tye 辅助开发 k8s 应用竟如
- 下一篇: 聊聊Interlocked.Compar