1. 程式人生 > >RabbitMQ之五種訊息模型

RabbitMQ之五種訊息模型

首先什麼是MQ

MQ全稱是Message Queue,即訊息對列!訊息佇列是典型的:生產者、消費者模型。生產者不斷向訊息佇列中生產訊息,消費者不斷的從佇列中獲取訊息。因為訊息的生產和消費都是非同步的,而且只關心訊息的傳送和接收,沒有業務邏輯的侵入,這樣就實現了生產者和消費者的解耦。

RabbitMQ

RabbitMQ訊息模型

RabbitMQ提供了6種訊息模型,但是第6種其實是RPC,並不是MQ,因此不予學習。那麼也就剩下5種。但是其實3、4、5這三種都屬於訂閱模型,只不過進行路由的方式不同。

訊息模型示意圖

1.基本訊息模型

RabbitMQ是一個訊息代理:它接受和轉發訊息。 你可以把它想象成一個郵局:當你把郵件放在郵箱裡時,你可以確定郵差先生最終會把郵件傳送給你的收件人。 在這個比喻中,RabbitMQ是郵政信箱,郵局和郵遞員。 RabbitMQ與郵局的主要區別是它不處理紙張,而是接受,儲存和轉發資料訊息的二進位制資料塊。 基本訊息模型

P(producer/ publisher):生產者,一個傳送訊息的使用者應用程式。

C(consumer):消費者,消費和接收有類似的意思,消費者是一個主要用來等待接收訊息的使用者應用程式

佇列(紅色區域):rabbitmq內部類似於郵箱的一個概念。雖然訊息流經rabbitmq和你的應用程式,但是它們只能儲存在佇列中。佇列只受主機的記憶體和磁碟限制,實質上是一個大的訊息緩衝區。許多生產者可以傳送訊息到一個佇列,許多消費者可以嘗試從一個佇列接收資料。

總之:生產者將訊息傳送到佇列,消費者從佇列中獲取訊息,佇列是儲存訊息的緩衝區。

2.work訊息模型

工作佇列或者競爭消費者模式 work訊息模型 工作佇列,又稱任務佇列。主要思想就是避免執行資源密集型任務時,必須等待它執行完成。相反我們稍後完成任務,我們將任務封裝為訊息並將其傳送到佇列。 在後臺執行的工作程序將獲取任務並最終執行作業。當你執行許多工人時,任務將在他們之間共享,但是一個訊息只能被一個消費者獲取。 總之:讓多個消費者繫結到一個佇列,共同消費佇列中的訊息。佇列中的訊息一旦消 費,就會消失,因此任務是不會被重複執行的

3.訂閱模型(三類)

訂閱模型 解讀:

1、1個生產者,多個消費者

2、每一個消費者都有自己的一個佇列

3、生產者沒有將訊息直接傳送到佇列,而是傳送到了交換機

4、每個佇列都要繫結到交換機

5、生產者傳送的訊息,經過交換機到達佇列,實現一個訊息被多個消費者獲取的目的

X(Exchanges):交換機一方面:接收生產者傳送的訊息。另一方面:知道如何處理訊息,例如遞交給某個特別佇列、遞交給所有佇列、或是將訊息丟棄。到底如何操作,取決於Exchange的型別。

Exchange型別有以下幾種:

     Fanout:廣播,將訊息交給所有繫結到交換機的佇列

     Direct:定向,把訊息交給符合指定routing key 的佇列

     Topic:萬用字元,把訊息交給符合routing pattern(路由模式) 的佇列

Exchange(交換機)只負責轉發訊息,不具備儲存訊息的能力,因此如果沒有任何佇列與Exchange繫結,或者沒有符合路由規則的佇列,那麼訊息會丟失!

(1)訂閱模型-Fanout

Fanout,也稱為廣播。 在廣播模式下,訊息傳送流程是這樣的:

  • 1) 可以有多個消費者
  • 2) 每個消費者有自己的queue(佇列)
  • 3) 每個佇列都要繫結到Exchange(交換機)
  • 4) 生產者傳送的訊息,只能傳送到交換機,交換機來決定要發給哪個佇列,生產者無法決定。
  • 5) 交換機把訊息傳送給繫結過的所有佇列
  • 6) 佇列的消費者都能拿到訊息。實現一條訊息被多個消費者消費

(2)訂閱模型-Direct:

訂閱模型-Direct

在Direct模型下,佇列與交換機的繫結,不能是任意綁定了,而是要指定一個RoutingKey(路由key),訊息的傳送方在向Exchange傳送訊息時,也必須指定訊息的routing key。

P:生產者,向Exchange傳送訊息,傳送訊息時,會指定一個routing key。

X:Exchange(交換機),接收生產者的訊息,然後把訊息遞交給 與routing key完全匹配的佇列

C1:消費者,其所在佇列指定了需要routing key 為 error 的訊息

C2:消費者,其所在佇列指定了需要routing key 為 info、error、warning 的訊息

(3)訂閱模型-Topic

訂閱模型-Topic Topic 型別的 Exchange 與 Direct 相比,都是可以根據 RoutingKey 把訊息路由到不同的佇列。只不過 Topic 型別 Exchange 可以讓佇列在繫結 Routing key 的時候使用萬用字元!

萬用字元規則:#:匹配一個或多個詞*:匹配不多不少恰好 1 個詞

簡單以上就是RabbitMQ的五種訊息模型!