溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何理解RabbitMQ的路由知識以及用法

發(fā)布時間:2021-11-20 09:50:12 來源:億速云 閱讀:676 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)如何理解RabbitMQ的路由知識以及用法,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

RabbitMQ的路由知識

一、RabbitMQ的路由知識介紹

1、對于生產(chǎn)者來說,它可以生產(chǎn)一類消息,也可以生產(chǎn)多類消息,一旦生產(chǎn)了多類消息,那么生產(chǎn)者如何將不同類的消息發(fā)送給不同的消費者呢?

對于這個問題的答案,其實最常用的辦法,便是路由,可以讓生產(chǎn)者根據(jù)不同的路由規(guī)則,將不同類型的消息轉(zhuǎn)發(fā)給不同的消費者。

RabbitMQ就是采用的這種策略,不過對于生產(chǎn)者來說,直接連接的是路由(exchange)而不是消費者。路由會根據(jù)設(shè)置的路由規(guī)則不同,將不同類型的消息分發(fā)到不同的消息隊列(queue)中,等待消費者去將自己所屬隊列中的消息取走。

下面是RabbitMQ 的示意圖:

如何理解RabbitMQ的路由知識以及用法

2、RabbitMQ這個路由規(guī)則介紹

對于RabbitMQ這個路由規(guī)則,是通過Exchange定義的類型(type)來控制的,而RabbitMQ共有四種exchange類型:direct, topic, headers, fanout。

1). Direct exchange的路由算法:就是將exchange的binding_key和消息的routing_key進行比較,如果完全匹配這說明是需要分發(fā)的隊列。

2). Fanout exchange的路由算法:它將所接收到的消息廣播給所有綁定的隊列。

3). Topic exchange的路由算法:binding key的邏輯跟direct一樣,其接收到的消息會分發(fā)到所有與其routing key相匹配的綁定隊列。

(備注:Topic類型的exchange消息的routing key是有一定限制的,必須是一組使用“.”分開的單詞。單詞可以是任意的,但是一般來說以能準(zhǔn)確的表達功能的為佳。如以下的例子都是合法的:"stock.usd.nyse", "nyse.vmw","quick.orange.rabbit".Routing key可以是任意多個單詞組成,但其總長度不能超過255個字節(jié)。)

4). Headers  Exchange的路由算法: 不依賴于 routing key 與 binding key 的匹配規(guī)則來路由消息,而是根據(jù)發(fā)送的消息內(nèi)容中的 headers 屬性進行匹配。工作流程:

1>綁定一個隊列到頭交換機上時,會同時綁定多個用于匹配的頭(header)。

2>傳來的消息會攜帶header,以及會有一個 “x-match” 參數(shù)。當(dāng) “x-match” 設(shè)置為 “any” 時,消息頭的任意一個值被匹配就可以滿足條件,而當(dāng) “x-match” 設(shè)置為 “all” 的時候,就需要消息頭的所有值都匹配成功。

備注:頭交換機可以視為直連交換機的另一種表現(xiàn)形式。但直連交換機的路由鍵必須是一個字符串,而頭屬性值則沒有這個約束,它們甚至可以是整數(shù)或者哈希值(字典)等。靈活性更強(但實際上我們很少用到頭交換機)。

3 、既然生產(chǎn)者與路由綁定,并且會根據(jù)設(shè)置的路由規(guī)則將消息放到不同的隊列,那么隊列是怎么與路由關(guān)聯(lián)起來的呢?

答案是通過綁定關(guān)系,RabbitMQ中,路由與Queue之間連接,但是這種連接是通過一個叫做Binding(綁定)的東西關(guān)聯(lián)起來的。當(dāng)然這種Binding并不是隨機的,而是有規(guī)則,這里的規(guī)則叫做binding_key,用到amqp中的API如下所示:

func (ch *Channel) QueueBind(name, key, exchange string, noWait bool, args Table)error

二、下面我們用例子來說明上面的幾種路由類型是如何使用的。

1、direct類型例子

1)、代碼:左邊是生產(chǎn)者代碼,右邊是消費者代碼。

對于direct來說,需要通過binding_key和消息的routing_key來進行分發(fā)消息到不同的隊列。

生產(chǎn)者代碼中,定義了exchange名字testdirect以及類型direct,然后生產(chǎn)數(shù)據(jù)的時候publish指定接受的exchange是testdirect,并同時指定routing_key的兩種key值:hello和other。

