【问题标题】:Celery beat scheduled tasks stop being triggered after a whileCelery beat 计划任务在一段时间后停止触发
【发布时间】:2022-12-18 17:39:49
【问题描述】:

语境:我在 python 2 中使用 Celery 4.4.0。 我的系统每秒都在做同样的工作。 我使用 Gcloud Kubernetes 部署我的 celery。我有 1 个 Redis pod 作为代理和 2 个 celery 应用程序的副本 pod。 celery pods 是相同的:它们使用相同的代码库和相同的代理。每个 pod 都是一个 beat & worker。

问题:运行几天后,尽管节拍仍然每秒排队任务,但任务不再被触发。 如果我重置 pod,它们将在接下来的几天内正常工作,然后再次陷入同样的​​困境。

我的代码:

celery worker \
  --app scheduler \
  --without-mingle \
  --without-gossip \
  --loglevel=DEBUG \
  --queues my_queue \
  --concurrency=1 \
  --max-tasks-per-child=1 \
  --beat \
  --pool=solo
app = Celery(fixups=[])
app.conf.update(
    CELERYD_HIJACK_ROOT_LOGGER=False,
    CELERYD_REDIRECT_STDOUTS=False,
    CELERY_TASK_RESULT_EXPIRES=1200,
    BROKER_URL='redis://redis.default.svc.cluster.local:6379/0',
    BROKER_TRANSPORT='redis',
    CELERY_RESULT_BACKEND='redis://redis.default.svc.cluster.local:6379/0',
    CELERY_TASK_SERIALIZER='json',
    CELERY_ACCEPT_CONTENT=['json'],
    CELERYBEAT_SCHEDULE={
        'my_task': {
            'task': 'tasks.my_task',
            'schedule': 1.0, # every 1 sec
            'options': {'queue': 'my_queue'},
        }
    }
)


@task(
    name='tasks.my_task',
    soft_time_limit=config.ENRCelery.max_soft_time_limit,
    time_limit=config.ENRCelery.max_time_limit,
    bind=True)
def my_task(self):
    print "TRIGGERED"

任务卡住时的日志:

# every second

beat: Waking up now. | beat:633
Scheduler: Sending due task my_task (tasks.my_task) | beat:271
tasks.my_task sent. id->97d7837d-3d8f-4c1f-b30e-d2cac0013531

我认为每个 pod 都有一个 beat 和一个 worker 不是问题,因为我不在乎任务是否被重复触发。那对我来说无所谓。

你有什么线索吗? 任何帮助将不胜感激。先感谢您。

【问题讨论】:

    标签: python cron celery schedule worker


    【解决方案1】:

    我们使用基于 Celery 的第 3 方应用程序,并将 Azure Redis 作为代理。过了一会儿,应用程序根本就没有安排新任务,当您每 1 分钟只看到节拍记录一次并且没有其他任何事情发生时,它就会进入这种空闲状态。 重启 worker 是我们迄今为止发现的唯一解决方法——但它远非理想……

    【讨论】: