【docker部署rabbitmq、使用DelayExchange插件实现延时消息发送】_rabbitmq 延时队列 docker部署


* 配置 cookie



vim /app/mq/.erlang.cookie

BVWDHYVHEZGVSKPDYUDK
集群中各节点.erlang.cookie内容应一致

修改cookie文件的权限

chmod 600 /caso/mq/.erlang.cookie


* 创建docker共享网络



docker network create mq-net


* 启动容器



docker run -d --hostname rabbitmq1 --restart unless-stopped --name rabbitmq1 --net mq-net -p 4369:4369 -p 25672:25672 -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=123456 -v /app/mq/data:/var/lib/rabbitmq -v /app/mq/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf -v /app/mq/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie rabbitmq:management

参数解释:
-d 容器后台运行
–hostname rabbitmq1 容器的主机名为 rabbitmq1
–restart=unless-stopped docker 容器重启后重启MQ
–name rabbitmq1 容器名为rabbitma1,在宿主机上运行“docker ps”命令时显示的名称
-p 4369:4369 EPMD(Erlang端口映射守护进程)端口号
-p 25672:25672 节点间和CLI工具通信(Erlang分发服务器端口)
-p 5672:5672 消息通讯端口
-p 15672:15672 后台管理端口
-e RABBITMQ_DEFAULT_USER=root 设置rabbitmq默认用户为root
-e RABBITMQ_DEFAULT_PASS=123456 设置rabbitmq默认密码为123456
-v /app/mq/data:/var/lib/rabbitmq 挂载/app/mq/data目录到容器
-v /app/mq/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf 映射配置文件
-v /app/mq/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie 映射cookie文件,也可以使用-e RABBITMQ_ERLANG_COOKIE=‘rabbitmq’ 设置 rabbitmq的cookie为“rabbitmq”,可以自定义为其他文本,容器保持一致即可。因为新版本中RABBITMQ_ERLANG_COOKIE环境变量方式已被标记为弃用,在需要加载cookie的命令执行时会有警告,未来版本该方式会被移除,推荐映射文件方式部署


* 验证是否启动成功  
 浏览器访问管理控制台 http://ip:15672/,输入账号、密码 登录
* 安装延时消息插件



下载插件包

https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases
注意插件版本要与rabbitmq版本对应
mkdir /app/mq/mq-plugins
将插件上传到对应目录

拷贝插件到容器

docker cp /app/mq/mq-plugins/rabbitmq_delayed_message_exchange-3.9.0.ez rabbitmq1:/plugins

进入容器

docker exec -it rabbitmq1 /bin/bash

验证插件是否存在

cd plugins
ls |grep delay

启动延时消息插件

rabbitmq-plugins enable rabbitmq_delayed_message_exchange


* rabbitmq安装包中自带消息追踪日志插件,为了方便排查问题可以提前开启插件



启动消息追踪日志插件

rabbitmq-plugins enable rabbitmq_tracing


* [插件使用方法]( )  
 ![开启一个消息追踪](https://img-blog.csdnimg.cn/direct/7fedf216dc3640f8a8b6a8c2124d390f.png)  
 ![开启的消息追踪](https://img-blog.csdnimg.cn/direct/9b8d9eeeaa75499aa41586f5559fc2e9.png)  
 ![日志内容](https://img-blog.csdnimg.cn/direct/cb86f3997851432a92b48a2d75abe290.png)
* 退出容器,重启使新安装插件生效



exit
docker restart rabbitmq1


#### rabbitmq集群单节点部署完成,在spring-boot项目中实现消息发送、延时消息消费及异常消息存储


* 依赖



org.springframework.boot spring-boot-starter-amqp 3.0.4

* rabbitmq客户端配置



spring:
rabbitmq:
host: 192.168.0.210
port: 5672
username: root
password: 123456
# 消费者确认机制相关配置
# 开启publisher-confirm,
# 这里支持两种类型:simple:同步等待confirm结果,直到超时;# correlated:异步回调,定义ConfirmCallback,MQ返回结果时会回调ConfirmCallback
publisher-confirm-type: correlated
# publish-returns:开启publish-return功能,同样是基于callback机制,不过是定义ReturnCallback
publisher-returns: true
# 定义消息路由失败时的策略。true,则调用ReturnCallback;false:则直接丢弃消息
template:
mandatory: true
listener:
simple:
# 一次拉取的数量(默认值:250,强制要求顺序消费配置1)
prefetch: 250
# 消费端的监听个数(即@RabbitListener开启几个线程去处理数据。)
concurrency: 10
# 消费端的监听最大个数
max-concurrency: 100
# 消息手动确认
acknowledge-mode: manual
# 消费者retry重试机制
retry:
enabled: true
# 每次失败后等待时长的翻倍数
multiplier: 1
# 最大重试次数
max-attempts: 3
# 重试状态
stateless: true
direct:
auto-startup: true
acknowledge-mode: manual
retry:
enabled: true
max-attempts: 3
type: simple


* 配置延时消息生产者消费者交换机、队列、路由



@Configuration
public class MqProducerConsumerConfig {
/**
* 延迟交换机
*/
public static final String DELAY_EXCHANGE_NAME = “member.delay.exchange”;
/**
* 延迟队列
*/
public static final String DELAY_QUEUE_NAME = “member.delay.queue”;
/**
* 延迟队列路由key
*/
public static final String DELAY_QUEUE_ROUTING_KEY = “delay.routingKey”;

/\*\*

* 声明延迟交换机
*
* @return CustomExchange 延迟交换机
*/
@Bean
public CustomExchange delayExchange() {
HashMap<String, Object> args = new HashMap<>();
args.put(“x-delayed-type”, “direct”);
return new CustomExchange(DELAY_EXCHANGE_NAME, “x-delayed-message”, true, false, args);
}

/\*\*

* 声明延迟队列
*
* @return Queue 延迟队列
*/
@Bean
public Queue delayQueue() {
return new Queue(DELAY_QUEUE_NAME);
}

/\*\*

* 设置延迟队列的绑定关系
*
* @return Binding 延迟队列的绑定关系
*/
@Bean
public Binding delayBinding() {
return BindingBuilder.bind(delayQueue()).to(delayExchange()).with(DELAY_QUEUE_ROUTING_KEY).noargs();
}
}


* 配置异常消息生产者交换机、队列、路由



@Configuration
public class MqErrorMsgConfig {
/**
* 交换机
*/
public static final String EXCHANGE_NAME = “member.error.exchange”;
/**
* 队列
*/
public static final String QUEUE_NAME = “member.error.queue”;
/**
* 队列路由key
*/
public static final String QUEUE_ROUTING_KEY = “error”;

/\*\*

* 声明失败消息交换机
*
* @return 交换机
*/
@Bean
public DirectExchange errorExchange() {
return new DirectExchange(EXCHANGE_NAME);
}

/\*\*

* 声明失败消息队列
*
* @return 消息队列
*/
@Bean
public Queue errorQueue() {
// 设置队列持久化
return new Queue(QUEUE_NAME, true);
}

/\*\*

* 绑定交换机、消息队列,指定对应的队列路由key
*
* @return 绑定
*/
@Bean
public Binding errorBind() {
return BindingBuilder.bind(errorQueue()).to(errorExchange()).with(QUEUE_ROUTING_KEY);
}

/\*\*

* 实现MessageRecover接口的子类RepublishMessageBuilder
*
* @param rabbitTemplate rabbitTemplate
* @return 异常消息
*/
@Bean
public MessageRecoverer republishMessageBuilder(RabbitTemplate rabbitTemplate) {
return new RepublishMessageRecoverer(rabbitTemplate, EXCHANGE_NAME, QUEUE_ROUTING_KEY);
}
}


* 封装消息发送组件



@Component
public class MqProducerMsgSendUtil {
private static final Logger log = LoggerFactory.getLogger(MqProducerMsgSendUtil.class);
@Resource
private RabbitTemplate rabbitTemplate;

public MqProducerMsgSendUtil() {
}

public void send(String delayExchangeName, String delayQueueRoutingKey, String msg, Integer delayTime) {
    log.info("发送mq消息:{},延时:{} ms接收", msg, delayTime);
    this.rabbitTemplate.convertAndSend(delayExchangeName, delayQueueRoutingKey, msg, (message) -> {
        message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
        message.getMessageProperties().setHeader("x-delay", delayTime);
        return message;
    });
}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
[外链图片转存中…(img-9UPzQsB7-1712995879171)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值