第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

全部開(kāi)發(fā)者教程

RabbitMQ 入門教程

RabbitMQ 簡(jiǎn)介
RabbitMQ 簡(jiǎn)介

RabbitMQ 消息發(fā)送模式詳解

1. 前言

Hello,大家好。今天會(huì)為同學(xué)們介紹 RabbitMQ 中的消息發(fā)送模式。RabbitMQ 作為一款消息隊(duì)列中間件,其提供的消息發(fā)送模式必然是 RabbitMQ 的亮點(diǎn)所在。

理解并掌握 RabbitMQ 中的消息發(fā)送模式,是使用 RabbitMQ 進(jìn)行消息通信的基礎(chǔ),同時(shí)也是用好 RabbitMQ 的關(guān)鍵所在,所以,請(qǐng)大家務(wù)必掌握本節(jié)內(nèi)容,話不多說(shuō),就讓我們來(lái)看看 RabbitMQ 中都有哪些消息發(fā)送模式,以及消息是如何發(fā)送的吧。

本節(jié)主要內(nèi)容:

  • 什么是消息發(fā)送模式;

  • RabbitMQ 中為我們提供了哪些消息發(fā)送模式;

  • RabbitMQ 消息模式詳解及注意事項(xiàng)。

希望各位同學(xué)可以理解本節(jié)內(nèi)容,而不是死記硬背。

2. 什么是消息發(fā)送模式 ?

對(duì)于消息發(fā)送模式這一名詞,我們先拋開(kāi) RabbitMQ 不說(shuō),單從字面意義上去理解,很容易知道,消息發(fā)送模式指的就是:消息發(fā)送時(shí),所使用的方法或者中間介質(zhì),換成大白話就是說(shuō),消息是通過(guò)什么媒介去進(jìn)行發(fā)送的。

在 RabbitMQ 中,消息發(fā)送模式我們完全可以按照上述所說(shuō)的來(lái)理解,只不過(guò),在 RabbitMQ 中,對(duì)消息傳輸所通過(guò)的媒介有專業(yè)的術(shù)語(yǔ)罷了。

接下來(lái)就讓我們來(lái)看一下,在 RabbitMQ 中都有哪些消息發(fā)送模式。

3. RabbitMQ 中為我們提供了哪些消息發(fā)送模式 ?

在 RabbitMQ 中,所有經(jīng)過(guò) RabbitMQ 來(lái)傳輸?shù)南?,都需要?jīng)過(guò) RabbitMQ 的隊(duì)列來(lái)進(jìn)行傳輸,至于什么是隊(duì)列,我在前面的文章中已經(jīng)講過(guò),這里不再贅述。

在介紹 RabbitMQ 中都有哪些消息發(fā)送模式之前,我們需要首先了解,在 RabbitMQ 中的消息發(fā)送模式是如何體現(xiàn)的。

消息在 RabbitMQ 隊(duì)列傳輸?shù)倪^(guò)程中,根據(jù)不同的傳輸方式,以及所使用的隊(duì)列種類的不同,一共劃分了 5 個(gè)消息傳輸模式,而這 5 個(gè)消息傳輸模式,就是我們所說(shuō)的消息發(fā)送模式。

根據(jù) RabbitMQ 所實(shí)現(xiàn)的消息投遞方式來(lái)劃分,可以將消息發(fā)送模式分為兩大類,分別是點(diǎn)對(duì)點(diǎn)模式、發(fā)布訂閱模式;根據(jù) RabbitMQ 所采用的隊(duì)列方式以及匹配規(guī)則的不同,可以將消息發(fā)送模式分為五大類,分別是普通隊(duì)列模式、工作隊(duì)列模式、發(fā)布訂閱模式、直接模式、主題模式。

由于按照消息投遞方式所劃分的范圍較廣,我們不能充分了解每個(gè)消息發(fā)送模式的內(nèi)容,所以,在介紹消息發(fā)送模式時(shí),我會(huì)按照 RabbitMQ 所采用的隊(duì)列方式和匹配規(guī)則的不同來(lái)進(jìn)行講解,請(qǐng)同學(xué)們做好準(zhǔn)備。

4. RabbitMQ 消息模式詳解及注意事項(xiàng)

我們知道,在 RabbitMQ 中,消息的產(chǎn)生是源自生產(chǎn)者,對(duì)應(yīng)的,消費(fèi)消息是依靠消費(fèi)者,而在生產(chǎn)者生產(chǎn)消息到消費(fèi)者最終消費(fèi)消息的過(guò)程中,消息發(fā)送模式扮演著重要的角色。

