3

到目前为止,我的 RabbitMQ 消费者客户端使用的预取值为 1。我希望增加该值以提高性能。如果我将值设置为 2,RabbitMQ 服务器是否会一次向每个消费者发送 2 条消息,以便我需要解析这两条消息并将第二条消息存储在 List 中,直到第一个消息被处理和确认?还是 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?

      ...
}
4

2 回答 2

6

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

关于哪条消息到达哪里,RMQ 将使用循环传递,也就是说,如果你有 queue: 1 2 3 4 5 6and consumer1and consumer2

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

如果与您的任何消费者的连接断开,则预取的消息将使用相同的传递方法重新传递给活动的消费者。

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

于 2013-04-08T18:49:03.143 回答
0

api 在阻塞队列中内部排队消息。

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

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

channel.basicAck(lastDeliveryTag, true);

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

于 2017-06-12T11:29:59.047 回答