RabbitMQ筆記 基礎知識

2022-01-15 19:48:47 字數 2250 閱讀 1942

是一種應用程式間通訊方法,不需要程式之間直接建立聯絡。mq是用於接收、儲存、分發訊息的獨立應用程式。

是用erlang**寫的,遵循amqp協議;amqp協議:高階訊息佇列協議

不需要實時處理的業務,不需要實時反饋結果給使用者,不知道誰依賴我的處理結果

不同的exchange型別不同發布策略也不同,fanout效能最高,其次是direct,最後是topic和headers

direct:

訊息中的路由鍵(routing key)如果和 binding 中的 binding key 一致, 交換器就將訊息發到對應的佇列中。

fanout:

每個發到 fanout 型別交換器的訊息都會分到所有繫結的佇列上去。fanout 交換器不處理路由鍵,只是簡單的將佇列繫結到交換器上,每個傳送到交換器的訊息都會被**到與該交換器繫結的所有佇列上。很像子網廣播

topic(主題)

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

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

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

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

headers

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

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

default exchange:

default exchange 其實是amqp中預先宣告的,屬於direct型別,default exchange 的名是 "";

他有乙個特殊的屬性,當你手動建立乙個佇列時,mq會自動將這個佇列繫結到default exchange 上,繫結時 bindingkey 與佇列名稱相同

預設交換器隱式繫結到每個佇列,路由鍵等於佇列名稱。不能顯式地繫結到預設交換器,也不能從預設交換器解除繫結。它也不能被刪除。

// 宣告乙個 queue,這個時候我們不主動binding的話,test_queue 會和default exchange 繫結,此時 bindingkey = test_queue

queue queue = new queue("test_queue");

// 向預設交換機發布訊息

rabbittemplate.convertandsend("", "test_queue", message);

rpc(遠端過程呼叫)

mq本身是基於非同步的訊息處理,前面的示例中所有的生產者(p)將訊息傳送到rabbitmq後不會知道消費者(c)處理成功或者失敗(甚至連有沒有消費者來處理這條訊息都不知道)。

但實際的應用場景中,我們很可能需要一些同步處理,需要同步等待服務端將我的訊息處理完成後再進行下一步處理。這相當於rpc(remote procedure call,遠端過程呼叫)。在rabbitmq中也支援rpc。

rabbitmq中實現rpc的機制是:

客戶端傳送請求(訊息)時,在訊息的屬性(messageproperties,在amqp協議中定義了14種properties,這些屬性會隨著訊息一起傳送)中設定兩個值replyto(乙個queue名稱,用於告訴伺服器處理完成後將通知我的訊息傳送到這個queue中)和correlationid(此次請求的標識號,伺服器處理完成後需要將此屬性返還,客戶端將根據這個id了解哪條請求被成功執行了或執行失敗)

伺服器端收到訊息並處理

伺服器端處理完訊息後,將生成一條應答訊息到replyto指定的queue,同時帶上correlationid屬性

客戶端之前已訂閱replyto指定的queue,從中收到伺服器的應答訊息後,根據其中的correlationid屬性分析哪條請求被執行了,根據執行結果進行後續業務處理

RabbitMQ基礎知識

什麼是mq?mq全稱為message queue,訊息佇列 mq 是一種應用程式對應用程式的通訊方法。mq是消費 生產者模型的乙個典型的代表,一端往訊息佇列中不斷寫入訊息,而另一端則可以讀取佇列中的訊息。rabbitmq是mq的一種。下面詳細介紹一下rabbitmq的基本概念。1 佇列 生產者 消費...

RabbitMQ基礎知識

rabbitmq簡介 rabbitmq是乙個由erlang開發的amqp advanved message queue protocol 的開源實現。核心概念 message 訊息,訊息是不具名的,它由訊息頭和訊息體組成。訊息體是不透明的,而訊息頭則由一系列的可選屬性組成,這些屬性包括routing...

RabbitMQ基礎知識詳解

什麼是mq?mq全稱為message queue,訊息佇列 mq 是一種應用程式對應用程式的通訊方法。mq是消費 生產者模型的乙個典型的代表,一端往訊息佇列中不斷寫入訊息,而另一端則可以讀取佇列中的訊息。rabbitmq是mq的一種。下面詳細介紹一下rabbitmq的基本概念。1 佇列 生產者 消費...