queue(佇列)是rabbitmq的內部物件,用於訊息的消費,用下圖表示。
rabbitmq中的訊息都只能儲存在queue中,生產者(下圖中的p)生產訊息並最終投遞到queue中,消費者(下圖中的c)可以從queue中獲取訊息並消費。
多個消費者可以訂閱同乙個queue,這時queue中的訊息會被平均分攤給多個消費者進行處理,而不是每個消費者都收到所有的訊息並處理。
引數:交換機的功能主要是接收訊息並且**到繫結的佇列,交換機不儲存訊息,在啟用ack模式後,交換機找不到佇列會返回錯誤。交換機有四種型別:direct, topic, headers and fanout
direct exchange是rabbitmq預設的交換機模式,也是最簡單的模式,根據key全文匹配去尋找佇列。
圖4
第乙個 x - q1 就有乙個 binding key,名字為 orange; x - q2 就有 2 個 binding key,名字為 black 和 green。當訊息中的 路由鍵 和 這個 binding key 對應上的時候,那麼就知道了該訊息去到哪乙個佇列中。
ps:為什麼 x 到 q2 要有 black,green,2個 binding key呢,乙個不就行了嗎? - 這個主要是因為可能又有 q3,而q3只接受 black 的資訊,而q2不僅接受black 的資訊,還接受 green 的資訊。
x-orange-q1組成乙個channel。
topic exchange **訊息主要是根據萬用字元。 在這種交換機下,佇列和交換機的繫結會定義一種路由模式,那麼,萬用字元就要在這種路由模式和路由鍵之間匹配後交換機才能**訊息。
在這種交換機模式下:
rabbittemplate.convertandsend("testtopicexchange","key1.a.c.key2", " this is rabbitmq!");
小結:topicexchange是支援萬用字元的directexchange, 可以使用兩個萬用字元:
-key.a
key.a.b
key.*tf
key.#tt
headers 也是根據規則匹配, 相較於 direct 和 topic 固定地使用 routing_key , headers 則是乙個自定義匹配規則的型別.
在佇列與交換器繫結時, 會設定一組鍵值對規則, 訊息中也包括一組鍵值對( headers 屬性), 當這些鍵值對有一對, 或全部匹配時, 訊息被投送到對應佇列.
fanout exchange 訊息廣播的模式,不管路由鍵或者是路由模式,會把訊息發給繫結給它的全部佇列,如果配置了routing_key會被忽略。
exchange
bindings
測試結果及說明
queues
routing key
test_direct
queue00
publish message 時需指定 routing key。不指定則傳送到第乙個不用 routing key 繫結的 queue00;指定 routing key 則傳送到繫結的佇列中。
queue01 rk
queue02
kk01
test_fanout
queue00
message 傳送到所有繫結的佇列中,即使設定 routing key 也無效,所依沒必要設定多餘的 routing key。
queue03
queue04
test_topic
queue00
message 傳送時傳送到萬用字元符合的佇列中。不指定則傳送到第乙個不用 routing key 繫結的 queue00;publish message 指定 routing key 為 aa.kkk 類的則傳送到 routing key=aa.# 的佇列 queue05 中。
queue05
aa.#
queue06
bb.#
rabbitmq學習筆記一
首先我們先看rabbitmq原理圖 exchange交換器 接受訊息和路由訊息,然後將訊息傳送給訊息佇列。對於每乙個虛擬主機內部,交換器有獨一無二的名字 應用程式在其許可權範圍之內可以自由建立 共享 使用和銷毀交換例項。持久交換器可以使持久的 臨時的 或者自動刪除的。持久直到顯式刪除時消失 臨時交換...
RabbitMQ學習筆記1
博主從事網路程式設計3年了,但是說來慚愧的是,工作中沒有使用過訊息佇列。所以呢,打算從今天開始系統學習一些訊息佇列相關的知識,部落格也就作為筆記了。記錄一下自己的一些理解過程,有不對之處希望各位指出。生產者 消費者與訊息佇列 首先呢,訊息佇列不生產資料,他只是乙個資訊的搬運工具。資料由生產者提供,經...
RabbitMQ學習筆記 2
由乙個生產者進行生產,經由訊息佇列,被多個消費者消費。傳送端 如下 public class newtask 接收端 如下 public class worker public static void main string args throws exceptioncatch interrupte...