狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

[轉(zhuǎn)帖]RabbitMQ之消息模式簡單易懂,超詳細(xì)分享

freeflydom
2023年5月19日 18:20 本文熱度 1653

前言

上一篇對RabbitMQ的流程和相關(guān)的理論進(jìn)行初步的概述,如果小伙伴之前對消息隊(duì)列不是很了解,那么在看理論時會有些困惑,這里以消息模式為切入點(diǎn),結(jié)合理論細(xì)節(jié)和代碼實(shí)踐的方式一起來學(xué)習(xí)。

正文

常用的模式有Simple、Work、Fanout、Direct、Topic、Headers,可以通過設(shè)置交換機(jī)類型和配置參數(shù)來實(shí)現(xiàn)各個模式;接下來就分別進(jìn)行實(shí)操演示吧。

以下演示都是通過管理員的賬號進(jìn)行。其實(shí)每種模式其實(shí)很大一部分操作都是一樣的,所以公共部分不會重復(fù)截圖說明,不過會針對不同的配置進(jìn)行說明。

1. 簡單模式(Simple)

簡單模式顧名思義就是簡單,不用配置太多的東西,如下圖所示:

上圖解析:

  • P:表示生產(chǎn)者,負(fù)責(zé)推送消息;

  • C:表示消費(fèi)者,負(fù)責(zé)接收消息;

  • 中間紅色部分:代表的是隊(duì)列(Queue);

小伙伴可能會奇怪,這里沒有交換機(jī)嗎?

其實(shí)是有的,上一篇說流程的時候,消息肯定是要通過交換機(jī)轉(zhuǎn)發(fā)到隊(duì)列中的,這里沒有指定,那是因?yàn)橛玫搅四J(rèn)的交換機(jī),具體看以下演示。

1.1 Web管理界面進(jìn)行演示

對于Web界面演示來說,只需要將消息能生產(chǎn)、投遞、消費(fèi)即可,我們不用去弄一個生產(chǎn)者和消費(fèi)者,生產(chǎn)者和消費(fèi)者都是業(yè)務(wù)處理邏輯用的,所以通常都是根據(jù)業(yè)務(wù)需求就行實(shí)現(xiàn)的;話不多說開始演示吧。

根據(jù)上圖所示,我們只需要創(chuàng)建一個隊(duì)列即可,然后就可以進(jìn)行消息模擬發(fā)送和消費(fèi)了。

此時并沒有指定交換機(jī)綁定,點(diǎn)擊隊(duì)列名看詳情中的Bindings,有一個默認(rèn)的交換機(jī)已經(jīng)和隊(duì)列進(jìn)行綁定

隊(duì)列詳情頁面的說明,在上篇文章中就已經(jīng)標(biāo)注了,這里就不再贅述。

有了綁定關(guān)系之后,就可以在默認(rèn)的交換機(jī)頁面開始模擬轉(zhuǎn)發(fā)消息;首先進(jìn)入Exchanges管理頁面,點(diǎn)擊默認(rèn)交換機(jī)(AMQP default)進(jìn)入詳情開始發(fā)布消息:

消息發(fā)送成功之后就會在隊(duì)列界面看到消息情況:

隊(duì)列里面有了消息之后,就可以模擬消費(fèi)者進(jìn)行消息消費(fèi),點(diǎn)擊隊(duì)列名進(jìn)入詳情,可在詳情也模擬消費(fèi):

如上所示,簡單模式整個消費(fèi)流程就通過Web頁面模擬完了。但在消費(fèi)消息時,提供了Ack Mode模式(消息確認(rèn)模式)選擇來進(jìn)行消費(fèi),可選擇的模式如下:

  • Nack message requeue true:獲取消息,但是不會向Server做ack應(yīng)答確認(rèn)(即不告訴服務(wù)器消息被消費(fèi)了),消息重新入隊(duì)。即隊(duì)列中的消息不會被刪除掉;

  • Automatic Ack:獲取消息,向Server做應(yīng)答確認(rèn)(即會告訴服務(wù)器消息被消費(fèi)了),消息不重新入隊(duì),將會從隊(duì)列中刪除;

  • Reject requeue true:拒絕獲取消息(即拒絕處理消息),消息重新入隊(duì);

  • Reject requeue false:拒絕獲取消息(即拒絕處理消息),消息不重新入隊(duì),將會被刪除;

