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

Как синхронизировать воркеры через PostgreSQL (distributed lock в БД)?

Компании, где спрашивали
Не указано

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

sobes.tech AI

Для синхронизации воркеров через PostgreSQL можно использовать механизм распределённых блокировок на уровне базы данных. Один из распространённых способов — использовать функцию pg_advisory_lock и pg_advisory_unlock, которые предоставляют приложение возможность захватывать и освобождать пользовательские блокировки.

Принцип работы:

  • Воркеры пытаются захватить advisory lock с определённым ключом (например, числом).
  • Только один воркер сможет получить блокировку, остальные будут ждать или получать ошибку.
  • После выполнения критической секции воркер освобождает блокировку.

Пример на Go с использованием database/sql:

func acquireLock(db *sql.DB, lockID int64) (bool, error) {
    var success bool
    err := db.QueryRow("SELECT pg_try_advisory_lock($1)", lockID).Scan(&success)
    return success, err
}

func releaseLock(db *sql.DB, lockID int64) error {
    _, err := db.Exec("SELECT pg_advisory_unlock($1)", lockID)
    return err
}

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