消費者代碼中,同樣定義了exchange叫做testdirect和direct類型,綁定Queue的時候,只需要關(guān)聯(lián)成testdirect就可以了。

如何理解RabbitMQ的路由知識以及用法

2)、運行結(jié)果

同樣是啟動兩個消費者,一個用來接收來自hello消息隊列的消息,一個用來接收來自other消息隊列的消息。

如何理解RabbitMQ的路由知識以及用法

如何理解RabbitMQ的路由知識以及用法

發(fā)送端,

如何理解RabbitMQ的路由知識以及用法

如何理解RabbitMQ的路由知識以及用法

2、fanout類型例子:

1)、代碼:左邊是消費者代碼,右邊是生產(chǎn)者代碼。

對于路由類型fanout來說,代碼實現(xiàn)比較簡單。1)生產(chǎn)者一端需要聲明exchange的名字,在生產(chǎn)消息publish的時候指定exchange的名字即可。2)消費者一端同樣需要聲明exchange的名字,這里的名字需要與生產(chǎn)者的是一致的,同時在綁定queue的時候,也就是QueueBind的時候指定exchange對應(yīng)的名字即可。

如何理解RabbitMQ的路由知識以及用法

2)、運行效果

1>打開兩個終端,分別啟動一個消費者,如下圖所示:

如何理解RabbitMQ的路由知識以及用法

如何理解RabbitMQ的路由知識以及用法

如何理解RabbitMQ的路由知識以及用法

通過生產(chǎn)者來發(fā)送消息給路由fanout類型的hellotest,發(fā)送內(nèi)容如下所示。通過上圖中消費者的輸出可以看出,在消費者每發(fā)一次消息的時候,消費者1和消費者2都會即時收到這個消息內(nèi)容。

3)、查看rabbitmq上面的數(shù)據(jù)

下面我們通過rabbitmq的命令,來查看rabbitmq sever上面的exchange,binding以及queue的對應(yīng)關(guān)系,如下圖所示:

如何理解RabbitMQ的路由知識以及用法

通過命令顯示的情況來看,1)兩個消費者分別生成了兩個queue,名字是amq.開頭的隨機碼來表示的。2)hellotest 的類型是fanout。3)binding關(guān)系可以看出hellotest與這兩個隊列都有綁定關(guān)系。

3、topic類型

1)、代碼:左邊是消費者代碼,右邊是生產(chǎn)者代碼。

topic類型的代碼,1)生產(chǎn)者需要在定義exchange的時候聲明topic,然后在Publish的時候,關(guān)聯(lián)上exchange的名字testtopic和可以自己定義的route_key值。2)消費者需要需要聲明相同的exchange,并指定類型為topic,在綁定消息隊列的時候,關(guān)聯(lián)對應(yīng)的exchange,同時設(shè)置binding_key,這里設(shè)計成依賴與命令行輸入的方式。

如何理解RabbitMQ的路由知識以及用法

2)、運行結(jié)果

通過生產(chǎn)者依次發(fā)送4次消息,如下圖所示:

如何理解RabbitMQ的路由知識以及用法

消費者一:配置的route_key值是"flower.*"和"*.big",表示的是第一個字符是flower,后續(xù)字符任意匹配;第一個任意字符,第二個字符是big的兩種key值,都會被寫入這個消息隊列。所以該消費者消費了三個消息"animal.big","flower.small"和"flower.big"。

如何理解RabbitMQ的路由知識以及用法

消費者二:配置的route_key是"#",表示的是什么字符都接受,類似于fanout模式。所以該消費者會消費所有的消息。

如何理解RabbitMQ的路由知識以及用法

消費者三:配置的是完全匹配格式"flower.big",所以該消費者只會命中"flower.big"這一消息。

如何理解RabbitMQ的路由知識以及用法

3)、查看rabbitmq上面的數(shù)據(jù)

通過下面的綁定命令,我們可以看到這三個不同的消息隊列,綁定的exchange都是testtopic這個路由,至于這個隊列對應(yīng)的是那個消費者,可以參看2)中的日志信息。

如何理解RabbitMQ的路由知識以及用法

4、header類型

備注:因為header類型的實現(xiàn)與上面的direct、fanout、topic的匹配規(guī)則完全不相同,甚至可以說是另外一套實現(xiàn)方式。

以上就是如何理解RabbitMQ的路由知識以及用法,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI