# 用 Docker 玩 RabbitMQ
###### tags: `Docker` `RabbitMQ`
## 前置步驟
有安裝docker環境即可
# 實作步驟
[TOC]
# 一、建立RabbitMQ
## 1. 拉取 RabbitMQ image
這邊使用 management 的版本
```shell=
docker pull rabbitmq:management
```
運行結果

## 2. 運行 RabbitMQ
```shell=
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management
```
* 參數解釋:
1. --name:容器名稱
2. -d:背景執行
3. -p:5672應用訪問使用,15672為後台網站及API呼叫使用
4. -rm:結束後立即移除
運行結果如下
> 如果想看運行紀錄也可以使用`docker logs rabbitmq`

# 二、基本檢視和操作
這邊我們要主要實作`Publish/Subscribe` 的操作,其行為如下圖

X為Exchanges則紅色部分為Queues,詳情可參考最下方參考來源。
## 1. 進入管理頁面
因為我們是使用`management`版本的所以可以透過網址進入頁面,其預設帳密皆為`guest`
http://localhost:15672/

登入後可以看到一下畫面,之後就可以來執行相關設定了

## 2. 建立Queues用來存放資料
這邊我們建立兩個Queue來接收資料,其設定如下圖即可

圖片可以看到我們建立了 my_queue_01 和my_queue_02 兩個Queue用來接收資料

接下來就換到Exchanges設定
## 3. 建立 Exchanges 當作資料交換站
### 3-1. 建立 Exchange
這邊使用以下參數建立Exchanges

完成後會看到下方多了一筆我們新增的Exchange

### 3-2. 設定 Exchange 對應 Queue
點及我們新增的Exchange可以進入設定頁面,這邊我們要做的事情是綁定Exchange和Queue之間關聯,設定也如下圖,這邊使用`direct`的方式就是直接丟給指定的`Queue`
> 其 "Routing key" 用來指定推向哪些Queue使用

設定完成後則顯示在Bindings資料裡面

## 4. 進行測試
我們使用Postmat進行測試,其API使用可參考[RabbitMQ Management HTTP API](https://pulse.mozilla.org/api/index.html)這邊就不多做說明。
目前我們要執行的行為是,發送訊息到`my_exchange`並且指定`my_queue_01`讓其可以獲得訊息,其Postman的參數和測試結果如下
> 回傳訊息如果`Routed:true`代表有將訊息傳送到Queue。

回到管理畫面查看會看到該Queue已接收到對應的訊息了

最後附上Postman腳本:
```json=
{
"info": {
"_postman_id": "fd9082b2-243a-4197-a674-866de3187f9a",
"name": "MQ Test",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "RabbitMQ Test Publish",
"event": [
{
"listen": "prerequest",
"script": {
"exec": [
""
],
"type": "text/javascript"
}
}
],
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"value": "application/json"
},
{
"key": "Authorization",
"value": "Basic Z3Vlc3Q6Z3Vlc3Q="
}
],
"body": {
"mode": "raw",
"raw": "{\r\n \"properties\":{},\r\n \"routing_key\":\"mq_Queues\",\r\n \"payload\": \"my payload message\",\r\n \"payload_encoding\":\"string\"\r\n}"
},
"url": {
"raw": "http://localhost:15672/api/exchanges/%2F/mq_exchange/publish",
"protocol": "http",
"host": [
"localhost"
],
"port": "15672",
"path": [
"api",
"exchanges",
"%2F",
"mq_exchange",
"publish"
]
}
},
"response": []
}
]
}
```
# 結論
RabbitMQ目前在工作上使用還是偏少(ELK上有拿來使用)其資訊傳送方式還有很多種,下面參考資料可以去做延伸性的閱讀,這邊只做一個簡單的實作呈現方便評估功能。
<br/>
---
相關參考來源:
[【RabbitMQ】五分鐘輕鬆了解 RabbitMQ 運作](https://zamhuang.medium.com/rabbitmq-%E4%BA%94%E5%88%86%E9%90%98%E8%BC%95%E9%AC%86%E4%BA%86%E8%A7%A3-rabbitmq-%E9%81%8B%E4%BD%9C-fcaecbaa69d4)
[RabbitMQ Tutorials](https://www.rabbitmq.com/getstarted.html)
<style>
code > span{ color: red;}
</style>