Назад к вопросам
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
}
Таким образом можно гарантировать, что только один воркер выполняет определённый код одновременно, используя базу как распределённый лок.