怎么调整broker来达到不增加集群或者修改业务代码的方式来提高系统的速度?
prefetch count参数有什么用?
This is done by setting a “prefetch count” value using the basic.qos method. The value defines the max number of unacknowledged deliveries that are permitted on a channel.Once the number reaches the configured count, RabbitMQ will stop delivering more messages on the channel unless at least one of the outstanding ones is acknowledged. (A value of 0 is treated as infinite, allowing any number of unacknowledged messages.)
看下官网的介绍:这个值用来定义channel上的最大的unack的消息数量。一旦数量达到配置的值,mq将停止传递更多的消息,直到至少一个消息被ack掉。rabbitmq提供了了global参数,true表示设置在channel上,false表示设置在每个consumer上(这也是实现和协议不同的地方)。
另外由于传递消息和手动确认消息是完全异步的过程,因此当你修改prefetch的值时,可能channel已经存在的消息数量已经超过该值。即使在手动模式下,qos的配置也并不会影响pull api
消费者确认模式、prefetch和吞吐量
确认模式和qos的prefetch的值对消费者的吞吐量有着重要的影响。通常来说,提升prefetch可以有效改善消息投递到消费者的速率。自动ack模式可以达到最佳的投递效率。但是,在这两种情况下,已投递但未处理的消息数量也会增加,从而导致消费者使用的内存增加。
应该谨慎的使用自动确认模式或者具有无限制预取的手动确认模式。消费者获取大量消息而没有及时确认会导致消费者内存消耗的增长。找到合适的预取值需要不断的实验并且因为工作负载而异,100~300范围内的值,通常提供最佳吞吐量,并且不会使消费者有太大风险。但较高的预取值仍然会碰上收益递减定律。
rabbitmq官方提供了一些实验数据
可以看到达到30之后,网络带宽的限制将会成为主要矛盾,再提高该值没有更大的好处了。此外控制台上显示的消费者利用率是一个很好的判断消费者效率的指标。