【celery踩坑】Too many heartbeats missed

本文讲述了per_three_task周期任务在Celery和RabbitMQ环境中遇到的问题,即Toomanyheartbeatsmissed异常。分析原因是过多旧任务堆积导致worker长时间无响应,解决方法是优化worker执行逻辑并使用装饰器限制单次执行时间。
摘要由CSDN通过智能技术生成

一、问题

下面的问题,都来自同一个周期任务:每隔3分钟,统一命名为 per_three_task

  1. 有一天,周期任务一直在跑,早上还是正常,但是到了下面,per_three_task就没有动静了,其他周期任务正常执行,抛异常。
  2. 客户现场,因为某些原因导致celery worker不执行,rabbitmq中堆积了大量per_three_task未消费的消息,重新部署之后,per_three_task疯狂执行,然后里面抛异常。

异常信息:Too many heartbeats missed
在这里插入图片描述

二、原因分析

查了各种资料,发现celery确实存在这个问题,但是没有能从配置上解决该问题
最终结合实际分析,猜测这个问题的原因可能是:

  1. 有很多旧的定时任务堆积在rabbitmq的消息队列中,celery worker在处理这些任务的时候没有发送足够的心跳
  2. 经过本地环境模拟复现,轮询worker如果一次性处理的数据量比较多,执行时间会比较长,长时间没有消费消息队列中的消息,消息队列通过心跳判断该woker已经挂了,不再调用该woker。

后来查看celery的issue:https://github.com/celery/celery/issues/5157,大家的猜测差不多

原因很可能是worker执行时间太长导致的

三、解决措施

  1. 优化worker执行逻辑,让worker的执行时间缩短
  2. 给worker函数per_three_task加上一个装饰器,当woker执行时,判断上次执行是否结束,如果未结束,直接return,及时消费消息队列中的消息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值