rabbit mq中的坑,消费端错误造成的死循环

在预发布环境中,由于RabbitMQ消费端未正确处理异常,导致消息无法正常消费而形成死循环,最终磁盘空间被错误日志填满。本文详细记录了问题排查过程及解决方案。

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

周五上线pre,发现mq消费端的调用的一个服务不停的报错,很快就把磁盘空间打满了,一开始以为是job死循环,当时确实也发现循环处有问题,修正循环处后,重新发布到pre环境发现还是有同样的问题,此时感觉很痛苦。通过仔细查看错误日志发现错误处是由rabbitmq 消费端报出来了,一时没有明白是什么原因,随找rabbitmq管理员,管理员说有消息一直没有消费掉,rabbitmq会一直重复投送消息,这样导致的链路的死循环。

总结:关于rabbit mq 没有死信队列,接受消息时,即消费端,如果抛出异常,则消息消耗不掉,rabbitmq会一直不停的投送消息,这样从整个链路上形成了死循环。业务错误暂且不论,这样仅仅错误日志就会把磁盘耗光,这点千万注意。

### RabbitMQ 消费者消息确认机制详解 在 RabbitMQ 中,消费者可以通过消息确认机制 (Message Acknowledgment) 来确保消息已被成功处理并从队列中安全移除。以下是关于消费者如何实现消息确认的具体说明: #### 1. **noAck 参数的作用** 当消费者注册时,可以选择设置 `noAck` 参数来决定是否启用手动确认模式。如果将 `noAck` 设置为 `false`,则 RabbitMQ 不会自动删除已交付给消费者的消[^1]。这意味着消费者需要显式地向 RabbitMQ 发送 ACK(Acknowledgment)信号以表明该消息已经被成功处理。 #### 2. **ACK 的工作原理** 一旦消费者接收到一条消息,在完成业务逻辑处理之后,必须通过调用 `basic_ack` 方法通知 RabbitMQ 已经完成了对该条消息的操作。只有在此之后,RabbitMQ 才会认为此消息已经成功被消费,并将其从内部存储中清除[^1]。 下面是一个简单的 Python 实现示例,展示如何使用 Pika 库来进行消息确认: ```python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() def callback(ch, method, properties, body): print(f"Received {body}") # Simulate message processing here... try: process_message(body.decode()) # Send an explicit acknowledgment after successful processing. ch.basic_ack(delivery_tag=method.delivery_tag) except Exception as e: print(f"Failed to process message: {e}") # Set up the consumer with no_ack=False channel.basic_consume(queue='task_queue', on_message_callback=callback, auto_ack=False) print('Waiting for messages...') channel.start_consuming() ``` 在这个例子中,我们设置了 `auto_ack=False` 并且在回调函数里加入了错误捕获功能。这样即使发生异常也能防止丢失未处理完毕的消息[^1]。 #### 3. **NACK 和重新排队** 除了基本的 ACK 外,还有 NACK (Negative Acknowledgement)。当遇到无法处理的情况时,可以发送 NACK 给服务器表示拒绝接受当前消息。同时还可以选择是否把这条失败的消息放回到原来的队列供其他消费者尝试再次消费或者稍后再试。 #### 4. **批量确认** 对于性能敏感的应用场景下,也可以考虑采用批量化的方式来做消息确认。即累积一定数量或时间间隔内的多个消息一起提交确认请求而不是每条单独做一次网络交互[^1]。 --- ### 总结 综上所述,RabbitMQ 提供了一套灵活而强大的消费者消息确认机制,允许开发者根据实际需求调整其行为特性从而达到最佳效果。无论是单条还是批量形式下的肯定/否定反馈都能很好地满足不同类型的业务诉求。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值