RabbitMQ 之 Consumer Prefetch

概览

消息者预取是消费者预取机制的扩展。

AMQP 0-9-1 指定了 basic.qos 方法使得在一个 channel(一个连接)消费时能够限制未通知消息的数量。不幸的是,channel 并不是理想的范围 — 因为单个信道可以从多个队列中消费,频道和队列需要相互协调保证每条消息的发送都不会超过这个限制。在单个机器上这将会比较慢,而从一个集群上消费将会非常慢。

此外,对于许多情况来说,指定适用于每个消费者的预取计数更为自然。

因此,RabbitMQ 重新定义了 basic.qos 方法中的 global 标志的意义:

global Meaning of prefetch_count in AMQP 0-9-1 Meaning of prefetch_count in RabbitMQ
false channel 上的所有消费者共享 分别应用于 channel 上的每个新消费者
true connection 上的所有消费者共享 channel 上的所有消费者共享

在大部分 API 的 global 标志的默认值为 false。

单个消费者

下面的 Java 基本示例将一次最多接收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 说明并没有解释用不同的 global 标志调用多次 basic.qos 会发生什么。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 条消息。这将会比前面的例子都慢,因为频道以及队列都执行全局限制,而产生了额外协调开销造成的。

翻译自:
1.https://www.rabbitmq.com/consumer-prefetch.html

你可能感兴趣的:(程序人生)