如果需要將消息發(fā)送模式結(jié)合生產(chǎn)者與消費(fèi)者進(jìn)行理解的話,那么,我們可以這樣來(lái)理解:在生產(chǎn)者生產(chǎn)出一條消息后,需要經(jīng)過(guò) RabbitMQ 的通道來(lái)發(fā)送給消費(fèi)者,消費(fèi)者接收到消息,并最終對(duì)消息進(jìn)行消費(fèi),這其中的通道,指的就是 RabbitMQ 的消息發(fā)送模式

接下來(lái)讓我們具體來(lái)看一下,RabbitMQ 是如何把生產(chǎn)者生產(chǎn)的消息傳輸給消費(fèi)者消費(fèi)的。

約定:

由于在本節(jié)中所使用的消息發(fā)送模式原理圖均來(lái)自官網(wǎng),所以圖中每個(gè)元素都代表什么意思,我在這里一并說(shuō)過(guò),后面不再贅述:

天藍(lán)色橢圓 + 其中的字母 P : 代表生產(chǎn)者。

藍(lán)色的橢圓 + 其中的字母 C + 數(shù)字下表 : 代表消費(fèi)者。

深藍(lán)色橢圓 + 其中的字母 X : 代表交換機(jī)。

交換機(jī)上方的 type : 代表交換機(jī)的類型。

橙色小矩形塊所組成的大矩形塊 : 代表具體的一個(gè)隊(duì)列。

圖中的箭頭,不帶字母標(biāo)識(shí)的 : 代表消息的流向。

圖中箭頭上的字母標(biāo)識(shí) : 代表特定模式下的 key 值。

4.1 直接模式

定義:

直接模式,即直接發(fā)送消息模式,指的是將消息直接發(fā)送給消費(fèi)者。

描述:

直接模式允許將多個(gè)隊(duì)列綁定到一個(gè)交換機(jī)上,在生產(chǎn)者發(fā)送消息給交換機(jī)時(shí),需要攜帶一個(gè) key ,而這個(gè) key 一般被稱為 routing key 或者 binding key,所以直接模式有時(shí)也被稱為路由模式。

Tips: RabbitMQ 一般將這個(gè) key 叫做 binding key,但是在實(shí)際情況中,出于字面意思,習(xí)慣性地將 key 叫做 routing key

直接模式總共分為兩種業(yè)務(wù)場(chǎng)景,我們先來(lái)看第一種業(yè)務(wù)場(chǎng)景,一般被叫做’單 key 綁定’,如下圖所示:

從圖中我們可以看到,交換機(jī)的 type 被聲明成了 direct ,這說(shuō)明我們使用的交換機(jī)是直接交換機(jī),即使用的消息發(fā)送模式是直接模式;

orange、black、green 分別表示不同的兩個(gè) routing key ,orange 這一個(gè) key 綁定了一個(gè)隊(duì)列,black、green、兩個(gè)不同的 key 也綁定了一個(gè)隊(duì)列,這種現(xiàn)象就是直接模式的第一種業(yè)務(wù)場(chǎng)景,單 key 綁定。

單 key 綁定的隊(duì)列,在生產(chǎn)者生產(chǎn)出消息之后,會(huì)根據(jù)不同 key 指向的不同隊(duì)列來(lái)將消息進(jìn)行分發(fā),即使是不同的 key 綁定了同一隊(duì)列。

我們來(lái)看直接模式的最后一個(gè)業(yè)務(wù)場(chǎng)景,多重 key 綁定,如下圖所示:

在圖中我們可以看到,Q1、Q2 兩個(gè)隊(duì)列,分別綁定到了 routing key 均為 black 的 direct 交換機(jī)上,即名稱相同的一個(gè) key 綁定到了多個(gè)隊(duì)列上面,這種現(xiàn)象被稱為多重 key 綁定。

在多重 key 綁定下,生產(chǎn)者生產(chǎn)的消息均會(huì)被發(fā)送到相同 key 值所綁定的隊(duì)列上面,這里需要同學(xué)們注意。

實(shí)現(xiàn)偽代碼:

// 生產(chǎn)者
channel.basicPublish(EXCHANGE_NAME, "Routing Key", ...)

// 消費(fèi)者
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "Routing Key"

代碼解釋:

第 2 行,我們使用 channel 的 basicPublish 方法來(lái)指定第二個(gè)參數(shù),即我們的 routing key 的名稱。

第 5 行,我們使用 channel 的 queueBind 方式來(lái)將消息隊(duì)列綁定到名為 Routing Key 的直接模式交換機(jī)上。

