Celery发送至RabbitMQ vv队列的任务消息丢失问题咨询
可能原因及排查方案
实际发送任务数少于预期
你提到的3047次如果是按任务触发次数估算的数值,大概率是发送环节提前终止导致。你提供的代码中循环调用send_task时没有做异常捕获,一旦执行过程中出现broker连接中断、网络抖动等问题,整个document_monitoring任务会直接报错退出,剩余未发送的任务就不会执行,导致实际发往队列的消息数低于估算值。
建议在send_task逻辑处增加调用日志记录,统计实际执行的调用次数,和队列消息数做比对:如果日志统计的调用次数和队列消息数一致,即可确认是发送环节提前终止导致的数量差。Celery默认无消息发送确认导致丢消息
Celery默认没有开启生产者发布确认机制,消息发送后不会等待RabbitMQ的落盘确认,网络波动、Broker瞬时压力过大都可能导致消息在传输过程中丢失,Celery侧不会感知到这类丢失。
可在celeryconfig中添加以下配置开启确认和发送重试,避免这类静默丢包:
# 开启任务发送失败重试 task_publish_retry = True # 最大重试次数可自行调整 task_publish_retry_policy = {'max_retries': 3} # 开启RabbitMQ生产者确认,发送后等待Broker返回确认信号 broker_transport_options = {'confirm_publish': True}
RabbitMQ队列配置导致消息被丢弃
检查vv队列的配置,是否设置了队列长度限制、消息过期时间或死信规则:
执行命令rabbitmqctl list_queues name arguments messages_ready查看队列参数:- 如果存在
x-max-length参数,说明队列设置了最大长度,超过长度的消息会被自动丢弃或转入死信队列 - 如果存在
x-message-ttl参数,消息过期后会被自动清理 - 如果绑定了死信交换机,不符合路由规则、过期、被拒绝的消息都会转入死信队列,不会出现在
vv队列的统计中
- 如果存在
排除rabbitmqadmin展示bug
可通过多个命令交叉验证消息数,确认是否为展示问题:
- 执行
rabbitmqctl list_queues name messages_ready messages_unacknowledged查看队列就绪消息数 - 登录RabbitMQ管理后台,直接查看
vv队列的消息统计
多个渠道统计结果一致即可排除展示bug的可能。
内容的提问来源于stack exchange,提问作者César R.
相关产品推荐
相关产品推荐

