🚫 Ad Blocker Detected

Please disable your AD blocker to continue using this site. Ads help us keep the content free! please press keyboard F5 to refresh page after disabled AD blocker

請關閉廣告攔截器以繼續使用本網站。廣告有助於我們保證內容免費。謝謝! 關閉後請按 F5 刷新頁面

0%

RabbitMQ (二) 概念

介紹RabbitMQ

RabbitMQ是個訊息仲介(broker),主要是利用消息把生產者跟消費者解耦合

在RabbitMQ主要有以下角色

  1. 產生者(producer)
  2. 接收者(consumer)
  3. 佇列(Queue)
  4. 交換器(Exchange)
  5. 訊息(Message)

上面太抽象?  讓我來舉一個簡單點的例子

我們要寄信會把信投進郵筒,信件統一送到郵局,由分配至各個區域郵差去寄送信件

在此可把上面的角色對應在RabbitMQ上

  1. 產生者(producer)= 寄信人
  2. 接收者(consumer) = 收件人
  3. 佇列(Queue)= 郵差
  4. 交換器(Exchange) = 郵筒
  5. 訊息(Message)  = 信件

下面是我畫RabbitMq運作流程圖


RabbitMQ 腳色簡圖

  • 產生者(P)
  • 接收者(C)
  • 佇列(Queue)
  • 交換器(E)

[中間黑框]是RabbitMQ (Broker) 幫助 (P)和(C) 解耦合

Exchange 概念

生產者發送訊息時會經由Exchange來決定要給哪個Queue.

Exchange分發訊息根據類型的不同分發策略有區別

目前共四種類型:

  1. Direct
  2. Fanout
  3. Topic
  4. Headers

 

Direct

生產者傳送訊息中 RouteKey 必須跟 Queue binding key 一致 Exchange才會把資料送到Queue中.

如果一個Queue binding 到 Exchange 要求路由鍵為 “Daniel”,只接收 Routing key 是 “Daniel”的訊息,不會轉發“Daniel1”,RouteKey需完全匹配.

使用 Direct 交換器 可當作寄信需要  RouteKey (標註) 要由哪個 Queue (郵差)接收轉送此訊息,Queue (郵差)會藉由此 RouteKey (標註) 找到相對應消費者

Fanout

fanout 交換器不處理Route Key,簡單來說就是輪流把消息放進每個Queue中.

使用 fanout 交換器 把 信件(Message) 給 所有 郵差(Queue) 每個消費者都會收到此 信件(Message) 

在現實生活中有點類似經由  fanout交換器 (郵筒) 將傳單夾入所有信件中讓郵差發給所有人

Topic

Topic交換器和 Direct 交換器都需要查看 來分配訊息(RouteKey)和Binding中的binding key是否一致,但Topic交換器使用部分匹配比Direct 交換器多了更多彈性。

Topic交換器提供兩種方式

  1. ** #** 匹配0個或多個單字
  2. ** *** 匹配不多不少一個單字

例如 有兩個Queue (binding key)分別是 App.# 和 App.*

經由Topic交換器分配一個訊息RouteKey是 App.Daniel 則都會將資料塞入兩個 Queue (binding key) 為 App.# 和 App.* 

但如果另一個訊息RouteKey是 App .Daniel.Test 只會塞入 Queue (binding key) 為 App.# ,另一個  Queue (binding key) 是 App.*  不被匹配

在現實生活中有點類似 發送 信件(Message) 經由  Topic交換器 (郵筒) 會依照上面的區域 (例如台北縣,宜蘭縣)​​ 來分配相對應的區域信件轉交給 Queue (郵差) 給消費者

參考來源:

https://www.jianshu.com/p/79ca08116d57

__此文作者__:Daniel Shih(石頭)
__此文地址__: https://isdaniel.github.io/rabbitmq-install-01/
__版權聲明__:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 3.0 TW 許可協議。轉載請註明出處!

如果本文對您幫助很大,可街口支付斗內鼓勵石頭^^