RabbitMQ学习(十九):消费者的未确定消息数限制(Consumer Prefetch)
说明
在之前的博文《RabbitMQ学习(十七):消息确认之消费者确认模式 II》中,我对有关消费者确认模式进行了翻译学习,其中提到了对通道Prefetch Count设置及该值对吞吐量的影响。本篇博文将继续翻译学习如何设置通道的Prefetch Count,及方法参数不同值的不同含义。
正文
概述
在AMQP 0-9-1协议中定义了basic.qos方法,通过该方法可以设置消费者在消费时通道(或连接)上的未确定消息的数量。不过,将通道作为限制范围不太理想,因为一个通道可能会连接消费多个队列,通道和队列需要彼此协调来保证消息对的数量不会超过限制,这样集群消费会比单机更慢。
此外,在大多数的使用场景中,针对每个消费者设置Prefetch count更加合适。
因此,RabbitMQ重新定义了basic.qos方法的global参数的含义:
| global | AMQP 0-9-1 中prefetch_count的含义 | RabbitMQ中prefetch count的含义 |
|---|---|---|
| false | 作用于通道的所有消费者 | 分别作用于通道的每个消费者 |
| true | 作用于连接上的所有消费者 | 作用于通道的所有消费者 |
注意,在大多数的API中,global的默认值为false。
单个消费者
以下的示例是使用java设置消费者的prefetch count,在该例中消费者一次最多可以收到10个未确认消息:
Channel channel = ...;
Consumer consumer = ...;
channel.basicQos(10); // Per consumer limit
channel.basicConsume("my-queue", false, consumer);
多个消费者独立限制
以下示例在同一个通道上开启了两个消费者,每个消费者一次最多可以收到10个未确认消息:
Channel channel = ...;
Consumer consumer1 = ...;
Consumer consumer2 = ...;
channel.basicQos(10); // Per consumer limit
channel.basicConsume("my-queue1", false, consumer1);
channel.basicConsume("my-queue2", false, consumer2);
多个消费者共享限制
AMQP 0-9-1协议没有明确解释如果多次调用basic.qos方法并设置不同global值将会发生什么。RabbitMQ对此的解释是将设置的限制独立作用于消费者。消费者只有在未确定消息数量低于限定值时,才会接收到消息。
例如:
Channel channel = ...;
Consumer consumer1 = ...;
Consumer consumer2 = ...;
channel.basicQos(10, false); // Per consumer limit
channel.basicQos(15, true); // Per channel limit
channel.basicConsume("my-queue1", false, consumer1);
channel.basicConsume("my-queue2", false, consumer2);
这两个消费者总共最多会接收15个未确定消息,每个消费者最多接收10个未确定消息。这个例子会比之前的例子运行速度更慢,因为队列和通道间需要协调确保未确定的消息总数不会超过15个,这带来了额外的开销。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
