Django + Celery 长期定时任务

Django + Celery with long-term scheduled tasks

我正在开发一个严重依赖 Celery 任务调度的 Django 应用程序,使用 Redis 作为后端。任务可以设置为 运行 很长一段时间,也可以设置为少数 seconds/minutes。

我看过Redis的可见性超时和timedelta大于可见性超时的调度任务的后果(我也在之前的项目中处理过),所以我很感兴趣,如果有什么比我的解决方案更整洁,即在 "main" 任务需要执行前 5 分钟有另一个 "helper" 任务 运行,将 "main" 任务安排到 运行在需要的时间内,将任务 ID 存储在 DB 中,然后如果存储的任务 ID 是 运行,则检查 "main" 任务。最后一部分(任务 ID 存储)是必需的,因为多个 运行 的 "helper" 任务可能会产生很多 "main" 任务实例,但是使用这种方法每个任务都会有不同的任务 ID。

我真的很讨厌这种方法的听起来和它的工作原理,就好像任务被安排在从当前时间开始 运行 一个月后,"helper" 和 "main" 任务被执行最多一百次。

我也知道这是一个悬而未决的问题,因此与解决方案本身相比,我更感兴趣的是一种巧妙的解决方法。

测试可用选项后,我认为仅使用 RabbitMQ 作为代理即可解决整个问题。

虽然这对我来说是一个可行的选择,但缺少一些 redis 配置参数(例如池大小)使得它无法用于那些使用对打开的代理连接有一定限制的托管服务的人。