谈谈如何提升rabbitmq的消费速度
在MQ实际使用场景中,往往是生产速度大于消费速度,加上消费者可能存在比较复杂的业务逻辑,会造成消息堆积,除了,在rabbitmq的使用中,我认为可以分为两种方式来增加消费速度。
第一:增加消费者服务的数量
以 @RabbitmqListener 注解举例,当你没指定 containerFactory 时,默认使用的是 SimpleRabbitListenerContainerFactory 创建一个消息监听容器 ,从源码中可以找到:
privatevolatileint concurrentConsumers =1;
当容器启动时,设置了n个消费者来监听消息,这个n就等于1
protectedintinitializeConsumers(){int count =0;synchronized(this.consumersMonitor){if(this.consumers ==null){this.cancellationLock.reset();this.consumers =newHashSet(this.concurrentConsumers);for(int i =0; i <this.concurrentConsumers;++i){BlockingQueueConsumer consumer =this.createBlockingQueueConsumer();this.consumers.add(consumer);++count;}}return count;}}
同时还可以设置 prefetchCount 参数,这个参数可以配置每个消费者一次性能投递的消息数量,如果每次都投递一个消息,这样无疑增加了网络IO的时间。
注意:假设你配置了prefetchCount 参数为100,消费者数量大于1,在部分场景下,消息总数小于100时,总是投递到第一个消费者队列,后面的消费者就成了摆设,所以你还可以配置不定消费者,格式为:1-10,意为最小1个消费者队列,当不够使用时会自动创建
第二:在消费者中使用多线程
第一种方式中,创建了多个消费者监听mq,消费者增加的情况下,mq服务的压力也会增大,所以还可以直接在消费者中 使用多线程批量消费。
这种情况下,必须要配置prefetchCount 大于1,否则每次都是批处理1条消息
总结
在实际使用过程中一般可以使用这两种情况结合,比如可以配置2个消费者队列,每个队列使用多线程消费,已增加消费速率。
版权归原作者 野猪佩奇ii 所有, 如有侵权,请联系我们删除。