RabbitMQ之五種消息模型


首先什么是MQ

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

RabbitMQ

基於AMQP協議,erlang語言開發,穩定性好!基於AMQP的一款消息管理系統
官網: http://www.rabbitmq.com/
官方教程:http://www.rabbitmq.com/getstarted.html

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(路由模式) 的隊列
  • 1
  • 2
  • 3
  • 4
  • 5

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的五種消息模型!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM