[我們一起來學 RabbitMQ 一 ]RabbitMQ 的基本介紹

小魔童哪吒發表於2021-09-25

嗨,大家好,我是小魔童哪吒,我們們從今天開始進入開源元件的學習,一邊學習一邊總結一邊分享

文章提綱如下:

  • RabbitMQ 簡單介紹及使用
  • RabbitMQ 的六種工作模式

本次文章不涉及編碼,編碼我們們統一放在下一次

RabbitMQ 簡單介紹

RabbitMQ 是一套開源(MPL)的訊息佇列服務軟體,是由 LShift 提供的一個 Advanced Message Queuing Protocol (AMQP) 的開源實現,由以高效能、健壯以及可伸縮性出名的 Erlang 寫成。

AMQP 是什麼?

高階訊息佇列協議,它使得遵從該規範的客戶端應用和訊息中介軟體伺服器的全功能互操作成為可能

客戶端應用可以通過這個協議與訊息代理和它實現的 AMQP 模型進行互動通訊

MQ 是什麼?

全稱 Message Queue , 即訊息匯流排

是一種跨程式、非同步的通訊機制

用於上下游傳遞訊息,由訊息系統來確保訊息的可靠傳遞。

RabbitMQ 一般使用在什麼場景?

  • 錯峰流控
  • 保證資料的最終一致性
  • 上下游邏輯解耦
  • 具體的使用場景與下面說到的 RabbitMQ 的六種工作模式息息相關

RabbitMQ 元件中都包含了啥?

  • 消費者

可以訂閱某個佇列

  • 生產者

建立訊息,然後釋出到佇列中(queue),最終將訊息傳送到監聽的消費者

  • Broker:

一個實體,用於標識訊息佇列伺服器

  • Virtual Host

虛擬主機

標識一批交換機、訊息佇列和相關物件

虛擬主機是共享相同的身份認證和加密環境的獨立伺服器域

每個vhost本質上就是一個mini版的RabbitMQ伺服器,擁有自己的佇列、交換器、繫結和許可權機制

  • Exchange

交換器,用來接收生產者傳送的訊息並將這些訊息路由給伺服器中的佇列

  • Queue

訊息佇列,用來儲存訊息直到傳送給消費者

它是訊息的容器,也是訊息的終點

一個訊息可投入一個或多個佇列

訊息一直在佇列裡面,等待消費者連線到這個佇列並將它取走

  • Banding

繫結,用於訊息佇列和交換機之間的關聯

一個繫結就是基於路由鍵將交換機和訊息佇列連線起來的路由規則,所以可以將交換器理解成一個由繫結構成的路由表

  • Channel

通道,多路複用連線中的一條獨立的雙向資料流通道

通道是建立在真實的TCP連線內地虛擬連結,AMQP命令都是通過新到發出去的,不管是釋出訊息、訂閱佇列還是接收訊息,這些動作都是通過通道完成的,為了複用一條TCP連線

  • Connection

網路連線,例如一個TCP連線,可以有多個

  • Publisher

訊息的生產者

也是一個向交換器釋出訊息的客戶端應用程式

  • Consumer

訊息的消費者

表示從一個訊息佇列中取得訊息的客戶端應用程式

  • Message

訊息,它是由訊息頭和訊息體組成

訊息體是不透明的,而訊息頭則是由一系列的可選屬性組成

這些屬性包括如下引數

  • routing-key (路由鍵)
  • priority (優先順序)
  • delivery-mode (訊息可能需要永續性儲存[訊息的路由模式])

市面上都有哪些 MQ ?

  • RabbitMQ
  • Kafka
  • ActiveMQ
  • ZeroMQ
  • RocketMQ

那麼我們為啥選擇 RabbitMQ ?

我們們來看看 RabbitMQ 的特點

  • 可靠性

RabbitMQ 使用了 持久化、傳輸確認、釋出確認 等 機制來保證可靠性

  • 靈活的路由

在訊息進入佇列之前,通過Exchange來路由訊息

對於典型的路由功能,RabbitMQ 已經提供了一些內建的Exchange來實現

對於複雜的路由功能,RabbitMQ 可以將多個Exchange繫結在一起,也通過外掛機制實現自己的Exchange

  • 訊息叢集

多個 RabbitMQ 伺服器可以組成一個叢集,形成一個邏輯 Broker

  • 高可用

RabbitMQ 佇列可以在叢集中的機器上進行映象,使得在部分節點出問題的情況下佇列仍然可用

  • 多種語言客戶端

幾乎支援所有常用語言,比如Java、.NET、Ruby、GO

  • 管理介面

提供了易用的使用者介面,使得使用者可以監控和管理訊息 Broker

  • 跟蹤機制

如果訊息異常,RabbitMQ 提供了訊息的跟蹤機制,使用者可以找出具體發生了什麼

  • 外掛機制

