(八)消息队列——RabbitMQ的惰性队列

本文探讨了消息堆积问题,特别是在高并发场景下,RabbitMQ内存存储的局限性。惰性队列作为一种解决方案被提出,它将消息直接存储到磁盘,仅在消费者需要时才加载到内存,从而避免内存预警并稳定性能。设置惰性队列只需在声明队列时指定x-queue-mode为lazy。这种策略虽引入磁盘IO,但能有效缓解消息堆积并确保系统的稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

消息队列——惰性队列

一、消息堆积问题:

当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列存储消息达到上限。最早接收到的消息,可能就会成为死信,会被丢弃,这就是消息堆积问题。

解决消息堆积有三种种思路:

  1. 增加更多消费者,提高消费速度
  2. 在消费者内开启线程池加快消息处理速度
  3. 扩大队列容积,提高堆积上限

二、惰性队列:

1、背景:

RabbitMQ的队列是内存存储的,在高并发的情况下,数百万的消息如果都扔到内存中,显然不是很合适。因为MQ对内存的存储也会有一个预警值,如果达到预警值,MQ则会处于暂停状态,阻止生产者投递消息到MQ,然后将这部分消息刷出到磁盘,清理一部分的内存空间出来。 因此MQ的并发能力会出现一种波浪状态,性能不够稳定。

2、惰性队列:

从RabbitMQ的3.6.0版本开始,就增加了Lazy Queues的概念,也就是惰性队列。可以用来解决消息堆积问题。如果一个队列堆积比较严重,就可以把这个队列开启为惰性队列。

  1. 接收到消息后直接存入磁盘而非内存
  2. 消费者要消费消息时才会从磁盘中读取并加载到内存
  3. 支持数百万条的消息存储

虽然惰性队列性能稳定,但是增加了一些磁盘的IO,从消息的发送要接收会有一定的延迟,但也在可以接受的范围内。

3、设置惰性队列:

要设置一个队列为惰性队列,只需要在声明队列时,指定x-queue-mode属性为lazy即可。

可以通过命令行将一个运行中的队列修改为惰性队列:
^lazy-queue$ 用来匹配队列的名称,匹配到的就设置为惰性队列。
在这里插入图片描述
在这里插入图片描述

三、总结:

在这里插入图片描述

RabbitMQ 中的惰性队列是指当队列被声明时,它不会立即分配内存和处理其他资源,而是在需要时才进行分配。这种延迟分配的机制可以减少系统的资源消耗,尤其对于具有大量队列但只有少数活动的情况下更为有效。 当消息送到一个惰性队列时,RabbitMQ 会根据需要进行内存分配和其他资源的处理。通过这种方式,RabbitMQ 可以有效地管理资源,只为实际需要处理的队列分配资源,而不是为所有队列预先分配资源。 惰性队列对于动态创建临时队列或者处理大量长时间闲置的队列非常有用。它可以帮助减少内存使用量,并提高整体系统的性能和可伸缩性。 要使用惰性队列,只需在声明队列时设置 `x-queue-mode` 参数为 `lazy` 即可。例如,使用 RabbitMQ 的 AMQP 客户端库声明一个惰性队列的示例如下: ```python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.queue_declare(queue='my_queue', arguments={'x-queue-mode': 'lazy'}) connection.close() ``` 在上述示例中,通过在声明队列时传递 `arguments` 参数,我们可以设置 `x-queue-mode` 参数的值为 `'lazy'`,以创建一个惰性队列。 需要注意的是,惰性队列可能会增加一些延迟,因为在消息被送到队列后,RabbitMQ 需要进行资源分配和处理。因此,在设计应用程序时,需要谨慎考虑惰性队列的使用场景,以确保它们符合特定需求的性能要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值