前面解决了消息的可靠性、消息的延迟问题,下面研究一下消息的堆积的问题:
(1)消息堆积问题
消息产生堆积,上限后,最早的消息成为死信,有消息被丢弃,这对安全性较高的业务中是不行的,需要去解决消息堆积的问题。
前两种是消费者角度,第三种是队列的角度 ,提高队列的容积,可以缓解消息堆积问题
开启线程池也是有限制的,如果消息很多,需要开启很多很多线程,开启的线程很多对cpu是一种浪费,cpu需要在多个线程之间做上下文的切换,因此这种方案适合,这个消息处理的业务耗时比价长的情况,可以开多个线程,cpu可以并行处理多个业务
我们下面将一下第三种:扩大队列的容积
(2)惰性队列
我们知道MQ的队列是内存存储的,如果说在高并发的情况下,消息量非常大,达到数百万,这些消息都给他扔到内存中,显然是不合适的,我们要学习惰性队列去解决这个问题
对于传统的对类来讲,如果你没有开启消息的持久化,所有的消息都是在内存中的,其目的是加快消息投递的速度,优势就是响应速度快,也有一个问题就是在内存中存储有一个上限, mq会设置一个内存的预警值默认40%,如果在消息堆积的情况下,很容易达到消息的预警,此时mq就会处于一个暂停状态,会阻止生产者投递消息进来,会给这部分消息刷出到磁盘,清理一部分内存空间,这个动作叫做快照,所以呢会导致mq处于间歇性的暂停状态组织用户写入请求,所以mq的并发能力处于波浪形的忽高忽低的情况,性能不够稳定
惰性队列会把请求直接写入磁盘,很难触发mq的预警,性能会比较稳定,但是写磁盘性能不如内存,会带来一定的读写延迟 ,但是也再可以接收的范围内,消费者消费消息再从磁盘读,带来的还是性能损耗,带来延迟
把对列变成惰性队列,有两种
消费者:
发送者:
惰性对列直接到磁盘
普通队列先发到内存,达到预警,刷出到磁盘