RabbitMQ 支持多个消费者同时消费同一个队列中的消息。工作原理是:
- 生产者发布消息到队列中。
- 多个消费者同时将队列绑定到自己的通道channel上。
- RabbitMQ 会将队列中的消息按照round-robin 算法依次平衡分发给多个消费者。
- 每个消费者消费自己收到的消息。
- 消费者确认消息后,RabbitMQ 会继续将下一条消息分发给下一个消费者。
这样就实现了同一队列消息被多个消费者消费的效果。
示例代码:
消费者1:
Channel channel = ...;
channel.basicConsume(queue, true, "consumer1");
while (true) {
QueueingConsumer.Delivery delivery = consumer1.nextDelivery();
String message = new String(delivery.getBody());
// 处理消息
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
消费者2:
Channel channel = ...;
channel.basicConsume(queue, true, "consumer2");
while (true) {
QueueingConsumer.Delivery delivery = consumer2.nextDelivery();
String message = new String(delivery.getBody());
// 处理消息
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
- 生产者发布消息到 queue 中。
- 消费者1 和消费者2 同时将 queue 绑定到自己的通道上。
- RabbitMQ 将第一条消息分发给消费者1,第二条消息分发给消费者2,以此类推。
- 消费者1和消费者2 消费自己收到的消息。
- 消费者确认消息后,RabbitMQ 分发下一条消息。
所以总结来说,RabbitMQ 通过在多个消费者绑定同一队列,并使用 round-robin 算法将消息分发给不同消费者,实现同一队列被多个消费者消费的效果。