Sobes.tech
Senior

Ako imamo više instanci aplikacije, kako osigurati da ista operacija iz šefa ne bude obrađivana od strane više instanci istovremeno?

sobes.tech АИ

Одговор од АИ

Чтобы избежать одновременной обработки одной и той же операции несколькими инстансами приложения из шедулера, обычно применяют механизмы распределённого блокирования (distributed locking).

Основные подходы:

  • Использование базы данных: создать таблицу блокировок, где операция помечается как "заблокирована" одним из инстансов. Перед выполнением операции инстанс пытается установить блокировку (например, через уникальный ключ или флаг). Если блокировка уже есть — операция не выполняется.

  • Использование Redis с поддержкой блокировок (например, Redlock): инстанс пытается получить lock с TTL, если успешно — выполняет задачу.

  • Использование специализированных систем для распределённого блокирования, например ZooKeeper или Consul.

Пример с Redis (Java, с использованием Redisson):

RLock lock = redisson.getLock("myScheduledTaskLock");
if(lock.tryLock(0, 10, TimeUnit.SECONDS)) {
    try {
        // выполнить задачу
    } finally {
        lock.unlock();
    }
}

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