RabbitMQ 之 Consumer Prefetch

本文介绍了消息者预取,它是消费者预取机制的扩展。指定方法可限制 channel 消费时未通知消息数量,但存在协调问题。RabbitMQ 重新定义相关标志意义,还给出单个消费者、独立消费者、多消费者共享限额的示例及特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概览

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

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

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

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

globalMeaning of prefetch_count in AMQP 0-9-1Meaning of prefetch_count in RabbitMQ
falsechannel 上的所有消费者共享分别应用于 channel 上的每个新消费者
trueconnection 上的所有消费者共享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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值