到這關(guān)于簡單模式下的界面演示就結(jié)束了,其中描述的細(xì)節(jié)內(nèi)容是共用的,在其他模式下的操作也類似,后續(xù)不做重復(fù)說明。

1.2 代碼進(jìn)行演示

這里就用控制臺的方式,一步一步的實(shí)現(xiàn)。這里需要引入Nuget包:RabbitMQ.Client。生產(chǎn)者的整體代碼如下:

接下來就一步一步來調(diào)試,看看消息是怎么一步一步發(fā)出去的;

  • 創(chuàng)建連接

    剛開始沒有任何連接,如下:

    代碼繼續(xù)下一步,連接就有了:

    此時就可以理解為網(wǎng)絡(luò)連接上了,但通道還沒有創(chuàng)建出來,如下:

  • 根據(jù)連接創(chuàng)建通道

    通道根據(jù)連接進(jìn)行創(chuàng)建,目的是為了提高傳輸效率,共用一個連接,不然頻繁的創(chuàng)建和銷毀連接會占資源,影響性能

  • 定義隊(duì)列

    有連接和通道之后理論就可以直接發(fā)消息了,但直接通信會相互依賴比較強(qiáng),達(dá)不到解耦合的效果。所以需要定義一個隊(duì)列將消息存放到里面,客戶端想用了自己來消費(fèi)就行,另外隊(duì)列還可以達(dá)到一定的削峰作用

    創(chuàng)建隊(duì)列的時候需要傳幾個參數(shù),分別意思如下:

    參數(shù)1:queue, 隊(duì)列的名稱;

    參數(shù)2:durable, 隊(duì)列是否持久化;如果為true,服務(wù)器重啟之后隊(duì)列還在,不會被清除;否則就被清掉。

    參數(shù)3:exclusive ,是否排他,即是否私有的,如果為true,會對當(dāng)前隊(duì)列加鎖,其他的通道不能訪問,并且連接自動關(guān)閉;

    參數(shù)4:autodelete, 是否自動刪除,當(dāng)最后一個消費(fèi)者斷開連接之后是否自動刪除消息;

    參數(shù)5:arguments, 用來設(shè)置隊(duì)列附加參數(shù),如設(shè)置隊(duì)列的有效期、隊(duì)列的消息生命周期、消息的最大長度等;

  • 發(fā)送消息

    經(jīng)過以上步驟,就可以發(fā)送消息了,如上沒有定義交換機(jī),那就是綁定了默認(rèn)交換機(jī)。

    發(fā)送時的幾個參數(shù)意思如下:

    參數(shù)1:exchange,交換機(jī),這里沒有指定交換機(jī)。

    參數(shù)2:routingKey,路由key,即指定隊(duì)列,簡單模式下,路由key默認(rèn)就是隊(duì)列名

    參數(shù)3:basicProperties, 配置其他相關(guān)屬性

    參數(shù)4:body ,需要發(fā)送的消息內(nèi)容

以上的生產(chǎn)者完成了,現(xiàn)在再來一個消費(fèi)者演示一下消息消費(fèi),消費(fèi)者整體代碼如下:

效果如下:

在整個過程中,還是會先建立連接,創(chuàng)建通道,指定隊(duì)列;不同的是增加對接收數(shù)據(jù)的處理。

是不是用起來比較簡單方便,主要是在復(fù)雜項(xiàng)目中,消息隊(duì)列的作用真的很大。來,接著往下說說其他模式。

2. 工作模式(Work)

