Middle
52
Il y a 5 instances du service avec une tâche planifiée. Comment faire pour que la tâche ne s'exécute qu'une seule fois, et pas 5 fois?
Entreprises à qui on a demandé
Réponse de l'IA
sobes.tech IA
Чтобы задача срабатывала только один раз среди 5 инстансов, нужно реализовать механизм распределённой блокировки или лидерства. Один из распространённых подходов — использовать внешнее хранилище с поддержкой атомарных операций, например Redis или базу данных.
Пример с Redis и Python:
import redis
import time
redis_client = redis.Redis()
lock_key = "cron_task_lock"
lock_timeout = 60 # время жизни блокировки в секундах
# Попытка установить блокировку
if redis_client.set(lock_key, "locked", nx=True, ex=lock_timeout):
try:
# Выполнение задачи
print("Задача выполняется одним инстансом")
# ... код задачи ...
finally:
redis_client.delete(lock_key)
else:
print("Другой инстанс уже выполняет задачу")
Здесь set с параметром nx=True устанавливает ключ только если его нет, что гарантирует, что только один инстанс получит блокировку. ex задаёт время жизни ключа, чтобы избежать вечной блокировки при сбое.
Альтернативы:
- Использовать распределённые системы координации, например ZooKeeper или etcd.
- Использовать специализированные библиотеки для распределённых задач (например, Celery с брокером сообщений).
Таким образом, задача запускается только одним инстансом, остальные пропускают выполнение.