当前位置: 首页 > news >正文

使用 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-managementcontainer_name: rabbitmq_3_12restart: always# 节点名 rabbit@rabbitserver,不然会去容器IDhostname: rabbitserverenvironment:# 默认虚拟机名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:/mypluginsnetworks:- devopsnetworknetworks: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地址 ,后续二次封装的时候再展开说怎么封装使用

相关文档

  • RabbitMQ 项目仓库
  • DockerHub 镜像
  • 官方文档
  • 延迟消息插件下载
  • .NET SDK 仓库

后语

安装还是比较简单的,版本选对,更多的是使用时需要根据业务选择适合的方案

插件的安装倒腾了一阵子,研究优化了流程

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python 消费Kafka手动提交 批量存入Elasticsearch
  • 微信小程序-使用Component方法代替Page方法构造页面
  • Profinet转EtherNet/IP协议转化网关(功能与配置)
  • DT浏览器使用教程之如何写书法笔记
  • mysql特殊字符、生僻字存储设置
  • idea-springboot后端所有@注释含义汇总-持续更新!
  • C++ 学习补充 1:短链算法
  • 高效掌握芯片设计技术的不二选择
  • 【redis】一致性hash算法和hash槽
  • 测试面试宝典(三十四)—— token是做什么用的?
  • Linux Vim教程:多文件编辑与窗口管理
  • Unity3D 转换微信小游戏指引 05 广告内购
  • 鸿蒙HarmonyOS开发:多种内置弹窗及自定义弹窗的详细使用指南
  • Vscode——如何快速搜索项目工程中的某个文件的位置
  • 关于STM32 UART4串口通信出现的N个问题的解决
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • ES6之路之模块详解
  • golang中接口赋值与方法集
  • IOS评论框不贴底(ios12新bug)
  • java取消线程实例
  • JSONP原理
  • JWT究竟是什么呢?
  • mysql外键的使用
  • sublime配置文件
  • Vue2 SSR 的优化之旅
  • 分享几个不错的工具
  • 规范化安全开发 KOA 手脚架
  • 聊聊flink的TableFactory
  • 软件开发学习的5大技巧,你知道吗?
  • 一道面试题引发的“血案”
  • 一文看透浏览器架构
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #include<初见C语言之指针(5)>
  • #Lua:Lua调用C++生成的DLL库
  • ${factoryList }后面有空格不影响
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Matlab)使用竞争神经网络实现数据聚类
  • (三分钟)速览传统边缘检测算子
  • (十一)手动添加用户和文件的特殊权限
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转载)Linux 多线程条件变量同步
  • .Net 基于MiniExcel的导入功能接口示例
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .net 使用ajax控件后如何调用前端脚本
  • .net6Api后台+uniapp导出Excel
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • ::
  • ??javascript里的变量问题
  • @Autowired 和 @Resource 区别的补充说明与示例
  • [ C++ ] STL---仿函数与priority_queue
  • [ linux ] linux 命令英文全称及解释