使用 Docker Compose 部署 RabbitMQ 的一些經驗與踩坑記錄

前言

RabbitMQ 是一個功能強大的開源消息隊列系統,它實現了高效的消息通信和異步處理。

本文主要介紹其基於 Docker-Compose 的部署安裝和一些使用的經驗。

特點

  • 成熟,穩定
  • 消息持久化
  • 靈活的消息路由
  • 高性能,高可用性,可擴展性高
  • 支持插件系統:RabbitMQ 具有豐富的插件系統,可以通過安裝插件來擴展其功能,例如管理界面、消息追蹤、消息轉換等。
  • 官方提供了 .NET/Java 的 SDK

使用情況

  • 項目中用於日誌記錄,消息發送,數據同步等,穩定可靠
  • 業務模塊的初始化,數據導入異步處理
  • 做好冪等處理,不同場景使用不同的確認方式,防止消息的重複消費
  • RabbitMQ 默認不支持延遲消息,使用延遲消息插件實現即可(有侷限,僅支持最多一兩天的延遲消息
  • 使用 .NET SDK:RabbitMQ.Client,後面再分享二次封裝使用

實踐

使用 Docker Compose V2 安裝 rabbitmq v3.12.6

準備

  • 當前版本:v3.12.6
  • 使用鏡像:rabbitmq:3.12.6-management (帶 web 管理界面)
  • 默認端口:5672:應用連接端口 15672:web 控制檯

使用 Docker Compose 安裝

本篇文章基於 Docker V24 及 Docker Compose V2,安裝可以參考之前的文章

配置說明

  • 固定了鏡像版本:rabbitmq:3.12.6-management
  • 指定的主機名:rabbitserver
  • 指定虛擬機名稱:admin_vhost
  • 指定賬號密碼: root devops666
  • 指定端口:5672:應用連接端口 15672:web 管理界面
  • 掛載數據目錄:./data:/var/lib/rabbitmq
  • 掛載額外的插件目錄:./myplugins:/myplugins RabbitMQ 容器中默認插件目錄是 /plugins 不推薦掛載
  • 將 ./myplugins 掛載到容器的,並將其加入插件查找的目錄中:RABBITMQ_PLUGINS_DIR: '/plugins:/myplugins'
  • 指定網絡:devopsnetwork (docker network create devopsnetwork)

配置文件 compose.yml

  • 準備好 compose.yml 拷貝到服務器

  • 然後運行docker compose up -d即可

     version: '3.1'
     services:
       rabbitmq:
         image: rabbitmq:3.12.6-management
         container_name: rabbitmq_3_12
         restart: always
         # 節點名 rabbit@rabbitserver,不然會去容器ID
         hostname: rabbitserver
         environment:
           # 默認虛擬機名
           RABBITMQ_DEFAULT_VHOST: admin_vhost
           # 用戶名
           RABBITMQ_DEFAULT_USER: root
           # 密碼
           RABBITMQ_DEFAULT_PASS: devops666
           # 指定自定義插件目錄
           RABBITMQ_PLUGINS_DIR: '/plugins:/myplugins'
         ports:
           - "5672:5672"
           - "15672:15672"
         volumes:
           - ./data:/var/lib/rabbitmq
           - ./myplugins:/myplugins
         networks:
           - devopsnetwork
    
     networks:
       devopsnetwork:
         external: true
     ```
    
    

部署成功

部署機器IP:192.168.123.214

安裝插件:延遲消息插件

注意:插件消息發佈延遲只支持到 數秒、分鐘或數小時,最多一兩天,注意!!!

原文: This plugin was designed for delaying message publishing for a number of seconds, minutes, or hours。 A day or two at most.

! ! ! 前面的 compose.yml 默認是將。/myplugins 掛載到容器的,並指定了多個插件目錄 系統:/plugins 自己添加:/myplugins ,優化了流程,安裝插件不需要複製文件和重啓容器

  1. 需要先下載插件:rabbitmq_delayed_message_exchange-3.12.0.ez,下載對應版本的 。ez 文件:Github Releases

  2. 將下載的插件文件放到 。/myplugins 文件夾 前面將 myplugins 掛載到了容器

  3. 連接容器執行啓用插件:docker exec -it rabbitmq_3_12 /bin/bash -c "rabbitmq-plugins enable rabbitmq_delayed_message_exchange"

  4. 因爲已經掛載 myplugins 和設置爲插件目錄了 會自己去找 /plugins 和/myplugins 對應的 ez 文件以安裝

  5. 啓用成功,可在 Exchanges 頁查看

踩過的坑

  • 根據上文配置來不會再出現下面的問題,遇到一樣的問題可參考

  • 延遲消息僅支持最多一兩天的延遲消息,項目中有個定時發消息的功能,設置的適合時間設置超過閾值無法被消費 說明

  • 不要掛載/plugins 插件目錄,可以用RABBITMQ_PLUGINS_DIR: '/plugins:/myplugins'來指定多個目錄,這樣只需要執行 文檔

  • 不指定 hostname 節點名稱會是容器 Id

  • 使用了 rabbitmq:3.x-management 鏡像(具有 web 管理頁面的功能)但是掛載了空的插件目錄會報錯:{"init terminating in do_boot",{undef,[{rabbit,boot,[],[]},{init,start_em,1,[]},{init,do_boot,3,[]}]}}

  • Admin 頁面提示報錯:升級版本吧 issues 我開始用的 3.9.29-management(tags 列表排序 3.9 排在前面,( ╯□╰ )),報這個錯

  • 切換版本前需要經。/data 數據清空,不然啓動不起來

  • Exchanges 頁面報錯: 我把版本換成 3.12.6-management 後報了這個錯,沒有退出登錄,只需 Ctrl+F5,重新登錄下就好

使用

.NET SDK

官方:RabbitMQ.Client

連接配置

var factory = new ConnectionFactory
{
    HostName = "192.168.123.214",
    Port = 5672,
    VirtualHost = "admin_vhost",
    UserName = "root",
    Password = "devops666",
};

Demo 示例

建了一個 demo 測試使用 Demo地址 ,後續二次封裝的時候再展開說怎麼封裝使用

相關文檔

後語

安裝還是比較簡單的,版本選對,更多的是使用時需要根據業務選擇適合的方案

插件的安裝倒騰了一陣子,研究優化了流程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章