RabbitMQ预取

时间:2013-04-08 18:11:24

标签: rabbitmq messaging amqp

到目前为止,我的RabbitMQ消费者客户端使用的预取值为1.我希望增加该值以获得性能。如果我将值设置为2,那么RabbitMQ服务器是否会一次向每个消费者发送2条消息,这样我就需要解析这两条消息并将第二条消息存储在一个列表中,直到第一条消息被处理和确认为止?或者API会在幕后处理这个吗?

我正在使用Java AMQP客户端库:

ConnectionFactory factory = new ConnectionFactory();
...
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

channel.basicQos(2);

QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(CONSUME_QUEUE_NAME, false, consumer);

while (!Thread.currentThread().isInterrupted()) {
   try {
      QueueingConsumer.Delivery delivery = consumer.nextDelivery();
      String m = new String(delivery.getBody(), "UTF-8");

      // Will m contain two messages? Will I have to each message and keep track of them within a List?

      ...
}

2 个答案:

答案 0 :(得分:6)

api在幕后处理这个问题,所以不用担心。

关于哪个消息到达哪里,RMQ将通过使用循环来传递,即如果您有队列:1 2 3 4 5 6consumer1以及consumer2

consumer1 will have 1 3 5
consumer2 will have 2 4 6

如果连接死于您的任何消费者,预取的消息将使用相同的传递方法重新传递给活跃的消费者。

这应该是有趣的阅读,并且是一个很好的起点,可以更准确地了解会发生什么:

答案 1 :(得分:0)

api内部阻塞阻塞队列中的消息。

设置预取计数大于1实际上是个好主意,因为您的工作人员无需等待每条消息到达。它最多可以读取N条消息(其中N是预取计数)。它可以在完成上一个消息后立即开始处理消息。

此外,您可以选择一次确认多条消息,而不是单独确认。

channel.basicAck(lastDeliveryTag, true);

布尔值true表示确认所有消息,包括提供的lastDeliveryTag