工作模式是考慮到多個消費(fèi)者情況下,消息如何被消費(fèi)的,主要有兩種方案,輪詢分發(fā)和公平分發(fā);

  • 輪詢分發(fā):消費(fèi)者依次輪著消費(fèi)消息,直到消息消費(fèi)完為止,按均分配。

  • 公平分發(fā):根據(jù)消費(fèi)者能力進(jìn)行分發(fā),即處理快的消費(fèi)就多,處理慢的就消費(fèi)就少,能者多勞。

上圖解析:

  • P:表示生產(chǎn)者,負(fù)責(zé)推送消息;

  • C1、C2:表示多個消費(fèi)者,都可以從同一個隊(duì)列接收消息;

  • 中間紅色部分:代表的是隊(duì)列(Queue);

這兩種方式需要多個消費(fèi)者,在界面不太好模擬,所以就直接上代碼演示了。

2.1 輪詢分發(fā)

在簡單模式基礎(chǔ)上稍微改動一下代碼即可。在生產(chǎn)者中發(fā)多條消息出來,然后啟用多個消費(fèi)者就可以進(jìn)行模擬如下:

生產(chǎn)者代碼整體如下:

消費(fèi)者代碼整體如下:

兩個消費(fèi)者的代碼都是一樣,沒有變動;兩個消費(fèi)者的都是在消費(fèi)同一個隊(duì)列的消息,可以先啟動兩個消費(fèi)者,然后在啟動生產(chǎn)者,效果如下:

由上可見,默認(rèn)情況下其實(shí)采用的是輪詢方式。

2.2 公平分發(fā)

在實(shí)際業(yè)務(wù)中,有些業(yè)務(wù)處理比較耗時,有些處理耗時不長,如上案例,假如奇數(shù)消息需要處理比較耗時,那么對應(yīng)的消費(fèi)者就壓力比較大。這種情況可以通過公平分發(fā)的方式進(jìn)行業(yè)務(wù)處理,處理快點(diǎn)的就多處理點(diǎn)。

如何才能知道消費(fèi)者處理業(yè)務(wù)完成呢?消費(fèi)者處理完成之后主動上報(bào)是最好不過的,所以只需要在消費(fèi)者端將自動確認(rèn)機(jī)制改為手動確認(rèn)即可,即:業(yè)務(wù)處理完成之后,手動上報(bào)確認(rèn)狀態(tài)。

生產(chǎn)者的代碼不需要變動,只需要稍微改改消費(fèi)者代碼即可,這里模擬兩個不同處理能力的消費(fèi)者:

  • 消費(fèi)者1處理一條消息業(yè)務(wù)需要500毫秒;

  • 消費(fèi)者2處理一條消息業(yè)務(wù)需要2秒;

消費(fèi)者1整體代碼如下:

消費(fèi)者2整體代碼如下,主要是模擬時間不一樣:

先啟動兩個消費(fèi)者,再啟動生產(chǎn)者,看看消費(fèi)情況,如下:

以上演示就是公平分發(fā)模式的演示,其中有兩個關(guān)鍵的步驟:

  • 設(shè)置每次消費(fèi)的消息條數(shù),可以根據(jù)實(shí)際業(yè)務(wù)情況配置,這里設(shè)置的是每次取一條。通過 channel.BasicQos進(jìn)行設(shè)置。

  • 將消息確認(rèn)模式改為自動模式,這樣就可以根據(jù)實(shí)際業(yè)務(wù)處理情況反饋確認(rèn)信息,服務(wù)器就會將消息處理掉,即刪除消息。所以一般在實(shí)際業(yè)務(wù)場景大都會推薦使用手動確認(rèn)的方式,這樣避免業(yè)務(wù)未處理導(dǎo)致消息就被服務(wù)器給清掉的情況。

3. 發(fā)布訂閱模式(Fanout)

Fanout模式是一種發(fā)布訂閱模式,是一種廣播機(jī)制,不需要指定路由Key。這種模式的交換機(jī)就會將消息廣播到綁定的所有隊(duì)列上去,只要有消費(fèi)者訂閱對應(yīng)的隊(duì)列,就會收到消息。如下圖:

