Python在rabbitmq中no_ack=False或auto_ack=False

本文深入探讨了RabbitMQ的确认机制,包括如何确保在消费者连接断开时消息不会丢失,以及在重新连接时如何重发未确认的消息。详细介绍了Basic.Ack的作用,以及在不同情况下(如no_ack=true)消息的处理方式。通过代码示例展示了如何在消费者端实现确认机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

python在rabbitmq中的确认机制可以保证rabbitmq消费者连接断了,消息不丢失,在连接重新建立的时候,在重发那些没有接收到的消息.
rabbitmq支持一种方式:应答。比如我从消息里拿一条消息,如果全处理完,你就不要帮我记着了。如果没处理完,突然断开了,再连接上的时候,消息队列就会重新发消息。

总结:

  • Basic.Ack 发回给 RabbitMQ 以告知,可以将相应 message 从 RabbitMQ 的消息缓存中移除。
  • Basic.Ack 未被 consumer 发回给 RabbitMQ 前出现了异常,RabbitMQ 发现与该 consumer
    对应的连接被断开,之后将该 message 以轮询方式发送给其他 consumer (假设存在多个 consumer 订阅同一个
    queue)。
  • 在 no_ack=true 的情况下,RabbitMQ 认为 message 一旦被 deliver出去了,就已被确认了,所以会立即将缓存中的 message 删除。所以在 consumer 异常时会导致消息丢失。
  • 来自 consumer 侧的 Basic.Ack 与 发送给 Producer 侧的 Basic.Ack 没有直接关系

注意:

1)只有在Consumer(消费者)断开连接时,RabbitMQ才会重新发送未经确认的消息。

2)超时的情况并未考虑:无论Consumer需要处理多长时间,RabbitMQ都不会重发消息。

关键代码

  1. 在接收端的callback最后:
    channel.basic_ack(delivery_tag=method.delivery_tag)
    2)除了callback函数,还要在之前设置接收消息时指定no_ack(默认False)或auto_ack=False:
    channel.basic_consume(callback, queue=‘ack_test’, auto_ack=False)
import pika
  # ########################### 消费者 ##########################
connection = pika.BlockingConnection(pika.ConnectionParameters(
        host='127.0.0.1'))
channel = connection.channel()

channel.queue_declare(queue='ack_test')

def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)
    print('success!')
    ch.basic_ack(delivery_tag = method.delivery_tag) # 关键代码一

channel.basic_consume(callback,
                      queue='ack_test',
                      no_ack=False) # 关键代码二

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

只需要修改消费者的代码即可.
最终效果是:消费者断掉连接,再次连接,消息还会收到。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值