Sobes.tech
Senior

¿Cómo sincronizar los trabajadores a través de PostgreSQL (bloqueo distribuido en la base de datos)?

sobes.tech AI

Respuesta de la IA

Для синхронизации воркеров через 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
}

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