Sobes.tech
Middle+

Come garantire che un lavoro pianificato venga eseguito solo su una delle 20 istanze in un cluster?

sobes.tech AI

Risposta dell'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);
    }
}

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