Middle
34
Крон тапсырмасы бар 5 қызметтік инстанс бар. Тапсырма тек бір рет орындалуын қалай қамтамасыз етуге болады, 5 рет емес?
Сұралған компаниялар
AI-дан жауап
sobes.tech AI
Чтобы задача срабатывала только один раз среди 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 с брокером сообщений).
Таким образом, задача запускается только одним инстансом, остальные пропускают выполнение.