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个,这带来了额外的开销。

你可能感兴趣的:(RabbitMQ学习)