---
# System prepended metadata

title: 用 Docker 玩 RabbitMQ
tags: [RabbitMQ, Docker]

---

# 用 Docker 玩 RabbitMQ
###### tags: `Docker` `RabbitMQ` 

## 前置步驟
有安裝docker環境即可

# 實作步驟
[TOC]

# 一、建立RabbitMQ
## 1. 拉取 RabbitMQ image
這邊使用 management 的版本
```shell=
docker pull rabbitmq:management
```
運行結果
![](https://i.imgur.com/Bd4iWod.png)



## 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`

![](https://i.imgur.com/PAMxjgw.png)



# 二、基本檢視和操作

這邊我們要主要實作`Publish/Subscribe` 的操作，其行為如下圖

![](https://i.imgur.com/LVFsjj4.png)

Ｘ為Exchanges則紅色部分為Queues，詳情可參考最下方參考來源。


## 1. 進入管理頁面
因為我們是使用`management`版本的所以可以透過網址進入頁面，其預設帳密皆為`guest`
http://localhost:15672/

![](https://i.imgur.com/ePlUoWQ.png)

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

![](https://i.imgur.com/QUGuCZt.png)


## 2. 建立Queues用來存放資料

這邊我們建立兩個Queue來接收資料，其設定如下圖即可
![](https://i.imgur.com/cVJCVzl.png)

圖片可以看到我們建立了 my_queue_01 和my_queue_02 兩個Queue用來接收資料
![](https://i.imgur.com/xrEd6Mw.png)

接下來就換到Exchanges設定

## 3. 建立 Exchanges 當作資料交換站

### 3-1. 建立 Exchange
這邊使用以下參數建立Exchanges
![](https://i.imgur.com/gRFGM3S.png)

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

![](https://i.imgur.com/gyqiUvH.png)

### 3-2. 設定 Exchange 對應 Queue

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

![](https://i.imgur.com/GsEJpLo.png)

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

![](https://i.imgur.com/htad7YT.png)


## 4. 進行測試

我們使用Postmat進行測試，其API使用可參考[RabbitMQ Management HTTP API](https://pulse.mozilla.org/api/index.html)這邊就不多做說明。

目前我們要執行的行為是，發送訊息到`my_exchange`並且指定`my_queue_01`讓其可以獲得訊息，其Postman的參數和測試結果如下
> 回傳訊息如果`Routed:true`代表有將訊息傳送到Queue。

![](https://i.imgur.com/gQn2jgF.png)


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

![](https://i.imgur.com/TiCok1N.png)


最後附上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>