Slide 1

Slide 1 text

A Quick Start Guide For RabbitMQ RabbitMQ is lightweight and easy to deploy on premises and in the cloud

Slide 2

Slide 2 text

About Me 白凱仁(Kyle Bai) • Interested in emerging technologies. • COSCUP, Kubernetes Day and OpenStack Day Speaker. • OpenStack and Kubernetes Projects Contributor(100+ PR). • Certified Kubernetes Administrator. @kairen([email protected]) https://kairen.github.io/

Slide 3

Slide 3 text

Agenda Today I would like to talk about • RabbitMQ 介紹 • RabbitMQ 範例 • Hello World • Work Queues • Publish/Subscribe • Routing • Topics • Use Case

Slide 4

Slide 4 text

RabbitMQ 介紹

Slide 5

Slide 5 text

What is RabbitMQ? RabbitMQ 是實現了進階訊息佇列協定(AMQP)的開源 訊息代理軟體(亦稱訊息導向中介層)。 • 以 Erlang 語言開發而成。 • Client Library 支援多種程式語言。 • 支援 HA 與 Clustering。 • 支援 Multi-protocol(MQTT、STOMP等)。

Slide 6

Slide 6 text

RabbitMQ 特性 • 可靠性(Reliability):RabbitMQ 使用一些機制來確保可靠性︐如持久化、Publisher Confirms。 • 靈活的路由(Flexible Routing):透過 Exchange來路由訊息要到哪個 Queue。 • Web-based 管理介面(Management UI):RabbitMQ提供了一個易用的使用者介面︐使得可以監 控和管理訊息 Broker。 • 追蹤機制(Tracing System):如訊息異常時︐RabbitMQ 提供訊息追蹤機制︐來幫助使用者找出問 題點。 • 插件機制(Plugin System):RabbitMQ 提供了許多插件來擴展功能。

Slide 7

Slide 7 text

AMQP AMQP(Advanced Message Queue)是應用層協定的一個開放標準。它支援符合要求的 客戶端應用(Application)和訊息中介軟體代理(Messaging middleware broker)之間進 行通訊︐而其主要特徵是面向訊息、佇列、路由(包括點對點和釋出/訂閱)、可靠性 與安全性等等。 • 完全開放 • 廣泛適用於企業 • 有 RabbitMQ、ActiveMQ 與 StormMQ 等實作專案

Slide 8

Slide 8 text

AMQP 三層 • Module Layer︐位於協定最高層︐主要定義了一些供客戶端呼叫的指令︐客戶端可以 利用這些指令實現自己的業務邏輯︐例如:客戶端可以透過 queue.declare 聲明一個 Queue︐利用 Consume 指令獲取一個 Queue 中的訊息。 • Session Layer︐主要負責將客戶端的指令發送給伺服器(Broker)︐在將 Broker 的應答 返回給客戶端︐主要為客戶端與 Broker 之間溝通提供可靠性、同步機制與錯誤處 理。 • Transport Layer︐主要傳輸二進制資料流︐提供訊框的處理‘頻道復用、錯誤檢測與 資料表示。

Slide 9

Slide 9 text

Why use AMQP? 在分散式系統中︐子系統如果使用 Socket 來進行溝通的話︐會有很多問題要解決︐ 如以下︓ • 訊息發送者與接收者如何維持連線︐而有一方中斷時︐如何確保訊息不遺失︖ • 如何降低發送者與接收者的耦合度︖ • 如何做到 Load Balance︐以平衡接收者的負擔︖ • 如何將訊息發送到相關的接收者︐如果接收者訂閱了不同訊息︐要如何被正確分發 呢︖

Slide 10

Slide 10 text

Message System Compare 產品 優點 缺點 OpenFire(XMPP) 1.成熟穩定 2.適合做 IM 伺服器 1.訊息可靠性無保障 2.叢集模式不完善 3.集 議模式不完善 4.協定不輕量量 ActiveMQ(JMS) 1.成熟穩定 2.與Java契合度⾼高 1.路路由策略略不靈活 2.叢集模式不穩定 RabbitMQ(AMQP) 1.成熟穩定 2.路路由策略略靈活 3.訊息傳輸 可靠性佳 4.叢集⽅方案成熟 1.組態多、學習和維護成本⾼高

Slide 11

Slide 11 text

RabbitMQ Message Model

Slide 12

Slide 12 text

RabbitMQ and Server Concepts • Producer: 發送訊息的來源、應用程式等。 • Queue: 儲存訊息的緩衝區。 • Consumer: 接收訊息的應用程式等。 • Message: 透過 RabbitMQ 從 Producer 發送給 Consumer 的資訊。

Slide 13

Slide 13 text

RabbitMQ and Server Concepts • Exchange: 訊息交換器︐依據使用的 Exchange type 來將訊息路由到 Queue。 • Routing key: 是 Exchange 查看的密鑰︐被用於決定如何將訊息路由到 Queue 中︐ 可以理解成訊息的地址。 • Binding: Queue 與 Exchange 的鏈接。 • Binding key:Queue 鏈接 Exchange 時︐所指定的密鑰。

Slide 14

Slide 14 text

