使用 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 - 指定账号密码:
rootdevops666 - 指定端口:
5672:应用连接端口15672:web 管理界面 - 挂载数据目录:
./data:/var/lib/rabbitmq - 挂载额外的插件目录:
./myplugins:/mypluginsRabbitMQ 容器中默认插件目录是 /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 ,优化了流程,安装插件不需要复制文件和重启容器
需要先下载插件:rabbitmq_delayed_message_exchange-3.12.0.ez,下载对应版本的 。ez 文件:Github Releases
将下载的插件文件放到 。/myplugins 文件夹 前面将 myplugins 挂载到了容器
连接容器执行启用插件:
docker exec -it rabbitmq_3_12 /bin/bash -c "rabbitmq-plugins enable rabbitmq_delayed_message_exchange"因为已经挂载 myplugins 和设置为插件目录了 会自己去找 /plugins 和/myplugins 对应的 ez 文件以安装

启用成功,可在 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
连接配置
var factory = new ConnectionFactory
{
HostName = "192.168.123.214",
Port = 5672,
VirtualHost = "admin_vhost",
UserName = "root",
Password = "devops666",
};
Demo 示例
建了一个 demo 测试使用 Demo地址 ,后续二次封装的时候再展开说怎么封装使用
相关文档
后语
安装还是比较简单的,版本选对,更多的是使用时需要根据业务选择适合的方案
插件的安装倒腾了一阵子,研究优化了流程
使用 Docker Compose 部署 RabbitMQ 的一些经验与踩坑记录的更多相关文章
- 部署spingboot项目到云服务器踩坑记录
按教程部署mall电商系统 https://www.macrozheng.com/mall/deploy/mall_deploy_docker.html#docker环境安装 只记录SpringBoo ...
- 关于 IdentityServer 部署到生产环境相关问题踩坑记录
Idsr 定义了几种模式适用于不同的场景: // // 摘要: // OpenID Connect flows. public enum Flows { // // 摘要: // authorizat ...
- 使用Docker Compose部署基于Sentinel的高可用Redis集群
使用Docker Compose部署基于Sentinel的高可用Redis集群 https://yq.aliyun.com/articles/57953 Docker系列之(五):使用Docker C ...
- Docker Compose 部署前后端分离应用
部署前后端分离应用 容器化 Abp 应用 关于 Abp 应用的容器化,其实和普通的 ASP.NET Core 应用差不多,大家可以参考我此前的文章. 唯一需要注意的是:因为 Abp 解决方案中有多个项 ...
- Docker Compose部署项目到容器-基于Tomcat和mysql的项目yml配置文件代码
场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- 在Windows Server 2019通过Docker Compose部署Asp.Net Core
一.安装Docker Enterprise 安装文档是: https://docs.docker.com/install/windows/docker-ee/ 安装完成后,如下图 二.首先,拉取一个W ...
- 使用Docker Compose 部署Nexus后初次登录账号密码不正确,并且在nexus-data下没有admin,password
场景 Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/ ...
- Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程)
场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- Docker Compose部署Nexus3时的docker-compose,yml代码
场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- Docker Compose部署GitLab服务,搭建自己的代码托管平台(图文教程)
场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
随机推荐
- MySQL8 概述、下载、安装、使用(Windows2019和centos7.9)
MySQL8 概述.下载.安装.使用(Windows2019和centos7.9) 1.MySQL概述 1.1 数据库相关概念在这一部分,先了解三个概念:数据库.数据库管理系统.SQL. 名称 全称 ...
- MyBatis使用注解开发(及Sqlsession连接器的本质)
使用注解开发 底层实现机制是反射和,动态代码.反射可以获得这个类的方法属性还可以创建对象,执行方法. 面向接口编程 之前学过,面向对象编程,也学习过接口.但是真正的开发中,很多时候我们会选择面向接口编 ...
- vim玩法 .vimrc配置映射指令nnoremap、inoremap
编辑 vimrc 文件, vi ~/.vimrc vim中的映射指令,用于将一个按键绑定到某一个操作上. map: 执行映射指令,执行时会进行递归替换,可能会出现"按键循环"的情况 ...
- zabbix 添加 zabbix_agentd 服务
创建服务文件 # /usr/lib/systemd/system/zabbix-agent.service [Unit] Description=Zabbix Agent After=syslog.t ...
- python: 判断是否是某一类型
函数isinstance 语法 isinstance(object, classinfo) 参数 object -- 实例对象. classinfo -- 可以是直接或间接类名.基本类型或者由它们组成 ...
- QPushButton按钮的使用
1 import sys 2 from PyQt5.QtCore import * 3 from PyQt5.QtGui import * 4 from PyQt5.QtWidgets import ...
- JMeter 线程组之Stepping Thread Group插件
JMeter 线程组之Stepping Thread Group插件 测试环境 apache-jmeter-2.13 插件:https://jmeter-plugins.org/downloads ...
- 使用canvas(2d)+js实现一个简单的傅里叶级数绘制方波图
先看效果 查看页面右下角,嘿嘿 简要说明 创建具有不同半径与角速度的圆集合:(截图中展现的效果为5个,代码是30个,运行后效果会不同) const getCircles = (N = 10) => ...
- paging组件的用法和意义
一.Paging组件的意义 分页加载是在应用程序开发过程中十分常见的需求,我们经常需要以列表的方式加载大量的数据,这些数据通常来自网络或本地数据库.然而,如果一次性将所有数据全部加载出来,必然会消耗大 ...
- 初识Redis与桌面客户端
Redis介绍 什么是Redis Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库. Redi ...