首页 文章

在芹菜中重复任务

提问于
浏览
2

几天后,我的芹菜服务将无限期地一遍又一遍地重复一项任务 . 这有点难以复制,但是每周定期发生一次或更频繁地发生,具体取决于正在处理的任务量 .

我将非常感谢有关如何获取有关此问题的更多数据的任何提示,因为我不知道如何跟踪它 . 当它发生时,重新启动芹菜会暂时解决它 .

我有一个芹菜节点运行4个 Worker (版本3.1.23) . 经纪人和结果后端在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)

这是source code of the taskcelery service configuration .

为什么在服务运行一段时间后多次接收任务?我怎样才能获得一致的行为?

2 回答

  • 0

    通过使用rabbitmq经纪人而不是redis来解决 .

  • 1

    它可能有点过时,但我遇到了同样的问题并用Redis修复了它 . 长话短说,Celery等待一段时间执行任务,如果时间已过,则重新启动任务 . 它被称为可见性超时 . 来自文档的解释:

    如果在“可见性超时”中未确认任务,则任务将重新传送给另一个工作人员并执行 . 这会导致ETA /倒计时/重试任务出现问题,执行时间超过可见性超时;事实上,如果发生这种情况,它将再次执行,并再次循环执行 . 因此,您必须增加可见性超时以匹配您计划使用的最长ETA的时间 . 请注意,Celery将在工作人员关闭时重新发送消息,因此具有较长的可见性超时将仅在发生电源故障或强制终止工作时延迟“丢失”任务的重新传递 .

    选项示例:http://docs.celeryproject.org/en/latest/userguide/configuration.html#broker-transport-options

    详细信息:http://docs.celeryproject.org/en/latest/getting-started/brokers/redis.html#visibility-timeout

相关问题