赞
踩
从前几篇文章中,可以知道,整个消息中间件的运行过程如下图所示:
生产者将消息发送给rabbitMQ,然后消费者可以从对应的队列中读取消息进行消费,一般都是先从内存中读取消息,如果有持久化消息,那么再从磁盘中读取消息,当然如果从磁盘中找到了对应的消息就不需要再从磁盘中读取了。所以可以理解为消费者读取消息都是先内存读取再磁盘读取,消息一般存储在内存当中。
那么试想一下,当生产者生产消息足够快,或者说消费者机器宕机,那么内存中的消息是不是持续增加?那么就会内存压力非常大,当然你可以说我可以把一部分消息存储在磁盘当中啊,当然在消息量不大的时候,确实可行,但是是否考虑到在消息大爆发的时候,MQ服务器终究会撑不住,而且这样还会影响其它队列的消息收发。
那么是否有办法解决这一种情况呢?当然有的,rabbitMQ提供了一种惰性队列专门解决这种情况。现在来看一下官网给出的惰性队列的测试数据:
对于内存的消耗测试:当发送1千万条消息,每条消息的大小为1KB,并且此时没有任何的消费者,那么普通队列会消耗1.2GB的内存,而惰性队列只消耗1.5MB的内存
关于性能的测试:对于普通队列,如果要发送1千万条消息,需要耗费801秒,平均发送速度约为13000条/秒。如果使用惰性队列,那么发送同样多的消息时,耗时是421秒,平均发送速度约为24000条/秒。出现性能偏差的原因是普通队列会由于内存不足而不得不将消息换页至磁盘。如果有消费者消费时,惰性队列会耗费将近40MB的空间来发送消息,对于一个消费者的情况,平均的消费速度约为14000条/秒。
看完了上面的场景,现在来看一下啥是惰性队列吧。
RabbitMQ从3.6.0版本开始引入了惰性队列(Lazy Queue)的概念。惰性队列会尽可能的将消息存入磁盘中,而在消费者消费到相应的消息时才会被加载到内存中,它的一个重要的设计目标是能够支持更长的队列,即支持更多的消息存储。当消费者由于各种各样的原因(比如消费者下线、宕机亦或者是由于维护而关闭等)而致使长时间内不能消费消息造成堆积时,惰性队列就很有必要了。
队列具备两种模式:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。