куча инстансов одного сервиса и они иногда могут запустить бекграунд воркеры для обработки одних и тех же ресурсов.
Нужно получить блокировку на ресурс через другой сервис. Сейчас пробую PG
Т.е. кто успел тот и работает, остальные пробуют получить ресурс но получают false
PG для этого подходит? что-то локально не могу все это повторить...
можно попробовать конструкцию select for update skip locked, если я правильно понял задачу
Что будете делать, если инстанс возьмёт блокировку, а потом умрёт? Если у вас стоит пуллер (pgbouncer к примеру), то блокировка будет держаться скорее всего после того, как умрёт инстанс, так как соединение вернётся в пул и сессия будет дальше жить, но на стороне pg_bouncer-а. Возможно получится что-то такое сделать, если использовать pg_try_advisory_xact_lock, так как в этом случае транзакция должна откатываться. Правда, если будут сетевые сбои (соединение между инстансом и pgbouncer-ом нет из-за умершего маршрутизатора) посередине, то могут быть тоже нюансы, так как tcp не разорвётся сразу. Можно правда рассмотреть keepalive соединенния, не знаю, можно ли их настроить на стороне драйвер/pg, чтобы решить данную проблему.... Но вообще я бы помотрел в сторону zookeeper, etcd.
Обсуждают сегодня