RabbitMQ 的四種Exchange 模式

2021-09-10 19:25:40 字數 3577 閱讀 5100

rabbitmq中,所有生產者提交的訊息都由exchange來接受,然後exchange按照特定的策略**到queue進行儲存

rabbitmq提供了四種exchange:fanout,direct,topic,header

header模式在實際使用中較少。

效能排序:fanout > direct >> topic。比例大約為11:10:6

一.direct exchange

direct exchange - 處理路由鍵。需要將乙個佇列繫結到交換機上,要求該訊息與乙個特定的路由鍵完全匹配。這是乙個完整的匹配。如果乙個佇列繫結到該交換機上要求路由鍵 「dog」,則只有被標記為「dog」的訊息才被**,不會**dog.puppy,也不會**dog.guard,只會**dog。 

任何傳送到direct exchange的訊息都會被**到routekey中指定的queue。

1.一般情況可以使用rabbitmq自帶的exchange:」"(該exchange的名字為空字串,下文稱其為default exchange)。

2.這種模式下不需要將exchange進行任何繫結(binding)操作

3.訊息傳遞時需要乙個「routekey」,可以簡單的理解為要傳送到的佇列名字。

4.如果vhost中不存在routekey中指定的佇列名,則該訊息會被拋棄。

channel channel = connection.createchannel();    

channel.exchangedeclare("exchangename", "direct"); //direct fanout topic

channel.queuedeclare("queuename");

channel.queuebind("queuename", "exchangename", "routingkey");

byte messagebodybytes = "hello world".getbytes();

//需要繫結路由鍵

channel.basicpublish("exchangename", "routingkey", messageproperties.persistent_text_plain, messagebodybytes);

二.fanout exchange 

fanout exchange – 不處理路由鍵。你只需要簡單的將佇列繫結到交換機上。乙個傳送到交換機的訊息都會被**到與該交換機繫結的所有佇列上。很像子網廣播,每台子網內的主機都獲得了乙份複製的訊息。fanout交換機**訊息是最快的。 

任何傳送到fanout exchange的訊息都會被**到與該exchange繫結(binding)的所有queue上。

1.可以理解為路由表的模式

2.這種模式不需要routekey

3.這種模式需要提前將exchange與queue進行繫結,乙個exchange可以繫結多個queue,乙個queue可以同多個exchange進行繫結。

4.如果接受到訊息的exchange沒有與任何queue繫結,則訊息會被拋棄。

channel channel = connection.createchannel();    

channel.exchangedeclare("exchangename", "fanout"); //direct fanout topic

channel.queuedeclare("queuename");

channel.queuebind("queuename", "exchangename", "routingkey");

channel.queuedeclare("queuename1");

channel.queuebind("queuename1", "exchangename", "routingkey1");

byte messagebodybytes = "hello world".getbytes();

//路由鍵需要設定為空

channel.basicpublish("exchangename", "", messageproperties.persistent_text_plain, messagebodybytes);

三.topic exchange

topic exchange – 將路由鍵和某模式進行匹配。此時佇列需要繫結要乙個模式上。符號「#」匹配乙個或多個詞,符號「*」匹配不多不少乙個詞。因此「audit.#」能夠匹配到「audit.irs.corporate」,但是「audit.*」 只會匹配到「audit.irs」

任何傳送到topic exchange的訊息都會被**到所有關心routekey中指定話題的queue上

1.這種模式較為複雜,簡單來說,就是每個佇列都有其關心的主題,所有的訊息都帶有乙個「標題」(routekey),exchange會將訊息**到所有關注主題能與

routekey模糊匹配的佇列。

2.這種模式需要routekey,也許要提前繫結exchange與queue。

3.在進行繫結時,要提供乙個該佇列關心的主題,如「#.log.#」表示該佇列關心所有涉及log的訊息(乙個routekey為」mq.log.error」的訊息會被**到該佇列)。

4.「#」表示0個或若干個關鍵字,「*」表示乙個關鍵字。如「log.*」能與「log.warn」匹配,無法與「log.warn.timeout」匹配;但是「log.#」能與上述兩者匹配。

5.同樣,如果exchange沒有發現能夠與routekey匹配的queue,則會拋棄此訊息。

channel channel = connection.createchannel();    

channel.exchangedeclare("exchangename", "topic"); //direct fanout topic

channel.queuedeclare("queuename");

channel.queuebind("queuename", "exchangename", "routingkey.*");

byte messagebodybytes = "hello world".getbytes();

channel.basicpublish("exchangename", "routingkey.one", messageproperties.persistent_text_plain, messagebodybytes);

四.header exchange

header exchange(頭交換機)和主題交換機有點相似,但是不同於主題交換機的路由是基於路由鍵,頭交換機的路由值基於訊息的header資料。 

主題交換機路由鍵只有是字串,而頭交換機可以是整型和雜湊值 

rabbitMQ的四種交換機

交換機的型別 direct exchange 直連交換機 fanout exchange 扇型交換機 topic exchange 主題交換機 headers exchange 頭交換機 預設存在的交換機 dead letter exchange 死信交換機 在rabbitmq中,生產者不是直接將訊...

SharedPreferences的四種模式

開發應用需要儲存一些配置引數,如果是window軟體通常我們會採用ini檔案進行儲存,如果是j2se應用,我們會採用properties屬性檔案進行儲存。如果是android應用,我們最適合採用sharedpreferences儲存資料,它是乙個輕量級的儲存類,特別適合用於儲存軟體配置引數。使用sh...

SharedPreferences的四種模式

開發應用需要儲存一些配置引數,如果是window軟體通常我們會採用ini檔案進行儲存,如果是j2se應用,我們會採用properties屬性檔案進行儲存。如果是android應用,我們最適合採用sharedpreferences儲存資料,它是乙個輕量級的儲存類,特別適合用於儲存軟體配置引數。有兩種方...