Tips:
1. 一般,我們?cè)谑褂?RabbitMQ 時(shí),默認(rèn)會(huì)使用直接模式來(lái)發(fā)送消息,直接模式也是使用最多的消息發(fā)送模式,如果其他消息發(fā)送模式不能理解,則務(wù)必理解直接模式;
2. 在使用直接模式時(shí),一定不要忘了指定 routing key ,否則,將不能使用直接模式來(lái)發(fā)送消息;
3. 當(dāng)我們綁定了多個(gè)隊(duì)列到交換機(jī)上時(shí),一旦消息被發(fā)送,則符合同一 routing key 的隊(duì)列都會(huì)接收到消息。

4.2 發(fā)布訂閱模式

定義:

發(fā)布訂閱模式,即生產(chǎn)者發(fā)布消息,消費(fèi)者通過(guò)訂閱的方式來(lái)消費(fèi)消息。

其實(shí),發(fā)布訂閱模式在我看來(lái),不過(guò)是給傳統(tǒng)的發(fā)送和接收起一個(gè)高大上的名字罷了,本質(zhì)上仍熱是消息的生產(chǎn)和消費(fèi),只不過(guò)這種模式更像與發(fā)布和訂閱,因此得名發(fā)布訂閱模式。

描述:

發(fā)布訂閱模式只有一種實(shí)際的業(yè)務(wù)場(chǎng)景,我們把他稱為群發(fā)模式。

上圖所示場(chǎng)景也是發(fā)布訂閱模式中的一種,但是這種模式?jīng)]有任何存在意義,因?yàn)樵谶@種模式下,生產(chǎn)者生產(chǎn)出一條消息之后,將消息直接發(fā)送到了交換機(jī)上,大家注意看,此時(shí)的交換機(jī)上沒(méi)有綁定任何消息隊(duì)列,所以,此時(shí)位于交換機(jī)上的消息將丟失,消費(fèi)者無(wú)法拿到消息進(jìn)行消費(fèi)。

接下來(lái)讓我們看看實(shí)際上的發(fā)布訂閱模式:

生產(chǎn)者生產(chǎn)一條消息后,將消息首先發(fā)送到交換機(jī)上,交換機(jī)進(jìn)行檢測(cè),發(fā)現(xiàn)存在兩個(gè)隊(duì)列都綁定在自身上面,于是,將消息全部投遞到所綁定的隊(duì)列上面,最后再由消費(fèi)者接收消息并消費(fèi)。

發(fā)布訂閱模式的特點(diǎn),就是一個(gè)生產(chǎn)者、一個(gè)交換機(jī)、多個(gè)隊(duì)列、多個(gè)消費(fèi)者,由于生產(chǎn)者生產(chǎn)出來(lái)的消息會(huì)發(fā)送到綁定在交換機(jī)上的所有隊(duì)列上,這種場(chǎng)景很類似于我們給很多人群發(fā)消息,所以,這種模式被叫做群發(fā)模式。

實(shí)現(xiàn)偽代碼:

// 生產(chǎn)者
channel.exchangeDeclare(EXCHANGE_NAME, "fanout")

// 消費(fèi)者
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "")
channel.basicConsume(QUEUE_NAME, false, consumer)

代碼解釋:

第 2 行,我們使用 channel 的 exchangeDeclare 方法,將交換機(jī)的類型指定為 fanout 交換機(jī),這是使用發(fā)布訂閱模式的前提。

第 5 行,我們使用 channel 的 queueBind 方法,為交換機(jī)綁定一個(gè)隊(duì)列,如果在發(fā)布訂閱模式下,不綁定消息隊(duì)列到交換機(jī)上,則消息會(huì)丟失,消費(fèi)者接收不到任何消息。

第 6 行,我們使用 channel 的 basicConsume 方法,來(lái)接收由消息隊(duì)列發(fā)送的消息并消費(fèi)。

Tips:
1.由于沒(méi)有綁定隊(duì)列到交換機(jī)上的這種方式會(huì)丟失消息,所以在實(shí)際工作中,這個(gè)方法幾乎從不使用,因?yàn)闆](méi)有任何意義;
2.使用發(fā)布訂閱模式,在給交換機(jī)綁定隊(duì)列時(shí),不要手動(dòng)指定隊(duì)列的 key 值,因?yàn)?RabbitMQ 會(huì)自動(dòng)生成相同的 key 值;
3. 發(fā)布訂閱模式一般用于不用指定特殊的 key 值,且需要消息批量發(fā)送的業(yè)務(wù)場(chǎng)景。