上圖解析:

  • P:表示生產(chǎn)者,負(fù)責(zé)推送消息;

  • X:表示交換機(jī),圖中表示一個交換機(jī)綁定了多個隊(duì)列;

  • C1、C2:表示多個消費(fèi)者,都可以從同一個隊(duì)列接收消息;

  • 中間紅色部分:代表的是隊(duì)列(Queue);

在這種模式下,消息會一次性被多個消費(fèi)者消費(fèi)。

3.1 Web管理界面進(jìn)行演示
  • 先創(chuàng)建一個Fanout模式的交換機(jī);

  • 創(chuàng)建兩個隊(duì)列(根據(jù)實(shí)際需要創(chuàng)建多個),并將隊(duì)列綁定到上一步創(chuàng)建的交換機(jī)上;

    這里演示就創(chuàng)建兩個隊(duì)列,分別是FanoutQ1和FanoutQ2

    在隊(duì)列詳情頁或交換機(jī)詳情頁都可以進(jìn)行交換機(jī)和隊(duì)列的綁定,這里分別在FanoutQ1和FanoutQ2隊(duì)列詳情頁進(jìn)行綁定,如下:

    同樣的方式綁定FanoutQ2,  綁定完成之后,可以在交換機(jī)詳情頁看到對應(yīng)的綁定隊(duì)列:

  • 通過交換機(jī)上投遞消息,看效果;

    此時通過FanoutExchange交換機(jī)投遞消息,綁定到此交換機(jī)上的隊(duì)列都能收到:

    查看隊(duì)列消息情況,可以看到兩個隊(duì)列都接收到消息了。

3.2 代碼進(jìn)行演示

其實(shí)代碼和操作Web一樣,只是用代碼實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者而已。

  • 生產(chǎn)者的代碼

    因?yàn)镕anout交換機(jī)不用關(guān)注RoutingKey,所以在發(fā)布消息時,第二個參數(shù)不需要傳遞RoutingKey。

  • 消費(fèi)者1的代碼

    消費(fèi)者比較關(guān)注的是交換機(jī)需要和生產(chǎn)者指定的是同一個,隊(duì)列和交換機(jī)有綁定。

  • 消費(fèi)者2的代碼,其實(shí)和消費(fèi)者1基本一樣,只是定義的隊(duì)列不一樣

  • 先啟動消費(fèi)者,然后啟動生產(chǎn)者,看效果

    這里是控制臺程序,為了顯示方便就先啟動消費(fèi)者,后期的生產(chǎn)者,實(shí)際應(yīng)用場景先啟動誰都行。

4. 路由模式(Direct)

Direct模式是在Fanout基礎(chǔ)增加RoutingKey條件, 即交換機(jī)不會將消息現(xiàn)全部投遞到所有隊(duì)列,而是只投遞到對應(yīng)RoutingKey下的隊(duì)列。如圖:

上圖解析:

  • P:表示生產(chǎn)者,負(fù)責(zé)推送消息;

  • X:表示交換機(jī),指定類型為direct,圖中表示一個交換機(jī)綁定了多個隊(duì)列;

  • 中間箭頭上的error、info、warning代表具體的RoutingKey;

  • C1、C2:表示多個消費(fèi)者,都可以從同一個隊(duì)列接收消息;

  • 中間紅色部分:代表的是隊(duì)列(Queue);

Direct模式其實(shí)在實(shí)際應(yīng)用場景中用的比較多的,默認(rèn)的Exhanges也是Direct模式, 很多關(guān)于消息隊(duì)列的框架,默認(rèn)也是采用這種模式,主要原因是根據(jù)RoutingKey精確的處理對應(yīng)的業(yè)務(wù),不會由于考慮不周到,導(dǎo)致消息處理有不確定性,性能相對也不錯

