发现问题
用celery设置定时任务,前端传入time,让任务每天定时定点执行,但是结果却出现重复的任务:
可以发现4月4号从18点开始,每隔1个小时celery就会received一个定时task,而且该task_id是同一个,一直到晚上22点整,所有定时任务(注意:是同一个定时任务)同时开始运行。
ps:系统居然没被拖垮,不幸中的万幸。
问题原因分析
celery在执行定时任务时与celery的任务失效重传机制时有冲突未解决,应该算是个系统bug吧。简单的说就是,定时任务没到指定的执行时间之前,celery不会收到任务,但是celery会默认每隔1小时(Visibility timeout)后重传该任务,等到了任务执行时间点,所有被重传的任务会一拥而上,同时执行,所以会看到几十个相同任务同时执行。
解决办法—在redis中加分布式锁,下面开始演示,注意:演示时用同一个字符串模拟代替实际存入redis中的同一个task_id
settings.py中,配置缓存队列为:redis://127.0.0.1:6379/7
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/7",
'TIMEOUT': 7 * 24 * 60 * 60,