Sobes.tech
Назад к вопросам
Senior
5

Если у нас несколько инстансов приложения, как обеспечить, чтобы одна и та же операция из шедулера не обрабатывалась несколькими инстансами одновременно?

Компании, где спрашивали
ТБанк

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

sobes.tech AI

Чтобы избежать одновременной обработки одной и той же операции несколькими инстансами приложения из шедулера, обычно применяют механизмы распределённого блокирования (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();
    }
}

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