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