使用RabbitMQ进行消息传递
RabbitMQ是一個(gè)強(qiáng)大的消息代理,可用于實(shí)現(xiàn)不同的消息傳遞模式。 即使有出色的教程 (使用不同的語(yǔ)言和框架),也很難理解這些概念。 在這篇文章中,我想展示一些可以用RabbitMQ實(shí)現(xiàn)的不同范例,以及為什么要為某些概念而苦惱。
使用隊(duì)列發(fā)送和接收
最簡(jiǎn)單的方法是使用隊(duì)列發(fā)送消息,并讓使用者從同一隊(duì)列中讀取數(shù)據(jù)。
沒(méi)有什么可以阻止您擁有多個(gè)使用者,每個(gè)使用者都可以處理隊(duì)列中的消息。 消耗完一條消息后,該消息將從隊(duì)列中消失。
當(dāng)有需要執(zhí)行的任務(wù)并且哪個(gè)消費(fèi)者處理任務(wù)無(wú)關(guān)緊要時(shí),這特別適合。
發(fā)布/訂閱
并非所有用例都只是想消耗一條消息的方式。 通常,您希望擁有多個(gè)應(yīng)該全部處理所有消息的使用者。 一個(gè)示例可以是將對(duì)象存儲(chǔ)在不同的數(shù)據(jù)存儲(chǔ)中(例如,搜索索引和數(shù)據(jù)庫(kù)),另一種是域事件,例如已提交并應(yīng)由訂單管理系統(tǒng)和庫(kù)存系統(tǒng)處理的訂單。 這需要一種發(fā)布/訂閱機(jī)制,RabbitMQ當(dāng)然已經(jīng)涵蓋了這一點(diǎn)。
與僅使用隊(duì)列相比,最大的區(qū)別是在這種情況下,生產(chǎn)者不再直接寫(xiě)隊(duì)列。 一個(gè)稱為Exchange的實(shí)例將接受郵件并將其轉(zhuǎn)發(fā)到一個(gè)或多個(gè)隊(duì)列。
要使用經(jīng)典的發(fā)布/訂閱模型,您可以使用FanoutExchange將消息轉(zhuǎn)發(fā)到一個(gè)或多個(gè)隊(duì)列。 要連接交換和隊(duì)列,您需要聲明一個(gè)綁定,在這種情況下,用于特定交換的所有消息都應(yīng)轉(zhuǎn)發(fā)到特定隊(duì)列。
每個(gè)使用者都從專用隊(duì)列中讀取消息。 這也意味著您將需要為每個(gè)正在監(jiān)聽(tīng)的使用者綁定一個(gè)綁定。
使用RabbitMQ,可以使用在使用者停止監(jiān)聽(tīng)時(shí)自動(dòng)刪除的隊(duì)列。 這允許消費(fèi)者加入和離開(kāi)時(shí)具有非常動(dòng)態(tài)的行為。
看我們的第一個(gè)示例,您可能想知道為什么有不同的方式來(lái)發(fā)送消息,發(fā)送隊(duì)列和進(jìn)行交換。 事實(shí)證明,發(fā)送到隊(duì)列確實(shí)是不可能的。 總是存在一個(gè)默認(rèn)交換,它僅轉(zhuǎn)發(fā)消息。 此默認(rèn)交換僅獲取消息的某個(gè)路由鍵(即隊(duì)列名稱),并將它們以相同的名稱放入隊(duì)列中。
發(fā)布/訂閱過(guò)濾
除了將消息發(fā)送到已注冊(cè)進(jìn)行交換的所有隊(duì)列之外,還可以根據(jù)路由密鑰對(duì)消息進(jìn)行過(guò)濾。 所有消息都被發(fā)送到一個(gè)交換機(jī),該交換機(jī)通過(guò)查看路由鍵來(lái)確定將消息發(fā)送到哪個(gè)隊(duì)列。
如果要與路由鍵完全匹配,請(qǐng)執(zhí)行DirectExchange。
將DirectExchange綁定到隊(duì)列時(shí),需要提供一個(gè)路由密鑰,該路由密鑰將確定將為此隊(duì)列考慮的路由密鑰。 如果要分配多個(gè)路由鍵,則可以為同一隊(duì)列添加多個(gè)綁定。
您還可以提供通配符來(lái)確定哪些路由鍵應(yīng)用于隊(duì)列,這是通過(guò)使用需要分層路由鍵的TopicExchange來(lái)完成的。
一開(kāi)始,這兩個(gè)交流-直接交流和主題交流-可能最讓我感到困惑。 當(dāng)涉及主題時(shí),我正在考慮經(jīng)典的發(fā)布訂閱系統(tǒng),例如使用FanoutExchange時(shí)。 交換名稱是客戶端正在注冊(cè)的主題。 但是這里的主題是指在現(xiàn)有交換機(jī)上的一種路由。 與DirectExchange相同:我希望直接交換類似于第一個(gè)示例,在第一個(gè)示例中,您直接將消息發(fā)送到隊(duì)列。 但是,在這種情況下,直接交換是指直接路由,因此您始終需要為此提供路由密鑰。
如果您想進(jìn)一步了解各種交流,請(qǐng)?jiān)L問(wèn)RabbitMQ網(wǎng)站上的教程 。
翻譯自: https://www.javacodegeeks.com/2018/03/messaging-with-rabbitmq-2.html
總結(jié)
以上是生活随笔為你收集整理的使用RabbitMQ进行消息传递的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux .img文件(linux .
- 下一篇: 安卓5.0(安卓5.)