Sobes.tech
Назад к вопросам
Middle+
3

Как обеспечить что Scheduled Job выполняется только на одном инстансе из 20 в кластере?

Компании, где спрашивали
ИннотехИннотех

Ответ от нейросети

sobes.tech AI

Чтобы Scheduled Job выполнялся только на одном инстансе из 20 в кластере, можно использовать распределённый механизм блокировки. Основные подходы:

  1. Использование базы данных с флагом блокировки:

    • При запуске задачи инстанс пытается установить флаг в базе (например, в таблице с одной записью).
    • Если флаг свободен, инстанс устанавливает его и выполняет задачу.
    • После выполнения снимает флаг.
    • Остальные инстансы видят, что задача уже выполняется, и пропускают запуск.
  2. Использование распределённого кэша с поддержкой блокировок (Redis, ZooKeeper, etcd):

    • Например, с Redis можно использовать Redlock — алгоритм распределённой блокировки.
    • Инстанс пытается захватить lock с TTL.
    • Если успешно, выполняет задачу.
    • По окончании снимает блокировку.
  3. Использование специализированных библиотек:

    • Spring Boot с @Scheduled и библиотеками, поддерживающими распределённые задачи, например, Quartz с кластеризацией.

Пример с Redis (псевдокод):

String lockKey = "scheduledJobLock";
boolean acquired = redisClient.setIfAbsent(lockKey, instanceId, ttlSeconds);
if (acquired) {
    try {
        // выполнить задачу
    } finally {
        redisClient.delete(lockKey);
    }
}

Таким образом, только один инстанс сможет захватить блокировку и выполнить задачу, остальные пропустят запуск.