RabbitMQ消息堆积方案处理

在消息队列中,消息堆积是生产环境中的需要考虑的问题,一旦消息产生积压,来不及消费,可能会导致MQ服务器宕机,而解决消息积压有这样一些方案解决:

1.增加消费者数量

可以根据业务情况适当添加多台服务器部署消费者服务实例,消费者数量增加,可以有效提高消息的消费速度,但这需要考虑服务器成本

2.单个消费者中增加线程池来异步处理消息

单个消费者服务实例中,可以整合线程池,将消息的消费任务提交给线程池中的多个线程进行处理。但也存在需要考虑的问题,当任务处理耗时比较长,任务比较多的情况下,线程会处于频繁切换的状态,这对于CPU来说,是一种资源浪费,而且任务数量多,可能会导致线程池中的线程都处于使用状态,任务阻塞队列达到瓶颈,这时候会触发拒绝策略,对于不重要的消息的消息可以进行丢弃,重要的消息可以交给主线程处理,这时候又回到原始状态。因此单个消费者增加线程池使用于任务耗时比较短,线程池可以很好处理消息任务的情况。

3.采用RabbitMQ提供的惰性队列

在RabbitMQ中,提供了一种惰性队列,所谓的惰性队列是将消息从内存快刷到磁盘,在牺牲性能的情况下保证MQ不会因为消息堆积而导致内存爆满。并且性能稳定,支持百万消息的磁盘快刷。定义惰性队列也很简单,只需要添加lazy熟悉即可。

    @Bean
    public Queue lazyQueue() {
        return QueueBuilder
                .durable("lazy.queue")
                .lazy()
                .build();
    }

你可能感兴趣的:(java,rabbitmq)