几天后,我的芹菜服务将无限期地重复一项任务。这在一定程度上很难重现,但根据处理的任务量,每周定期或更频繁地发生一次。
我将感谢任何关于如何获得更多关于这个问题的数据的提示,因为我不知道如何追踪它。当它发生时,重新启动芹菜将暂时解决它。
我有一个运行着4个worker(3.1.23版本)的celenie节点。Broker和result后端都在Redis上。我只发布到一个队列,我不使用芹菜节拍。
Django的setting.py中的配置是:
BROKER_URL = 'redis://localhost:6380'
CELERY_RESULT_BACKEND = 'redis://localhost:6380'
日志的相关部分:
[2016-05-28 10:37:21,957: INFO/MainProcess] Received task: painel.tasks.indicar_cliente[defc87bc-5dd5-4857-9e45-d2a43aeb2647]
[2016-05-28 11:37:58,005: INFO/MainProcess] Received task: painel.tasks.indicar_cliente[defc87bc-5dd5-4857-9e45-d2a43aeb2647]
[2016-05-28 13:37:59,147: INFO/MainProcess] Received task: painel.tasks.indicar_cliente[defc87bc-5dd5-4857-9e45-d2a43aeb2647]
...
[2016-05-30 09:27:47,136: INFO/MainProcess] Task painel.tasks.indicar_cliente[defc87bc-5dd5-4857-9e45-d2a43aeb2647] succeeded in 53.33468166703824s: None
[2016-05-30 09:43:08,317: INFO/MainProcess] Task painel.tasks.indicar_cliente[defc87bc-5dd5-4857-9e45-d2a43aeb2647] succeeded in 466.0324719119817s: None
[2016-05-30 09:57:25,550: INFO/MainProcess] Task painel.tasks.indicar_cliente[defc87bc-5dd5-4857-9e45-d2a43aeb2647] succeeded in 642.7634702899959s: None
任务通过用户请求发送,带有:
tasks.indicar_cliente.delay(indicacao_db.id)
以下是该任务的源代码和芹菜服务配置。
为什么在服务运行一段时间后,任务会被多次接收?我如何才能获得一致的行为?
它可能有点过时,但我也遇到了同样的问题,并用Redis解决了它。长话短说,Celery等待任务执行一段时间,如果时间已过,它会重新启动任务。它被称为可见性超时。文档中的解释:
如果任务在可见性超时内未得到确认,则该任务将重新交付给另一个工作人员并执行。这导致ETA/倒计时/重试任务的问题,执行时间超过可见性超时;事实上,如果真的发生了在循环中一次又一次地执行。所以你必须增加可见性超时,以匹配最长ETA的时间计划使用。注意,Celery将在worker上重新传递消息关闭,因此长时间的可见性超时只会延迟停电时重新交付"丢失"的任务,或强行解雇工人。
选项示例:https://docs.celeryproject.org/en/stable/userguide/configuration.html#broker-运输选项
详细信息:https://docs.celeryq.dev/en/stable/getting-started/backends-and-brokers/redis.html#id1
使用rabbitmq-broker而不是redis解决。
我遇到了这样的问题。提高Celery可见性超时不起作用。
事实证明,我还运行了一个Prometheus导出程序,该导出程序实例化了自己的Celery对象,该对象使用了默认的可见性超时,因此取消了我在应用程序中设置的较高超时。
如果您有多个Celery客户端——无论它们是用于提交任务、处理任务还是仅用于观察任务——请确保它们都具有完全相同的配置。