Назад к вопросам
Иннотех
Middle+
3
Как обеспечить что Scheduled Job выполняется только на одном инстансе из 20 в кластере?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Чтобы 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);
}
}
Таким образом, только один инстанс сможет захватить блокировку и выполнить задачу, остальные пропустят запуск.