4.1 Web管理界面進(jìn)行演示
  • 先創(chuàng)建一個Direct模式的交換機(jī);

  • 創(chuàng)建兩個隊(duì)列,然后將隊(duì)列綁定到上一步創(chuàng)建的交換機(jī)上,并指定對應(yīng)的RoutingKey;

    創(chuàng)建隊(duì)列完成之后,還需要綁定到交換機(jī)上,上一種模式演示的是從隊(duì)列詳情中維護(hù)綁定關(guān)系,這次從交換機(jī)詳情中進(jìn)行演示,如下:

    綁定第1個隊(duì)列,指定RoutingKey是order,模擬處理訂單的:

    綁定第2個隊(duì)列,指定RoutingKey是msg,模擬處理消息的:

    有了綁定關(guān)系,就可以測試驗(yàn)證了。

    注:這里的RoutingKey可以根據(jù)實(shí)際情況隨意指定的。

  • 向交換機(jī)上投遞消息,看效果;

    模擬發(fā)布一個RoutingKey為order的消息:

    再發(fā)布一個消息,指定RoutingKey為msg,如下:

    兩個消息都發(fā)布成功,而是指定對應(yīng)的RoutingKey進(jìn)行投遞,所以現(xiàn)在綁定到此交換機(jī)上兩個隊(duì)列中分別有一條數(shù)據(jù),查看隊(duì)列的消息概況:

    可以進(jìn)入隊(duì)列詳情,通過GetMessage獲取到具體的消息內(nèi)容,這里就不截圖了,上面已經(jīng)演示過。

4.2 代碼進(jìn)行演示

在Fanout的代碼基礎(chǔ)上稍微改動即可,主要改動點(diǎn)就是改變交換機(jī)的類型,并在隊(duì)列和交換機(jī)綁定時設(shè)置對應(yīng)的RoutingKey,發(fā)布消息的時候指定交換機(jī)和RoutingKey。

  • 生產(chǎn)者代碼

  • 消費(fèi)者1代碼,主要是綁定隊(duì)列時指定的RoutingKey為order

  • 消費(fèi)者2代碼,主要是綁定隊(duì)列時指定的RoutingKey為msg

  • 運(yùn)行起來看效果:

    如上演示效果,和Web演示一樣,只有精確匹配到RoutingKey才能消費(fèi)到對應(yīng)的消息數(shù)據(jù)。

5. 主題模式(Topic)

Topic模式是在Direct模式基礎(chǔ)增加模糊匹配RoutingKey,Direct精確匹配RoutingKey,Topic可以通*或#進(jìn)行模糊匹配,從而把消息投遞到對應(yīng)的隊(duì)列中,如圖:

上圖解析:

  • P:表示生產(chǎn)者,負(fù)責(zé)推送消息;

  • X:表示交換機(jī),指定類型為topic,圖中表示一個交換機(jī)綁定了多個隊(duì)列;

  • 中間箭頭上的文字代表模糊匹配的RoutingKey;其中*表示匹配RoutingKey中的一個詞,#號表示匹配RoutingKey的零個或多個詞,匹配符需要與點(diǎn)號(.)搭配使用。*.orange.test.# 示例中orange算一個詞,test算一個詞,即通過點(diǎn)號(.)分開的就稱為一個詞。

  • C1、C2:表示多個消費(fèi)者,都可以從同一個隊(duì)列接收消息;

  • 中間紅色部分:代表的是隊(duì)列(Queue);

5.1 Web管理界面進(jìn)行演示
  • 先創(chuàng)建一個Topic模式的交換機(jī);

  • 創(chuàng)建兩個隊(duì)列,然后將隊(duì)列綁定到上一步創(chuàng)建的交換機(jī)上,并指定對應(yīng)的RoutingKey;

    將隊(duì)列綁定到交換機(jī)上,這里還是在交換機(jī)詳情中進(jìn)行演示,如下:

    同樣的步驟分別對TopicQ1和TopicQ2進(jìn)行規(guī)則綁定,如下:

    現(xiàn)在的TopicExchange的綁定關(guān)系如下:

    有了關(guān)系之后就可以進(jìn)行驗(yàn)證效果了。

  • 向交換機(jī)上投遞消息,會根據(jù)RoutingKey的模糊匹配規(guī)則將消息投遞到對應(yīng)的隊(duì)列中,看效果;

    先指定order.create.test發(fā)布消息,看看會匹配哪些隊(duì)列:

    TopicQ2接收到消息,匹配到路由規(guī)則order.#

    再指定RoutingKey 為order.update 發(fā)布一個消息,如下:

    TopicQ1和TopicQ2都收到消息了,匹配到路由規(guī)則order.#和order.*,如下:

    再指定RoutingKey 為order發(fā)布一個消息,就會匹配到order.#,這里就不截圖了。

    以上測試說明:在Topic類型交換機(jī)和隊(duì)列綁定關(guān)系時,可以指定RoutingKey的匹配規(guī)則,星號、#號、點(diǎn)號搭配使用,其中*表示匹配RoutingKey中的一個詞,#號表示匹配RoutingKey的零個或多個詞

    更多情況,小伙伴們自己動手試試。