4.3 普通隊(duì)列模式

定義:

普通隊(duì)列模式,即最簡(jiǎn)單的消息發(fā)送模式,不使用任何交換機(jī),由生產(chǎn)者、隊(duì)列、消費(fèi)者組合完成消息的發(fā)送和接收。

描述:

普通隊(duì)列模式,由于其操作簡(jiǎn)單,所以又被稱為簡(jiǎn)單模式,如下圖所示:

普通隊(duì)列模式,在生產(chǎn)者生產(chǎn)完消息之后,直接將消息發(fā)送到隊(duì)列中去,不經(jīng)過(guò)交換機(jī)進(jìn)行處理,然后由消費(fèi)者直接接收消息并消費(fèi)。在這個(gè)過(guò)程中間,沒(méi)有我們需要特別注意的地方。

實(shí)現(xiàn)偽代碼:

// 生產(chǎn)者
channel.queueDeclare(QUEUE_NAME, false, false, false, null)

// 消費(fèi)者
channel.basicConsume(QUEUE_NAME, true, consumer)

代碼解釋:

第 2 行,我們使用 channel 的 queueDeclare 方法來(lái)為通過(guò)綁定消息隊(duì)列,并指定消息隊(duì)列的名稱。

第 5 行,我們是使用 channel 的 basicConsume 方法來(lái)直接從隊(duì)列接收消息,并自動(dòng)監(jiān)聽(tīng)消費(fèi)。

Tips:
1. 普通隊(duì)列模式操作簡(jiǎn)單,適合很簡(jiǎn)單的業(yè)務(wù)場(chǎng)景,同時(shí),初學(xué)者更易于理解。
2. 由于普通隊(duì)列模式所能實(shí)現(xiàn)的業(yè)務(wù)場(chǎng)景太過(guò)簡(jiǎn)單,所以在實(shí)際業(yè)務(wù)場(chǎng)景中,很少會(huì)用到。

4.4 工作隊(duì)列模式

定義:

工作隊(duì)列模式,和普通隊(duì)列模式有點(diǎn)像,都是不使用任何交換機(jī),由生產(chǎn)者、隊(duì)列、消費(fèi)者組合完成消息的發(fā)送和接收,只不過(guò)工作隊(duì)列支持存在多個(gè)消費(fèi)者,而普通隊(duì)列模式只支持一個(gè)消費(fèi)者。

描述:

工作隊(duì)列模式下,生產(chǎn)者生產(chǎn)出消息后,直接將消息發(fā)送到消息隊(duì)列中,然后多個(gè)消費(fèi)者按照一個(gè)隨機(jī)的順序來(lái)依次接收消息并消費(fèi),存在多個(gè)消費(fèi)者消費(fèi)消息時(shí),下一個(gè)消費(fèi)者只能等待上一個(gè)消費(fèi)者消費(fèi)結(jié)束后才能接收消息并進(jìn)行消費(fèi)。

這就提示我們,在實(shí)際工作中,我們可以把費(fèi)時(shí)的業(yè)務(wù)操作交給 RabbitMQ 去做,這樣可以提升代碼的執(zhí)行效率。

實(shí)現(xiàn)偽代碼:

// 生產(chǎn)者
channel.basicPublish(QUEUE_NAME, null, message.getBytes());
Thread.sleep(1000);

// 消費(fèi)者
Delivery delivery = consumer.nextDelivery();
Thread.sleep(1000);

代碼解釋:

第 2 行,我們使用 channel 的 basicPublish 方法來(lái)生成一條消息。

第 3 行,在生成一條消息之后,我們等待 1000 毫秒,即 1 秒后再次生成一條消息。

第 5 行,我們使用 consumer 的 nextDelivery 方法來(lái)依次獲取生產(chǎn)者生產(chǎn)的消息。

第 6 行,在消費(fèi)完一條消息之后,我們讓下一個(gè)消費(fèi)者等待 1 秒鐘,再去消費(fèi)下一條消息。

Tips:
1.工作隊(duì)列模式與發(fā)布訂閱模式有相同之處,既他們都是經(jīng)過(guò)一個(gè)隊(duì)列來(lái)向多個(gè)消費(fèi)者發(fā)送消息,不同之處在于,前者不用綁定交換機(jī),而后者則需要使用交換機(jī);

