RabbitMQ消息堆积问题解决
发布于 2024-07-17
1068
版权声明
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
springboot葵花宝典
扫码关注公众号
扫码阅读
手机扫码阅读
RabbitMQ安装DelayExchange插件实现延迟队列摘要
今日目标
掌握惰性队列(lazy-queue)的使用及相关场景。
1. 消息堆积问题介绍
当生产者发送消息的速度超过消费者处理速度时,队列可能出现消息堆积,导致死信问题。解决方案包括:增加消费者数量、使用线程池加快处理速度、扩大队列容积等。但扩大容积需避免消息存储在内存中,可考虑磁盘存储。
2. 惰性队列(Lazy Queues)
RabbitMQ自3.6.0版本起支持惰性队列,其特点是消息直接存储到磁盘,消费时才加载到内存,支持存储数百万条消息。
2.1 基于RabbitMQ客户端创建设置
在客户端创建队列时可通过图形化工具设置x-queue-mode属性为lazy。
2.2 基于命令行设置惰性队列
通过命令行声明惰性队列,设置x-queue-mode属性为lazy。例如:
rabbitmqctl set_policy Lazy "^lazy-queue$" '{"queue-mode":"lazy"}' --apply-to queues
2.3 基于@Bean声明惰性队列
在消费端可通过@Bean注解声明惰性队列:
@Configuration
public class LazyConfig {
@Bean
public Queue lazyQueue() {
return QueueBuilder
.durable("lazy1.queue")
.lazy()
.build();
}
}
2.4 基于@RabbitListener声明惰性队列
通过@RabbitListener注解声明惰性队列,设置x-queue-mode属性为lazy。
2.5 测试
通过发送接口测试惰性队列的效果。启动发送项目但不启动接收项目,可观察消息存储在磁盘而非内存中。
@GetMapping("/lazy/{msg}")
public String lazyMsg(@PathVariable("msg") String msg) {
rabbitTemplate.convertAndSend("lazy.queue", msg);
return "发送成功 时间为" + LocalTime.now();
}
3. 总结
惰性队列解决消息堆积问题的优点是基于磁盘存储,支持高消息上限,性能稳定;缺点则是消息时效性较低,受限于磁盘IO性能。
推荐使用惰性队列以提高消息存储能力,但需权衡性能与时效性之间的取舍。
springboot葵花宝典
springboot葵花宝典
扫码关注公众号
还在用多套工具管项目?
一个平台搞定产品、项目、质量与效能,告别整合之苦,实现全流程闭环。
查看方案
springboot葵花宝典的其他文章
加入社区微信群
与行业大咖零距离交流学习
PMO实践白皮书
白皮书上线
白皮书上线