Consumer Prefetch
2016-02-16 22:46
337 查看
Consumer Prefetch
A more natural and efficient way to limit unacknowledged messages.AMQP specifies the basic.qos method to allow you to limit the number of unacknowledged messages on a channel (or connection)
when consuming (aka "prefetch count"). Unfortunately the channel is not the ideal scope for this - since a single channel may consume from multiple queues, the channel and the queue(s) need to coordinate with each other for every message sent to ensure they
don't go over the limit. This is slow on a single machine, and very slow when consuming across a cluster.
Furthermore for many uses it is simply more natural to specify a prefetch count that applies to each consumer.
aff6
Therefore RabbitMQ redefines the meaning of the global flag in the basic.qos method:
global | Meaning of prefetch_count in AMQP 0-9-1 | Meaning of prefetch_count in RabbitMQ |
---|---|---|
false | shared across all consumers on the channel | applied separately to each new consumer on the channel |
true | shared across all consumers on the connection | shared across all consumers on the channel |
most APIs.
Example - single consumer
The following basic (Java) example will receive a maximum of 10 unacknowledged messages at once:Channel channel = ...; Consumer consumer = ...; channel.basicQos(10); // Per consumer limit channel.basicConsume("my-queue", false, consumer);
Example - multiple independent consumers
This example starts two consumers on the same channel, each of which will independently receive a maximum of 10 unacknowledged messages at once:Channel channel = ...; Consumer consumer1 = ...; Consumer consumer2 = ...; channel.basicQos(10); // Per consumer limit channel.basicConsume("my-queue1", false, consumer1); channel.basicConsume("my-queue2", false, consumer2);
Example - multiple consumers sharing the limit
The AMQP specification does not explain what happens if you invoke basic.qos multiple times with differentglobal values.RabbitMQ interprets this as meaning that the two prefetch limits should be enforced independently of each other; consumers will only receive new messages when neither limit on unacknowledged messages has been reached.
For example:
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);
These two consumers will only ever have 15 unacknowledged messages between them, with a maximum of 10 messages for each consumer. This will be slower than the above examples, due to the additional overhead of coordinating between the channel and the queues
to enforce the global limit.
rabbitmq由于一个channel可以有多个consumer ,所以他的prefetch count有两个作用域,一个是作用在这个channel上 ,即count的数额为这个channel上的consumer 的unack消息数的总和。另外一个是作用在这个channel上的每个消费者,count的数额为每个消费者unack的消息数。当两个都做了限制时,则会判断哪个先到达限制,这是就会起作用。
相关文章推荐
- Rabbitmq集群搭建笔记
- 利用Python学习RabbitMQ消息队列
- python使用rabbitmq实现网络爬虫示例
- Linux下PHP扩展amqp安装
- rabbitmq学习
- CentOS6.5 安装rabbitmq
- 非常不错的rabbitmq集群高可用部署
- Rabbitmq 安装与配置
- rabbitmq可靠性保证(原文加上部分标记)
- rabbitmq流控制(原文标记)
- win7安装RabbitMQ
- rabbitmq集群安装实践
- AMQP协议
- RabbitMQ 系列——1.初始
- rabbitMQ安装
- rabbitmq——用户管理
- rabbitmq 消息传送与监听
- rabbitmq 消息传送与监听
- [翻译] [RabbitMQ+Python入门经典] 兔子和兔子窝
- RabbitMQ的WEB管理器rabbitmq_management