RabbitMQ and Server Concepts • Channel: 是連線內的虛擬連線︐當從 Queue 發送或使用訊息時︐都會透過 Channel 來完成。 • Connection: 應用程式跟 RabbitMQ broker 之間的 TCP 連線。 • Users: RabbitMQ 可以設定使用者與密碼來分配權限︐如讀取、寫入等等。 • Vhost, virtual host: 提供了一種方法來隔離使用相同 RabbitMQ 實例。 • Broker:用以表示 Message Queue 伺服器實體。

Slide 15

Slide 15 text

Message flow in RabbitMQ 1. Producer 發送訊息到一個 Exchange。

Slide 16

Slide 16 text

Message flow in RabbitMQ 1. Producer 發送訊息到一個 Exchange。 2. Exchange 接受到訊息︐並進行路由。

Slide 17

Slide 17 text

Message flow in RabbitMQ 1. Producer 發送訊息到一個 Exchange。 2. Exchange 接受到訊息︐並進行路由。 3. 建立 Exchange 到 Queues 的綁定。

Slide 18

Slide 18 text

Message flow in RabbitMQ 1. Producer 發送訊息到一個 Exchange。 2. Exchange 接受到訊息︐並進行路由。 3. 建立 Exchange 到 Queues 的綁定。 4. 這時訊息會被保留在 Queue 中︐直到有 Consumer 來處理。

Slide 19

Slide 19 text

Message flow in RabbitMQ 1. Producer 發送訊息到一個 Exchange。 2. Exchange 接受到訊息︐並進行路由。 3. 建立 Exchange 到 Queues 的綁定。 4. 這時訊息會被保留在 Queue 中︐直到有 Consumer 來處理。 5. Consumer 接收來至某個 Queue 的訊息。

Slide 20

Slide 20 text

Types Of Exchanges

Slide 21

Slide 21 text

Direct Exchanges 訊息中的 Routing key 跟 Binding Key 一致時︐Exchange 會直接將訊息發到對應 Queue 中。

Slide 22

Slide 22 text

Fanout Exchanges 每個發到 Fanout 類型的 Exchange 的訊息都會被分到所有綁定的 Queue 上。適合做 Load Balancer。

Slide 23

Slide 23 text

Topic Exchanges Topic: 透過匹配 Routing key (“a.b.c.d”)屬性來將訊息路由到 Queue 上。 • * 匹配一個單字。 • # 則為 0 或者多個單字(舉例 *.stock.# 可以匹配 usd.stock 與 eur.stock.db︐但 stock.nasdaq 無法)。

Slide 24

Slide 24 text

RabbitMQ 範例

Slide 25

Slide 25 text

Quick Start for Docker $ docker run -d -p 5671:5671 -p 5672:5672 \ -p 4369:4369 -p 25672:25672 \ -p 15671:15671 -p 15672:15672 \ --name rabbitmq \ rabbitmq:3-management $ docker ps

Slide 26

Slide 26 text

Get client library • Java: https://www.rabbitmq.com/java-client.html • Go: go get github.com/streadway/amqp

Slide 27

Slide 27 text

Hello World(One-to-one) 這種模式會建立一個 Consumer 來監聽 Queue︐一旦有訊息時︐就會直接拿來使用︐ 並將訊息從 Queue 刪除。 • 可應用於聊天室系統中。 • 這種方式可能會因為訊息沒被正確處理︐就從 Qeueu 中刪除而導致訊息遺失。

Slide 28

Slide 28 text

Hello World

Slide 29

Slide 29 text

Hello World

Slide 30

Slide 30 text

Work Queues 該範例會有多個 Consumer(C1, C2) 同時監聽一個 Queue︐這時 C1 與 C2 將會共同競 爭當前訊息 Queue 內容︐誰先拿到就由誰負責。同時防止接收端在處理訊息時掛掉︐ 因此只有在訊息處理完成後︐才會發送 Ack 訊息。 • 可應用在系統排程、Web 應用程式︐或者搶紅包系統等

Slide 31

Slide 31 text

Publish/Subscribe(Fanout) 該範例會有一個 Exchange 依據發送訂閱的模式設定︐來將訊息路由到所有綁定的 Queue 中︐再由後端相關 Consumer 來拿取訊息。 • 可以應用於群組訊息發送(通知)、廣告與郵件群發等

Slide 32

Slide 32 text

Routing(Direct) Producer 發送訊息到 Exchange︐並同時綁定一個 Routing Key︐這時 Exchange 會 根據 Routing Key 對下游綁定的 Queue 以 Key 作為判斷來路由訊息︐滿足 Routing Key 的 Queue 才會收到訊息。 • 可應用於專案或系統的錯誤回報

Slide 33

Slide 33 text

Topics 該範例類似 Routing 的功能︐同樣會讓 Exchange 來路由不同 Key 內容到綁定的 Queue 中︐但會以 *(單字) 跟 #(0或多個單字) 來匹配多個 Topic 名稱(a.b.c)。

Slide 34

Slide 34 text

Use cases

Slide 35

Slide 35 text

OpenStack OpenStack 採用 RabbitMQ 來管理元件之間都操作︐比如說開啟一個虛擬機、區塊 儲存等等。

Slide 36

Slide 36 text

騰訊雲-CMQ CMQ 是基於 RabbitMQ 二次開發的 產品。而該案例使用在第三方支付 系統上︐透過 Message Queue 來確 保支付訊息的傳遞可靠性與安全性。

Slide 37

Slide 37 text

Microservice Event Bus