2.應(yīng)用工作隊(duì)列模式,一定要根據(jù)實(shí)際業(yè)務(wù)需求和實(shí)際業(yè)務(wù)場(chǎng)景,設(shè)置好多個(gè)消費(fèi)者間等待消費(fèi)消息的時(shí)間,如果這個(gè)間隔時(shí)間設(shè)置太久,則容易造成下一個(gè)消費(fèi)者持續(xù)等待,嚴(yán)重占用CPU資源,如果設(shè)置時(shí)間太短,則業(yè)務(wù)邏輯還沒(méi)執(zhí)行完成就開(kāi)始了下一個(gè)消息的消費(fèi),這兩種業(yè)務(wù)場(chǎng)景都是不應(yīng)該出現(xiàn)的

4.5 主題模式

定義:

主題模式,也被稱為通配符模式,官網(wǎng)一般稱為主題模式,即交換機(jī)與消息隊(duì)列所綁定的 key 值可以像匹配通配符的方式,來(lái)匹配消息隊(duì)列,到底什么意思呢,我們往下看。

描述:

主題模式對(duì) routing key 的匹配規(guī)則做了改進(jìn),上述其他四種模式中有涉及 key 匹配的地方都是完全匹配,即名稱必須相等時(shí)才能把 key 匹配上,而對(duì)于主題模式,則不需要這樣。

主題模式將 key 值中的每個(gè)單詞或者關(guān)鍵詞,使用英文狀態(tài)下的 . 符號(hào)進(jìn)行間隔,如上圖所示。上圖中為我們列舉了主題模式中支持的所有通配符語(yǔ)法,我們一個(gè)一個(gè)來(lái)介紹:

Tips: 由于 * 號(hào)是 MD 語(yǔ)法關(guān)鍵字,所以這里暫時(shí)用 ^ 號(hào)代替,同學(xué)們注意。

.orange. : 表示在 orange 的兩側(cè)可以匹配一個(gè) key 值,例如 123.orange.456 、abc.orange.456 等,但是,abc.orange.456.123 這個(gè)是不可以的。

..rabbit : 用法和上述 orange 相同,例如: 123.abc.rabbit 、abd.acd.rabbit 等。

lazy.# : 表示在 lazy 的右側(cè),可以匹配多個(gè) key 值可以進(jìn)行通配符匹配,例如:lazy.abc.123 等。

實(shí)現(xiàn)偽代碼:

// 生產(chǎn)者
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
channel.basicPublish(EXCHANGE_NAME, "key.123", ...);

// 消費(fèi)者
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "key.*");

代碼解釋:

第 2 行,我們使用 channel 的 exchangeDeclare 方法,將交換機(jī)聲明為 topic 類型,這是使用主題模式的必須項(xiàng)。

第 3 行,我們使用 channel 的 basicPublish 方法來(lái)將消息綁定到交換機(jī)上。

第 6 行,我們使用 channel 的 queueBind 方法,將消息隊(duì)列綁定到交換機(jī)上,并且設(shè)置 key 的匹配策略為 key.* 。

Tips:
1. 使用主題模式一定要很清楚每個(gè)通配符所代表的意思,以防用錯(cuò)通配符,引起不必要的錯(cuò)誤;
2. 主題模式為我們提供了類似于模糊搜索的功能,當(dāng)我們不知道如何設(shè)置 key 時(shí),我們可以采用主題模式,同時(shí),主題模式為我們 key 的分組也提供了很好地實(shí)現(xiàn)方案。
3. 使用主題模式時(shí),注意 key 值的命名不要太長(zhǎng),也不要太短。

5. 小結(jié)

本小節(jié)從什么是消息發(fā)送模式開(kāi)始,詳細(xì)介紹了 RabbitMQ 中的 5 種消息發(fā)送模式,對(duì)于每一種消息發(fā)送模式,采用文字+偽代碼+圖片的方式進(jìn)行了全方位的講解,旨在幫助同學(xué)們,通過(guò)對(duì)本節(jié)內(nèi)容的學(xué)習(xí),可以充分了解 RabbitMQ 中都有哪些消息發(fā)送模式,以及每種消息發(fā)送模式的特點(diǎn)、消息發(fā)送原理等。

本小節(jié)是用好 RabbitMQ 的基礎(chǔ),在學(xué)習(xí)本節(jié)內(nèi)容時(shí),一定要理清楚 5 中消息發(fā)送模式間的區(qū)別與聯(lián)系,我們只有在充分了解了 RabbitMQ 中的消息發(fā)送模式之后,才能很清楚的知道,什么業(yè)務(wù)場(chǎng)景哪種消息模式最合適,最后,希望同學(xué)們學(xué)的開(kāi)心、碼的快樂(lè)。