RabbitMQ學習筆記(二) 基礎概念

2021-09-07 18:05:13 字數 2284 閱讀 9372

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...