Sobes.tech
Middle+

Hoe zorg je ervoor dat een geplande taak alleen op één van de 20 instanties in een cluster wordt uitgevoerd?

sobes.tech AI

Antwoord van 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);
    }
}

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