Sobes.tech
Senior

Jei turime kelias programėlės instancijas, kaip užtikrinti, kad ta pati operacija iš planuotojo nebūtų apdorojama kelių instancijų vienu metu?

sobes.tech AI

Atsakymas iš 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();
    }
}

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