簡介
RabbitMQ 是一個開源的消息隊列(有時又稱 訊息導向的中間件 Message-oriented middleware),由 Erlang 所寫成的應用。
AMQP(Advanced Message Queuing Protocol) 是一個應用層協議,用於在應用程序之間傳遞消息;RabbitMQ 是他的實作該協議的應用程式之一。
這邊先使用 Docker 進行測試。這邊會有兩版本映像版本,分別為有 management 的版本和不帶 management 的版本。
差異為是否具有管理介面,當在進行開發或是學習時優先使用具有管理介面的版本。
管理介面版本包含了基礎版所有功能,並且提供額外的管理介面插件(Management Plugin)。提供了 網頁監控、查看佇列狀態、管理使用者、監控效能指標、查看連接狀態 等功能。
為什麼會用到他?
- 解耦 Decoupling, 系統不同可以透過消息且不直接調用進行異步通訊
- 伸縮性 Scalability, 可以透過增加消費者來提升效能
- 平滑峰流量 Smoothing traffic Peaks, 可以透過佇列來平滑流量,防止系統過載(overload)
- 可靠性 Reliability, 透過消息持久化來保證消息不會遺失
環境準備
預設帳號密碼:
guest/guest
docker pull rabbitmq:3-management
docker pull docker.io/library/rabbitmq:3-management:latest
可使用環境變數修改預設帳號密碼
類似這樣:(RABBITMQ_DEFAULT_USER,RABBITMQ_DEFAULT_PASS)
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq:3-management
執行 RabbitMQ
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
當執行 rabbitmq 後,可以透過 15672 port 進行管理介面 (http://localhost:15672) 的操作。

解釋一下關於 AMQP
先提出一些在裡面的名詞
| 名詞 | 說明 |
|---|---|
| Producer | 生產者,發送消息的應用程式(產生任務的傢伙) |
| Consumer | 消費者,接收消息的應用程式(負責消化任務的工人) |
| Broker | 代理,接收生產者發送的消息,並將消息發送給消費者(中繼站) |
| Queue | 佇列,存放消息的地方 |
| Exchange | 交換機,決定消息的路由規則(根據規則轉到對應的佇列: 規則) |
| Binding | 綁定,交換機和佇列之間的綁定關係 |
| Routing Key | 路由鍵,交換機根據路由鍵將消息發送到對應的佇列 |
| Virtual Host | 虛擬主機,一個 RabbitMQ 伺服器可以有多個虛擬主機,每個虛擬主機是一個獨立的訊息隊列 |
| Connection | 連接,生產者或消費者與 RabbitMQ 伺服器之間的連接 |
| Channel | 通道,生產者或消費者與 RabbitMQ 伺服器之間的通道,一個連接可以有多個通道 |
映射 RabbitMQ 和 AMQP 的關係
圖片出處:https://medium.com/@chnwsw01/rabbitmq-6eead78a2539
根據上述圖片,我們可以大概建立一個基礎的觀念模型。
RabbitMQ 支援多種類型的 Exchange 包括了…
Direct Exchange直接交換機: 根據 Routing Key 來轉發消息: 1 vs 1Fanout Exchange扇形交換機: 將消息轉發到所有綁定的佇列: 1 vs NTopic Exchange主題交換機: 根據 Routing Key 和通配符來轉發消息: 1 vs NHeaders Exchange標頭交換機: 根據標頭屬性來轉發消息: 1 vs N
程式碼範例:
Sending doesn’t work ! (發送不成功)
如果推送訊息時並毫無”已發送”的回應,或許可能原因是 broker 空間不足導致的。(默認情況下,至少要有 50MB 的空間)
而拒絕接收消息,可以檢查 broker Log 是否有無相關紀錄,並在必要時降低所需空間的閥值(disk_free_limit)。
照著官網範例來一步一步的進行程式碼撰寫
- Hello world ! 最簡單執行的範例 -> exchange 空字串,queue 名稱為
hellorepository 該範例為官方網站之範例,並增加一些註解且套上 symfony 方便自己呼叫。 關注的內容應為對應之 class 的 execute 方法,該方法為執行的主要邏輯。
剩餘的部分再繼續寫。。。