Middle
54
Xidmətin 5 nümunəsi və cron tapşırığı var. Tapşırığın yalnız bir dəfə yerinə yetirilməsini necə təmin etmək olar, 5 dəfə yox?
Şirkətlər soruşuldu
AI-dan cavab
sobes.tech Süni İntellekt
Чтобы задача срабатывала только один раз среди 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 с брокером сообщений).
Таким образом, задача запускается только одним инстансом, остальные пропускают выполнение.