rabbitmq Exchange四種模式

2022-07-20 16:24:17 字數 2914 閱讀 8559

rabbitmq 是 amqp(高階訊息佇列協議)的標準實現:

從 amqp 協議可以看出,queue、exchange 和 binding 構成了 amqp 協議的核心

consumer:訊息消費者,即接受訊息的程式。

rabbitmq常用的exchange type有fanout、direct、topic、headers這四種

fanout型別的exchange路由規則非常簡單,它會把所有傳送到fanout exchange的訊息都會被**到與該exchange 繫結(binding)的所有queue上。

fanout exchange 不需要處理routekey 。只需要簡單的將佇列繫結到exchange 上。這樣傳送到exchange的訊息都會被**到與該交換機繫結的所有佇列上。類似子網廣播,每台子網內的主機都獲得了乙份複製的訊息。所以,fanout exchange **訊息是最快的。

direct型別的exchange路由規則也很簡單,它會把訊息路由到那些binding key與routing key完全匹配的queue中。

direct exchange是rabbitmq broker的預設exchange,它有乙個特別的屬性對一些簡單的應用來說是非常有用的,在使用這個型別的exchange時,可以不必指定routing key的名字,在此型別下建立的queue有乙個預設的routing key,這個routing key一般同queue同名。

direct模式,可以使用rabbitmq自帶的exchange:default exchange 。所以不需要將exchange進行任何繫結(binding)操作 。訊息傳遞時,routekey必須完全匹配,才會被佇列接收,否則該訊息會被拋棄。

前面講到direct型別的exchange路由規則是完全匹配binding key與routing key,但這種嚴格的匹配方式在很多情況下不能滿足實際業務需求。topic型別的exchange在匹配規則上進行了擴充套件,它與direct型別的exchage相似,也是將訊息路由到binding key與routing key相匹配的queue中,但這裡的匹配規則有些不同,它約定:

a)、routing key為乙個句點號「. 」分隔的字串(我們將被句點號「. 」分隔開的每一段獨立的字串稱為乙個單詞),如「stock.usd.nyse」、「nyse.vmw」、「quick.orange.rabbit」

b)、binding key與routing key一樣也是句點號「. 」分隔的字串

c)、binding key中可以存在兩種特殊字元"*"與「#」,用於做模糊匹配,其中" * "用於匹配乙個單詞,「#」用於匹配多個單詞(可以是零個)

所有傳送到topic exchange的訊息被**到所有關心routekey中指定topic的queue上,exchange 將routekey 和某topic 進行模糊匹配。此時佇列需要繫結乙個topic。可以使用萬用字元進行模糊匹配,符號「#」匹配乙個或多個詞,符號"*"匹配不多不少乙個詞。因此「log.#」能夠匹配到「log.info.oa」,但是「log.*」 只會匹配到「log.error」

headers型別的exchange不依賴於routing key與binding key的匹配規則來路由訊息,而是根據傳送的訊息內容中的headers屬性進行匹配。

在繫結queue與exchange時指定一組鍵值對;當訊息傳送到exchange時,rabbitmq會取到該訊息的headers(也是乙個鍵值對的形式),對比其中的鍵值對是否完全匹配queue與exchange繫結時指定的鍵值對;如果完全匹配則訊息會路由到該queue,否則不會路由到該queue。

示例**

生產者

const amqp = require('amqplib');

async

function

producer() );

for (let i = 0; i < 5; i++) 第$條訊息`));}

await channel.close();

} catch

(error)

}producer();

消費者

const amqp = require('amqplib');

async

function

consumer() );

await channel.assertqueue(queuename);

await channel.bindqueue(queuename, exchangename, bindingkey);

//5. 限流引數設定

await channel.prefetch(1, false);// count:每次推送給消費端 n 條訊息數目,如果這 n 條訊息沒有被ack,生產端將不會再次推送直到這 n 條訊息被消費。global:在哪個級別上做限制,ture 為 channel 上做限制,false 為消費端上做限制,預設為 false。

//

6. 限流,noack引數必須設定為false

await channel.consume(

queuename,

(msg) =>,

);}consumer();

Android Activity四種啟動模式

當應用執行起來後就會開啟一條執行緒,執行緒中會執行乙個任務棧,當 activity 例項建立後就會放入任務棧中。activity 啟動模式的設定在 androidmanifest.xml 檔案中,通過配置 activity的屬性 android launchmode 設定。1.standared 模...

Android Activity四種啟動模式

任務棧 task 乙個應用程式一般包括多個activity,每個activity都是用來處理使用者互動的乙個任務 stack 棧,是一總特殊的資料結構 後進先出 佇列要是一種特殊的資料結構 先進先出 standard 標準的啟動模式預設應用場景 singletop 單一頂部模式 如果activity...

RabbitMQ 的四種Exchange 模式

rabbitmq中,所有生產者提交的訊息都由exchange來接受,然後exchange按照特定的策略 到queue進行儲存 rabbitmq提供了四種exchange fanout,direct,topic,header header模式在實際使用中較少。效能排序 fanout direct to...