RabbitMQ消息堆积问题解决
发布于 2024-07-17
1190
版权声明
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
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葵花宝典的其他文章
SpringBoot多级缓存解决方案
SpringBoot实现项目更删改查后,会有新的问题需要解决,就是并发大的问题,一般而言,解决查询并发大的问题,常见的手段是为查询接口增加缓存,从而可以减轻持久层的压力。
SpringMVC-2-Spring MVC拦截器详解:从入门到精通
Spring MVC拦截器是Spring框架提供的一种功能强大的机制,用于在请求处理过程中进行预处理和后处理操作。它可以帮助开发人员在不修改原始处理器方法的情况下,添加通用的功能和逻辑。
RabbitMQ 入门实战指南:实现消息传递
RabbitMQ是一款功能强大的消息中间件,支持多种消息传递模式。下面是RabbitMQ的安装和快速入门指南:
Sharding基于inline模式实现水平分库分表
Sharding基于inline模式实现水平分库分表
Java BIO实现一个简易的多客户端聊天
Java BIO实现一个简易的多客户端聊天
加入社区微信群
与行业大咖零距离交流学习
PMO实践白皮书
白皮书上线
白皮书上线