RabbitMQ(四) | 惰性队列 - 解决消息堆积问题
- 1.消息堆积问题
- 2.惰性队列
- 2.1.基于命令行设置lazy-queue
- 2.2.基于@Bean声明lazy-queue
- 2.3.基于@RabbitListener声明LazyQueue
- 2.4.发送消息
- **惰性队列数据变化**
- 正常队列数据变化
- 3.总结
接上一篇:RabbitMQ(三) | 死信交换机、死信队列、TTL、延迟队列(安装DelayExchange插件)
1.消息堆积问题当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列存储消息达到上限。之后发送的消息就会成为死信,可能会被丢弃,这就是消息堆积问题。
解决消息堆积有两种思路:
- 增加更多消费者,提高消费速度。也就是我们之前说的work queue模式
- 给消费者开启多线程,提高消费速度
- 扩大队列容积,提高堆积上限
要提升队列容积,把消息保存在内存中显然是不行的。
2.惰性队列从RabbitMQ的3.6.0版本开始,就增加了Lazy Queues的概念,也就是惰性队列。惰性队列的特征如下:
- 接收到消息后直接存入磁盘而非内存
- 消费者要消费消息时才会从磁盘中读取并加载到内存
- 支持数百万条的消息存储
而要设置一个队列为惰性队列,只需要在声明队列时,指定x-queue-mode属性为lazy即可。可以通过命令行将一个运行中的队列修改为惰性队列:
rabbitmqctl set_policy Lazy "^lazy-queue$" '{"queue-mode":"lazy"}' --apply-to queues
命令解读:
rabbitmqctl
:RabbitMQ的命令行工具set_policy
:添加一个策略Lazy
:策略名称,可以自定义"^lazy-queue$"
:用正则表达式匹配队列的名字'{"queue-mode":"lazy"}'
:设置队列模式为lazy模式--apply-to queues
:策略的作用对象,是所有的队列
在consumer服务端的新增惰性队列配置类LazyConfig:
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/** 惰性队列配置 */
@Configuration
public class LazyConfig {
/** 惰性队列 - 增加了.lazy()属性 */
@Bean
public Queue lazyQueue() {
return QueueBuilder.durable("lazy.queue")
.lazy() // 开启x-queue-mode为lazy
.build();
}
/** 正常队列 */
@Bean
public Queue normalQueue() {
return QueueBuilder.durable("normal.queue")
.build();
}
}
2.3.基于@RabbitListener声明LazyQueue
在consumer服务端的消息监听类中新增方法
@RabbitListener(queuesToDeclare = @Queue(
name = "lazy.queue",
durable = "true",
arguments = @Argument(name = "x-queue-mode", value = "lazy")
))
public void listenLazyQueue(String msg) {
log.info("接收到 lazy.queue 的消息:{}", msg);
}
2.4.发送消息
这里对正常队列和惰性队列进行十万条数据的测试,启动consumer服务,在publisher服务的SpringAmqpTest类中新增下列两个方法:
/** 测试惰性队列 */
@Test
public void testLazyQueue() throws InterruptedException {
// 模拟发送十万条数据
long b = System.nanoTime();
for (int i = 0; i
关注
打赏
热门博文
- ES(四)| 数据聚合(分组、求和、求平均值、求最大最小值)
- Canal | 工作原理、安装部署、使用第三方插件与SpringBoot完美整合
- Redis分布式缓存(三)| 哨兵集群原理、哨兵集群搭建、集群故障恢复、与SpringBoot集成
- Redis分布式缓存(二)| 主从架构搭建、全量/增量同步原理、主从同步优化
- Redis分布式缓存(一)| 单机安装、RDB和AOF持久化
- RabbitMQ(四) | 惰性队列 - 解决消息堆积问题
- RabbitMQ(三) | 死信交换机、死信队列、TTL、延迟队列(安装DelayExchange插件)
- RabbitMQ(二) | 消息可靠性(消息确认机制、消息持久化、消息重试机制)
- RabbitMQ(一) | MQ技术对比,以及对RabbitMQ五种消息模型的使用
- Docker | 安装RabbitMQ详细教程,以及安装遇到的问题:Stats in management UI are disabled on this node