Middle+
Comment garantir qu'un travail planifié ne s'exécute que sur une seule instance sur 20 dans un cluster?
sobes.tech IA
Réponse de l'IA
Чтобы Scheduled Job выполнялся только на одном инстансе из 20 в кластере, можно использовать распределённый механизм блокировки. Основные подходы:
-
Использование базы данных с флагом блокировки:
- При запуске задачи инстанс пытается установить флаг в базе (например, в таблице с одной записью).
- Если флаг свободен, инстанс устанавливает его и выполняет задачу.
- После выполнения снимает флаг.
- Остальные инстансы видят, что задача уже выполняется, и пропускают запуск.
-
Использование распределённого кэша с поддержкой блокировок (Redis, ZooKeeper, etcd):
- Например, с Redis можно использовать Redlock — алгоритм распределённой блокировки.
- Инстанс пытается захватить lock с TTL.
- Если успешно, выполняет задачу.
- По окончании снимает блокировку.
-
Использование специализированных библиотек:
- Spring Boot с
@Scheduledи библиотеками, поддерживающими распределённые задачи, например, Quartz с кластеризацией.
- Spring Boot с
Пример с Redis (псевдокод):
String lockKey = "scheduledJobLock";
boolean acquired = redisClient.setIfAbsent(lockKey, instanceId, ttlSeconds);
if (acquired) {
try {
// выполнить задачу
} finally {
redisClient.delete(lockKey);
}
}
Таким образом, только один инстанс сможет захватить блокировку и выполнить задачу, остальные пропустят запуск.