5.2 代碼進(jìn)行演示

在Direct的代碼基礎(chǔ)上稍微改動即可,主要改動點(diǎn)就是改變交換機(jī)的類型,并在隊(duì)列和交換機(jī)綁定時設(shè)置對應(yīng)的RoutingKey,這里的RoutingKey是一個規(guī)則,是星號、#號、點(diǎn)號和每個詞的組合,發(fā)布消息的時候指定交換機(jī)和RoutingKey,RoutingKey會去匹配綁定的規(guī)則。

  • 生產(chǎn)者代碼

  • 消費(fèi)者1代碼,指定路由匹配規(guī)則為order.#

  • 消費(fèi)者2代碼,指定路由匹配規(guī)則為order.*

  • 演示效果,將生產(chǎn)者和消費(fèi)者都啟動

    如上圖,和Web演示一樣,#號匹配0個和多個詞,*號只能匹配一個詞。 符號可以與詞任意組合,小伙伴可以根據(jù)業(yè)務(wù)情況自行發(fā)揮。

6. 參數(shù)模式(Headers)

Headers模式不是通過RoutingKey進(jìn)行匹配投遞消息,而是匹配請求頭中所帶的鍵值進(jìn)行消息投遞,所以創(chuàng)建隊(duì)列是需要設(shè)置綁定的頭部信息,有兩種模式:全部匹配和部分匹配。

  • 全部匹配:x-match=all,表示所有的鍵值都匹配了才行。

  • 部分匹配:x-match=any,表示只要其中有鍵值對匹配就行。

5.1 Web管理界面進(jìn)行演示
  • 先創(chuàng)建一個Headers模式的交換機(jī);

  • 創(chuàng)建兩個隊(duì)列,然后將隊(duì)列綁定到上一步創(chuàng)建的交換機(jī)上,可以指定Headers的參數(shù);

    將隊(duì)列綁定到交換機(jī)上,這里還是在交換機(jī)詳情中進(jìn)行演示,如下:

    這里不使用RoutingKey的方式,而是通過設(shè)置參數(shù)的形式進(jìn)行綁定,后續(xù)投遞消息的時候就匹配參數(shù),如果能匹配上,就將消息投遞到對應(yīng)的隊(duì)列。

    綁定HeaderQ1隊(duì)列:

    同樣的方式綁定HeaderQ2隊(duì)列,只是只添加了一個鍵值對,order:111,最后HeaderExchange交換機(jī)的綁定關(guān)系如下:

    關(guān)系綁定好之后就可以進(jìn)行測試效果了。

  • 向交換機(jī)上投遞消息,會根據(jù)檢查Headers參數(shù)的條件是否符合,若符合將消息投遞到對應(yīng)的隊(duì)列中,看效果;

    設(shè)置兩個參數(shù)進(jìn)行發(fā)布,如下:

    可以看到兩個隊(duì)列都匹配到了,因?yàn)閛rder和msg鍵值對匹配到HeaderQ1,order的鍵值對匹配到HeaderQ2,如果只設(shè)置一個order簡直對呢:

    此時只有HeaderQ2才能精確匹配,HeaderQ1沒有全部匹配,所以對應(yīng)隊(duì)列沒有收到消息,如下:

    由此可見,在界面上沒有指定x-match綁定的話,默認(rèn)是all,就是要全部匹配才投遞消息到對應(yīng)隊(duì)列。

    這里繼續(xù)新增一個HeaderQ3的隊(duì)列,創(chuàng)建方式和上面不一樣,只是在綁定交換機(jī)的時候增加x-match 為 any,如下:

    綁定成功之后,現(xiàn)在關(guān)系如下,其中order的鍵值對是在每個綁定中都有,如下:

    測試發(fā)消息之前,把之前消息都清空了,也就是隊(duì)列中的消息都是空的,這次我們再指定order為111的參數(shù)進(jìn)行發(fā)布消息,看看有哪些隊(duì)列收到消息呢:

    消息發(fā)出后,之后HeaderQ2和HeaderQ3收到消息,HeaderQ2只有一個order參數(shù),精確匹配上了,HeaderQ3有多個參數(shù),但設(shè)置了x-match為any,所以只要匹配其中一個即可。HeaderQ1多個參數(shù)需要全部匹配才行,所以沒有接收到消息:

5.2 代碼進(jìn)行演示

Headers模式是根據(jù)參數(shù)進(jìn)行匹配,不是通過RoutingKey,所以只需要在綁定隊(duì)列時設(shè)置好參數(shù),在發(fā)送消息的時候也設(shè)置好參數(shù),這樣就會根據(jù)匹配原則去匹配參數(shù),如果匹配上,消息就投遞到對應(yīng)的隊(duì)列,供消費(fèi)者進(jìn)行消費(fèi)。這里為了演示比較清晰一點(diǎn),使用一個生產(chǎn)者,三個消費(fèi)者的形式進(jìn)行演示。

  • 生產(chǎn)者

    代碼中關(guān)鍵的部分是指定交換機(jī)的類型為Headers,然后模擬了兩類參數(shù)的形式投遞消息,方便用于測試參數(shù)匹配模式的測試。

  • 消費(fèi)者1,綁定參數(shù)為order:111和msg:222

  • 消費(fèi)者2,和消費(fèi)者1代表基本一樣,只是綁定參數(shù)不一樣;

  • 消費(fèi)者3,代表基本和消費(fèi)者1一樣,只是在參數(shù)指定的時候增加了x-match來指定匹配模式,這里指定為any,也就是只要其中有部分匹配上也可以消費(fèi)到消息。

  • 演示效果,啟動生產(chǎn)者和消費(fèi)者:

    如上圖,消費(fèi)者3指定了匹配模式為部分匹配,所以可以接收到一個參數(shù)的消息,而消費(fèi)者1需要精確匹配,所以不能接收到。

關(guān)于常用的消息模式就聊到這吧,小伙伴們可以根據(jù)自己的業(yè)務(wù)場景進(jìn)行使用,相關(guān)演示代碼的地址如下:

碼云:https://gitee.com/CodeZoe/dot-net-core-study-demo/tree/main/RabbitMQDemo

總結(jié)

RabbitMQ提供了多種模式應(yīng)對各種業(yè)務(wù),但匹配條件越是模糊或者參數(shù)化,那性能相對比較弱。再回顧一些常用的消息隊(duì)列組件,是不是很多都是默認(rèn)使用Direct模式,精確匹配的RoutingKey可以針對具體不同業(yè)務(wù)處理,匹配性能也相對比較高;當(dāng)然其他模式小伙伴也可以針對業(yè)務(wù)情況進(jìn)行使用。

后續(xù)的文章將繼續(xù)分享RabbitMQ消息確認(rèn)機(jī)制、死信隊(duì)列、磁盤監(jiān)控等相關(guān)知識點(diǎn)的應(yīng)用,關(guān)注“Code綜藝圈”,和我一起學(xué)習(xí)吧。

----------------------------------

原文:https://mp.weixin.qq.com/s/LP_aAf_fODUPOtiikVwvTw


該文章在 2023/5/20 8:18:33 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved