我有一个项目托管在数字海洋的一个基本液滴与2GB拉姆。在我的本地机器中,长时间运行的任务运行在8-10分钟之间,而且仍然是数字海洋水滴中的successful.However,通常情况下芹菜在长期运行的任务中不会成功。
目前芹菜- celery 5.2.6我有两种配置在主管
celery -A myproject worker -l infocelery -A myproject beat -l info这是来自celeryd.log的消息
CPendingDeprecationWarning:在芹菜5.1中,我们引入了一个可选的中断更改,在连接时,丢失取消了所有当前执行的任务,并且启用了延迟确认。当连接消失时,无法确认这些任务,并且任务将自动重新传递回队列。可以使用worker_cancel_long_running_tasks_on_connection_loss设置启用此行为。在芹菜5.1中,默认设置为False。在芹菜6.0中,默认情况下设置为True。
warnings.warn(CANCEL_TASKS_BY_DEFAULT, CPendingDeprecationWarning)
[2022-07-07 04:25:36,998: ERROR/MainProcess] consumer: Cannot connect to redis://localhost:6379//: Error 111 connecting to localhost:6379. Connection refused..
Trying again in 2.00 seconds... (1/100)
[2022-07-07 04:25:39,066: ERROR/MainProcess] consumer: Cannot connect to redis://localhost:6379//: Error 111 connecting to localhost:6379. Connection refused..
Trying again in 4.00 seconds... (2/100)对于一个临时的解决方案,我所做的是重新启动服务器,并重新运行新的任务,但这不能保证长期运行的任务会成功,问题是以前失败的任务不会重新启动。
我的目标是
这个是可能的吗?有什么办法吗?
发布于 2022-07-11 20:17:25
正如警告消息中所述,您可以使用worker_cancel_long_running_tasks_on_connection_loss控制此行为,以防止在连接丢失时取消任务。在您的芹菜版本,它是默认关闭,所以您的任务不应该被取消。但是,即使延迟确认任务在此场景中成功完成,任务仍然被重新传递到队列并将再次运行--不管这种设置如何发生,对于延迟确认的任务来说,这是不可避免的。
这就是为什么您必须将任务设计为幂等的原因。
如果您的工作不是幂等的,另一种解决方案是让您的任务提前关闭(默认情况下),但这可能会导致您在任务未实际完成的情况下放弃任务。
如果必须避免删除任务,则必须将acks_late=True设置为任务,并且必须将其设计为幂等函数。这是必要的,无论具体的连接丢失问题,因为许多其他事情可能发生中断您的任务,并产生同样的情况。
我需要它重新运行并继续,而不是开始一个新的任务。
这取决于你如何设计你的任务的幂等性。例如,您可能希望让作业跟踪其在持久存储中的进度,因此当任务失败并再次运行时,它可以确定如何进行最佳恢复。
https://stackoverflow.com/questions/72892842
复制相似问题