提供了許多外掛,來從多方面進行擴充套件,也可以編輯自己的外掛

RabbitMQ 的六種工作模式

圖片來源於 RabbitMQ 官方文件 www.rabbitmq.com/getstarted.html

simple 簡單模式

簡單的訊息生產者和簡單的消費者的關係,生產者生產訊息,放到佇列中,消費中消費佇列中的訊息

  • 訊息產生者將訊息放入佇列
  • 訊息的消費者監聽訊息佇列,如果佇列中有訊息就消費掉

訊息被拿走後,自動從佇列中刪除

work 工作模式

多個消費端消費同一個佇列中的訊息,佇列採用輪詢的方式將訊息是平均傳送給消費者,此處的資源是競爭關係

  • 訊息產生者將訊息放入佇列,這裡的消費者可以有多個

消費者C1,消費者C2,同時監聽同一個佇列

訊息被消費者C1,C2共同爭搶當前的訊息佇列內容,誰先拿到誰負責消費訊息

這裡就會有這樣的問題,同一個訊息會被不同的消費者都消費掉,我們需要處理這種問題

可以設定一個開關,syncronize,保證一條訊息只能被一個消費者使用

  • 用於場景
    • 紅包場景
    • 大型專案中的資源排程

publish/subscribe 釋出訂閱模式

publish/subscribe 釋出訂閱模式 , 相對於Work queues模式多了一個交換機,此處的資源是共享的

生產端先把訊息傳送到交換機,再由交換機把訊息傳送到繫結的佇列中,每個繫結的佇列都能收到由生產端傳送的訊息

  • X 代表交換機 RabbitMQ 內部元件,每個消費者監聽自己的佇列
  • 生產者將訊息發給broker,由交換機將訊息轉發到繫結此交換機的每個佇列,每個繫結交換機的佇列都將接收
    到訊息
  • 用於場景
    • 郵件群發
    • 群聊天
    • 廣播(廣告等)

routing 路由模式

  • 每個消費者監聽自己的佇列,並且設定帶統配符的 routingkey
  • 生產者將訊息發給broker,由交換機根據 routingkey 來轉發訊息到指定的佇列

大致涉及的流程如下:

生產者處理流程:

宣告佇列並宣告交換機 -> 建立連線 -> 建立通道 -> 通道宣告交換機 -> 通道宣告佇列 -> 通過通道使佇列繫結到交換機並指定該佇列的routingkey(萬用字元) -> 制定訊息 -> 傳送訊息並指定routingkey(萬用字元)

消費者處理流程:

宣告佇列並宣告交換機 -> 建立連線 -> 建立通道 -> 通道宣告交換機 -> 通道宣告佇列 -> 通過通道使佇列繫結到交換機並指定routingkey(萬用字元) -> 重寫訊息消費方法 -> 執行訊息方法

Topics 模式實際上是路由模式的一種

他倆的最大的區別是 : Topics 模式傳送訊息和消費訊息的時候是通過萬用字元去進行匹配的

萬用字元有如下注意點:

  • */#星號或者井號代表萬用字元
  • 星號代表多個單詞,而井號代表一個單詞
  • 路由功能新增模糊匹配
  • 訊息生產者生產訊息,把訊息交給交換機 exchange
  • 交換機 exchange 根據 key 的規則模糊匹配到對應的佇列,由佇列的監聽消費者接收訊息消費

RPC 模式

RPC 遠端過程呼叫,客戶端遠端呼叫服務端的方法 ,使用 MQ 可以實現 RPC 的非同步呼叫

這是基於Direct交換機實現的,流程如下:

  • 客戶端即是生產者也是消費者,向 RPC 請求佇列傳送 RPC 呼叫訊息,同時監聽RPC響應佇列

  • 服務端監聽RPC請求佇列的訊息,收到訊息後執行服務端的方法,得到方法返回的結果

  • 服務端將RPC方法 的結果傳送到RPC響應佇列。

  • 客戶端監聽RPC響應佇列,接收到RPC呼叫結果

總結

  • RabbitMQ是一套開源(MPL)的訊息佇列服務軟體
  • RabbitMQ 元件中都包含如下部分
    • 生產者
    • 消費者
    • broker 實體
    • virtual host 虛擬機器
    • exhcnage 交換機
    • binding 繫結關係
    • queue 佇列
    • connection 連線
    • channel 通道
    • message 訊息
  • 選擇 RabbitMQ 的原因有哪些
  • RabbitMQ 的六種工作模式:
    • simple 簡單模式
    • work 工作模式
    • publish/subscribe 訂閱釋出模式
    • routing 路由模式
    • RPC 模式

參考資料:

RabbitMQ Tutorials

歡迎點贊,關注,收藏

朋友們,你的支援和鼓勵,是我堅持分享,提高質量的動力

好了,本次就到這裡

技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。

我是小魔童哪吒,歡迎點贊關注收藏,下次見~

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章