rabbitmq 多个消费者消费同一个队列的同一条消息
时间: 2023-07-03 10:20:19 浏览: 344
rabbitmq 实现消息插队
在 RabbitMQ 中,同一个消息只能被一个消费者消费。如果多个消费者同时消费同一个队列中的消息,每个消息只会被其中一个消费者消费。
如果需要多个消费者同时处理同一个消息,可以使用 RabbitMQ 的“发布/订阅”模式。在这种模式下,每个消费者都订阅一个自己的队列,并且这些队列都绑定到同一个交换机上。当一个生产者发送一条消息时,这条消息会被交换机广播到所有绑定的队列中,每个消费者都会收到一份拷贝。
以下是使用 Python Pika 库实现多个消费者同时处理同一个消息的示例代码:
```python
import pika
import time
# 连接 RabbitMQ 服务器
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
# 创建一个名为 'my_exchange' 的交换机
channel.exchange_declare(exchange='my_exchange', exchange_type='fanout')
# 创建一个名为 'my_queue' 的队列
channel.queue_declare(queue='my_queue')
# 将 'my_queue' 队列绑定到 'my_exchange' 交换机
channel.queue_bind(queue='my_queue', exchange='my_exchange')
# 定义回调函数用于处理收到的消息
def callback(ch, method, properties, body):
print("Received %r" % body)
time.sleep(1) # 模拟处理消息的耗时
print("Done")
ch.basic_ack(delivery_tag=method.delivery_tag)
# 设置每个消费者只处理一个消息
channel.basic_qos(prefetch_count=1)
# 启动多个消费者同时消费 'my_queue' 队列中的消息
for i in range(3):
# 创建一个名为 'consumer_queue_{i}' 的队列
queue_name = 'consumer_queue_%d' % i
channel.queue_declare(queue=queue_name)
# 将 'consumer_queue_{i}' 队列绑定到 'my_exchange' 交换机
channel.queue_bind(queue=queue_name, exchange='my_exchange')
# 每个消费者只消费自己的队列中的消息
channel.basic_consume(queue=queue_name, on_message_callback=callback)
print('Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
```
在上面的示例代码中,我们创建了三个消费者,每个消费者都订阅一个自己的队列,并将这些队列绑定到同一个交换机 `my_exchange` 上。当一个生产者发送一条消息时,这条消息会被交换机广播到所有绑定的队列中,每个消费者都会收到一份拷贝。在每个消息被处理完成后,调用 `ch.basic_ack(delivery_tag=method.delivery_tag)` 告诉 RabbitMQ 该消息已经被成功处理了。
阅读全文