熟悉RabbitMQ與AMQP協議

2021-08-15 23:08:06 字數 3221 閱讀 3781

1. 訊息佇列的簡介

rabbitmq採用erlang語言開發。erlang語言由ericson設計,專門為開發concurrent和distribution系統的一種語言,在電信領域使用廣泛。otp(open telecom platform)作為erlang語言的一部分,包含了很多基於erlang開發的中介軟體/庫/工具,如mnesia/sasl,極大方便了erlang應用的開發。otp就類似於python語言中眾多的module,使用者借助這些module可以很方便的開發應用。

2. amqp messaging 中的基本概念

3. 典型的「生產/消費」訊息模型

生產者傳送訊息到broker server(rabbitmq)。在broker內部,使用者建立exchange/queue,通過binding規則將兩者聯絡在一起。exchange分發訊息,根據型別/binding的不同分發策略有區別。訊息最後來到queue中,等待消費者取走。

4. exchange型別

exchange有多種型別,最常用的是direct/fanout/topic三種型別。

message中的「routing key」如果和binding中的「binding key」一致, direct exchange則將message發到對應的queue中。

每個發到fanout型別exchange的message都會分到所有繫結的queue上去。

根據routing key,及通配規則,topic exchange將分發到目標queue中。

routing key中可以包含兩種萬用字元,類似於正規表示式:

「#」通配任何零個或多個word

「*」通配任何單個word

交換機是用來傳送訊息的amqp實體。交換機拿到乙個訊息之後將它路由給乙個或零個佇列。它使用哪種路由演算法是由交換機型別和被稱作繫結(bindings)的規則所決定的。amqp 0-9-1的**提供了四種交換機

name(交換機型別)

default pre-declared names(預宣告的預設名稱)

direct exchange(直連交換機)

(empty string) and amq.direct

fanout exchange(扇型交換機)

amq.fanout

topic exchange(主題交換機)

amq.topic

headers exchange(頭交換機)

amq.match (and amq.headers in rabbitmq)

除交換機型別外,在宣告交換機時還可以附帶許多其他的屬性,其中最重要的幾個分別是:

交換機可以有兩個狀態:持久(durable)、暫存(transient)。持久化的交換機會在訊息**(broker)重啟後依舊存在,而暫存的交換機則不會(它們需要在**再次上線後重新被宣告)。然而並不是所有的應用場景都需要持久化的交換機。

預設交換機(default exchange)實際上是乙個由訊息**預先宣告好的沒有名字(名字為空字串)的直連交換機(direct exchange)。它有乙個特殊的屬性使得它對於簡單應用特別有用處:那就是每個新建佇列(queue)都會自動繫結到預設交換機上,繫結的路由鍵(routing key)名稱與佇列名稱相同。

舉個栗子:當你宣告了乙個名為"search-indexing-online"的佇列,amqp**會自動將其繫結到預設交換機上,繫結(binding)的路由鍵名稱也是為"search-indexing-online"。因此,當攜帶著名為"search-indexing-online"的路由鍵的訊息被傳送到預設交換機的時候,此訊息會被預設交換機路由至名為"search-indexing-online"的佇列中。換句話說,預設交換機看起來貌似能夠直接將訊息投遞給佇列,儘管技術上並沒有做相關的操作。

直連型交換機(direct exchange)是根據訊息攜帶的路由鍵(routing key)將訊息投遞給對應佇列的。直連交換機用來處理訊息的單播路由(unicast routing)(儘管它也可以處理多播路由)。下邊介紹它是如何工作的:

直連交換機經常用來迴圈分發任務給多個工作者(workers)。當這樣做的時候,我們需要明白一點,在amqp 0-9-1中,訊息的負載均衡是發生在消費者(consumer)之間的,而不是佇列(queue)之間。

直連型交換機圖例:

扇型交換機(funout exchange)將訊息路由給繫結到它身上的所有佇列,而不理會繫結的路由鍵。如果n個佇列繫結到某個扇型交換機上,當有訊息傳送給此扇型交換機時,交換機會將訊息的拷貝分別傳送給這所有的n個佇列。扇型用來交換機處理訊息的廣播路由(broadcast routing)。

因為扇型交換機投遞訊息的拷貝到所有繫結到它的佇列,所以他的應用案例都極其相似:

體育新聞**可以用它來近乎實時地將比分更新分發給移動客戶端

分發系統使用它來廣播各種狀態和配置更新

在群聊的時候,它被用來分發訊息給參與群聊的使用者。(amqp沒有內建presence的概念,因此xmpp可能會是個更好的選擇)

扇型交換機圖例:

主題交換機(topic exchanges)通過對訊息的路由鍵和佇列到交換機的繫結模式之間的匹配,將訊息路由給乙個或多個佇列。主題交換機經常用來實現各種分發/訂閱模式及其變種。主題交換機通常用來實現訊息的多播路由(multicast routing)。

使用案例:

RabbitMQ與AMQP協議詳解

生產者傳送訊息到broker server rabbitmq 在broker內部,使用者建立exchange queue,通過binding規則將兩者聯絡在一起。exchange分發訊息,根據型別 binding的不同分發策略有區別。訊息最後來到queue中,等待消費者取走 exchange有多種型...

php 的rabbitmq 擴充套件模組amqp安裝

使用php開發,要使用中間佇列rabbitmq,必須要安裝php的擴充套件模組amqp,伺服器的環境是php7.1.18 centos 6.8,nginx 1.8 使用php的pecl命令 usr local php bin pecl install amqp 安裝amqp 一直報如下錯 check...

RabbitMQ講解一 AMQP協議介紹

rabbitmq是一套基於amqp協議使用erlang語言開發的訊息佇列。下面首先來介紹一下amqp協議 以上這段文字 於維基百科。要注意其中的兩點乙個是與jms的不同。還有一點就是訊息是作為位元組流進行傳遞,而這個協議是規定了位元組流內容的格式。這個圖是關於amqp協議的,乙個服務端,裡面是有多v...