请教!rabbitMQ怎么确认同一个队列所有消费者收到消息?

本文讨论了在RabbitMQ中确保所有消费者收到同一消息的策略。与ActiveMQ不同,RabbitMQ使用交换器和队列的概念。通过exchange的binding和消息的ACK机制,可以实现消息的分布式处理。讨论中提到了direct和topic模式,以及fanout模式在特定场景下的应用。同时指出,同一个队列中的消息只能被其中一个消费者消费,若需所有消费者接收到消息,应考虑多队列和exchange的绑定策略。
摘要由CSDN通过智能技术生成

求大神指导~ 
查看了很多能查到的文档都没有找到明确说明的,rabbit的发布订阅和ActiveMq 的发布订阅有所区别,我之前一直用 ActiveMq 的   后来公司要求改为rabbitMQ,请问同一个队列如果有多个消费者,那么如何确保所有消费者都恩那个收到同一条消息?而不是 消费者1消费掉   如图:



我写的消费者代码如下:

public void receiveMessage(String topicName)

    {

        try {

            Consumer consumer = new DefaultConsumer(channel)

            {

                public void handleDelivery(String consumerTag, Envelope envelope,

                                           AMQP.BasicProperties properties, byte[] body) throws IOException {

 

                    //delivery.getEnvelope().getDeliveryTag()消息的标识,false只确认当前一个消息收到,true确认所有consumer获得的消息

                    channel.basicAck(envelope.getDeliveryTag(), true);

                    HashMap<Integer, LinkedList<Long>> message = (HashMap<Integer, LinkedList<Long>>) toObject(body);

                    f

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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消息已经被成功处理了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值