Sobes.tech
Middle+

¿Cómo garantizar que un trabajo programado se ejecute solo en una instancia de 20 en un clúster?

sobes.tech AI

Respuesta de la IA

Чтобы 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);
    }
}

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