django-celery-beat 是否可处理web服务器启动的多Django进程实例?
问题解答
部署多Django工作进程是否会自动创建多个调度器?
不会。Celery Beat是完全独立于Django Web服务进程的独立进程,默认不会随Gunicorn/uWSGI等启动的Django Web工作进程自动启动。只要你没有在每个Django Web实例的服务器上手动启动Beat服务,就不会出现多调度器进程的问题。
是否需要自行实现同步逻辑?
分两种场景判断:
- 单Beat进程部署(绝大多数中小规模生产场景足够):
你只需要单独启动1个Beat进程,指定使用django-celery-beat提供的DatabaseScheduler作为调度器即可。该调度器会将所有周期任务的配置存储在Django公用数据库中,属于官方文档提到的中心化调度方案,天然不需要额外做任务配置同步,也不会出现任务重复调度的问题。
建议给这个单Beat进程配置supervisor、systemd等进程监控工具,实现进程异常退出后自动重启即可满足可用性要求。 - 多Beat高可用部署:
如果你的业务要求Beat服务不能有单点故障,可以启动多个Beat进程,此时不需要自己从零实现同步逻辑,只需要开启django-celery-beat自带的分布式锁能力,锁后端可以选用项目已有的Redis、MySQL等公共存储,即可保证同一时间只有一个Beat进程在执行调度,不会出现重复任务。
补充说明:官方文档提到的多调度器会导致任务重复,特指多个未做锁控制的Beat进程同时读取同一份调度配置、同时下发任务的场景,只要做好Beat进程的数量控制或者锁控制,就可以规避该问题。
内容的提问来源于stack exchange,提问作者m0hithreddy
相关产品推荐
相关产品推荐

