Как запустить задачу celery только один раз среди нескольких реплик?
У меня есть несколько экземпляров fargate на AWS, и на них локально запущен celery с Elasticache для redis. Из-за политики автоматического масштабирования экземпляры продолжают появляться и исчезать, проблема в том, что задачи celery, которые я запустил, выполняются столько раз, сколько существует копий моего сервера. Может ли кто-нибудь предложить способ предотвратить такое поведение?
Задачи celery beat берут кучу строк в базе данных и выполняют над ними определенные операции, я пытался добавить флаг "processed" на строки, чтобы указать, что они были обработаны, но поскольку все реплики запускают задачу в одно и то же время, это решение не работает.
В настоящее время планировщик для celery beat установлен на DatabaseScheduler.
Вот конфигурация, которая у меня есть сейчас.
CELERY_BROKER_URL = os.environ.get('CELERY_BROKER_URL', 'redis://127.0.0.1:6379/0')
CELERY_RESULT_BACKEND = os.environ.get('CELERY_RESULT_BACKEND', 'redis://127.0.0.1:6379/0')
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'US/Central'
CELERY_BEAT_SCHEDULE = {
'withdraw_money_daily': {
'task': 'app_name.tasks.perform_the_task',
'schedule': crontab(minute=0, hour=0),
}
}
REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [(REDIS_HOST, 6379)],
},
},
}
Команда, запускающая сельдерей
celery -A app worker -l info -E
celery -A app beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler