到目前为止,我的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?
...
}
答案 0 :(得分:6)
api在幕后处理这个问题,所以不用担心。
关于哪个消息到达哪里,RMQ将通过使用循环来传递,即如果您有队列:1 2 3 4 5 6
和consumer1
以及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