認識一下 RabbitMQ

2021-10-02 08:24:48 字數 3319 閱讀 4150

分布式系統中,如何在各個應用之間高效的進行通訊,是系統設計中的乙個關鍵。

使用訊息**(message broker)是乙個優雅的解決方案。

rabbitmq就是乙個被廣泛應用的訊息**,遵循amqp協議

接下來我們就了解一下:

石頭**

broker是經紀人的意思,促成賣方、買方的交易,例如房產經紀人。

訊息模型中,有訊息的生產者、消費者,就相當於賣方、買方。

所以,也需要乙個訊息經紀人,這就引出了message broker的概念。

message broker 從生產者接收訊息,再傳送給消費者,這樣,生產者、消費者可以完全隔離。

rabbitmq就是乙個message broker

具體如何傳遞訊息?要看使用的訊息協議。

rabbitmq 支援多種協議,其中最重要的是amqp(advanced message queuing protocol)。

amqp 的概念模型很簡單,包含3個部分:

當乙個訊息發布到 rabbitmq 後,首先到達 exchange,然後 exchange 把訊息分配給 queue,消費者從 queue 中得到訊息。

amqp 是乙個可程式設計的協議,我們可以自由配置 exchange, binding, queue。

queue 是先進先出資料結構。

queue 是 rabbitmq 儲存訊息的地方。

queue 可以靈活的配置,例如:

乙個 queue 可以同時連線多個 consumer。

consumer 既可以自己從 queue 拉取訊息,也可以由 queue 主動把訊息推給 consumer。

binding 是 queue 與 exchange 建立連線的規則

每個 queue 都會與乙個預設 exchange 連線,我們可以為這個 queue 連線更多的 exchange。

exchange 通過 binding 規則,把訊息路由到相應的 queue。

exchange 是 rabbitmq 的訊息閘道器。

exchange 就像是乙個接線員,收到訊息後決定如何**。

主要有 4 種**型別:

下面具體了解一下。

生產者(綠色球)傳送了乙個訊息,帶著乙個routing key--img.resize

當訊息到達 exchange(桔色球)後,exchange 會查詢所有帶著img.resize這個binding key的 queue。

找到匹配的 queue 之後,訊息就會被傳送給這些 queue。

如果沒找到,訊息會被退回給生產者,或者丟棄。

訊息到達指定的 queue 之後,會以輪詢的形式分派給消費者(resizer.1/resizer.2),確保負載均衡。

此方式會忽略routing key,把訊息分派給所有連線的 queue。

最常見的場景就是訊息廣播

注意,此方式是 exchange 廣播給 queue,不是 queue 廣播給 consumer。queue 到 consumer 還是輪詢的方式。

routing keybinding key進行模式匹配。

routing key == pattern in binding key
rabbitmq 使用*#這2個萬用字元。

*- 匹配乙個詞。

#- 匹配 0 個或多個詞。

routing keylogs.error的訊息,匹配binding key--logs.errorlogs.*,所以訊息會進入 "only error" 和 "alllogs"。

routing keylogs.success的訊息,匹配binding key--#successlogs.*,所以訊息會進入 "only success" 和 "alllogs"。

這種形式有非常多的應用場景,可以用於發布-訂閱模式、將相關資料分發給期望的 worker 等等。

一種特殊型別的 exchange,基於訊息頭中的 key 進行路由。

使用這種方式後,就會忽略訊息的routing key屬性。

對乙個 header exchange 建立 binding 時,可以對乙個 queue 繫結多個 header,這種情況下,訊息生產者需要告訴 rabbitmq 匹配哪些 key,producer 可以指定乙個標識x-match,值可以是:

訊息到達目的地之後,broker 應該從佇列中將其刪除,這是為了防止訊息過多導致溢位。

刪除訊息之前,broker 必須得到確認通知。

有 2 種通知方式:

推薦閱讀:

DevOps 認識一下

大家都在說devops develop operation 大概知道就是開發和運維溝通交流,一條線,然後使產品能夠順利的 短時間內上線 維穩什麼的。今天特意看了下 dockone裡面的一篇文章,再鞏固下自己的認識 開發運維一體化 總結一下 自動化是為了服務devops,並不是一定要自動化。目的是 提...

認識一下偽 吧

今天我希望在畫家的路上走走,驚嘆於css的神奇之餘,發現我對類似 的東西好陌生,於是乎,讓我們來認識一下它吧。first line 用於向文字的首行設定特殊樣式 first letter 用於向文字的首字母設定特殊樣式 font color background margin padding bor...

平淡生活 認識一下乾紅

乾紅的由來 葡萄酒的分類 一 按葡萄生長 不同分類 l 山葡萄酒 野葡萄酒 以野生葡萄為原料釀成的葡萄酒。產品以山葡萄酒或葡萄酒命名。2 家葡萄酒 以人工培植的釀酒品種葡萄為原料釀成的葡萄酒,產品直接以葡萄酒命名。國內葡萄酒生產廠家大都以生產家葡萄酒為主。二 按葡萄酒含汁量分類 1 全汁葡萄酒 葡萄...