Слогер Создать блог
Разработка

Postgres lock timeout уронил сайт: причины и решение

Сайт отдавал HTTP 500 на каждый запрос. Виной всему — зависшая блокировка в Postgres и одна строчка с await, связавшая воркер и веб-сервер. Разбираем, что пошло не так и как защититься.

В один не самый прекрасный день сайт начал отдавать голый HTTP 500 на каждый запрос. Не медленная страница, не один сломанный роут — всё приложение лежало. Контейнер в панели хостинга значился «онлайн», но ни одна страница не рендерилась.

Что показали логи

Ошибка повторялась каждые несколько минут:

error: canceling statement due to lock timeout
code: '55P03'
where: while inserting index tuple in relation "queue"

Код 55P03 — это lock_not_available: запрос отказался ждать блокировку. Срабатывало внутри pgboss.create_queue, то есть при старте фонового воркера. А в базе до этого было залогировано, что Postgres «не был корректно завершён» — видимо, предыдущая сессия оставила лок на таблице pgboss.queue. Воркер при старте попытался создать очередь, не дождался лока, упёрся в таймаут и бросил исключение.

Почему одна блокировка уронила весь сайт

Воркер запускался внутри веб-процесса через instrumentation hook в Next.js. В коде register() стоял await startWorker(). Воркер упал — и исключение ушло прямо из хука. Next.js считает упавший instrumentation hook фатальной ошибкой и не поднимает сервер. Так проблема фоновой задачи превратилась в полный отказ фронтенда.

У воркера и веб-сервера не было никаких причин делить зону отказа. Один await связал их намертво.

Решение: два шага

Сначала — восстановление. Нужно перезапустить Postgres, чтобы снять зависший лок, и только потом передеплоить приложение, чтобы оно стартовало на здоровой базе. Перезапуск одного приложения не поможет: лок висит в базе, пока не перезапустится сам Postgres.

ДействиеСнимает лок?
Перезапуск приложенияНет
Перезапуск PostgresДа
Перезапуск Postgres + деплой приложенияДа

Второй шаг — сделать так, чтобы веб-сервер поднимался даже если воркер не смог стартовать. Вместо await startWorker() — запуск «в фоне» с обработкой ошибки: startWorker().catch(...). Тогда падение воркера лишь пишет ошибку в лог, а сайт продолжает работать.

Дальше — сделать сам воркер устойчивым. Первая версия кода выставляла флаг started = true до вызова boss.start(). Если старт падал, все повторные попытки натыкались на проверку if (started) return — и воркер оставался мёртвым навсегда. Флаг нужно ставить только после успешного старта.

Выводы

  • Запуск фонового воркера не должен делить зону отказа с веб-сервером. Если воркер живёт внутри веб-процесса — ловите его ошибки и дайте сайту подняться.
  • Помечайте «запущено» только после реального запуска. Оптимистичный флаг превращает сбой в вечный отказ от повторных попыток.
  • Ошибка Postgres 55P03 в библиотеке очередей почти всегда значит «остался лок после грязного завершения». Перезапуск базы снимает его, перезапуск приложения — обычно нет.

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

По материалам: dev. Текст переработан редакцией Слогера.

← На главную

Рекламное место — Конец поста
Реклама · Слогер

Комментарии (1)

Войдите, чтобы комментировать.

Диярбек Диярбек 09.09.2026 01:51 ▲ 0
Уникальный сервер часто блокипуют Но мощный супер 👍🏻👍🏻👍🏻👍🏻👍🏻👍🏻👉🏻👉🏻👉🏻👉🏻👉🏻
Карьера

Как подготовиться к собеседованию по кодингу: 7 книг и порядок, в котором их читать

Провал на интервью редко связан с тем, что вы не умеете программировать. Чаще не хватает системы, словаря для разговора о дизайне и практики объяснять решение вслух — и всё это можно закрыть книгами.

Слогер 27.09.2026 ▲ 0
Карьера

Как откликаться на вакансии без диплома: разбор фильтра, который отсеивает за две минуты

Junior-вакансия с Python, SQL и автоматизацией, три документа от кандидата — и отказ через 120 секунд после отправки. Разбираем, что здесь происходит и как проходить такие воронки, если диплома нет.

Слогер 27.09.2026 ▲ 0
Fluxs lenta
Реклама · fluxs.ru
Карьера

Почему резюме не работает: как доказать навыки живыми проектами

Разбор подхода proof-of-work: зачем показывать работающий продукт и видео-демо вместо строчки «разрабатывал сервис», как это обходит автоматические фильтры и что подготовить, чтобы запрос на интервью не ушёл в пустоту.

Слогер 26.09.2026 ▲ 0
Fluxs lenta
Реклама · fluxs.ru
Стартапы

Конструктор бизнес-модели: схема из рабочих модулей, которую можно перенести на Fluxs

Это не просто схема. Каждый блок в нашем конструкторе бизнес-модели настоящий работающий модуль Fluxs: воронка, лиды, письма, мессенджер, 1С, поставка. Поэтому нарисованное можно перенести на платформу: по выбранным блокам подключаем и настраиваем те же модули, вы делаете это сами или с нами. Подходит и новому делу, где нужно понять, что вообще понадобится, и действующему бизнесу: увидите, каких сценариев не хватает, достроите их и переложите работу на Fluxs по частям, без остановки.

Слогер 25.09.2026 ▲ 0
Карьера

Как выбраться из выгорания разработчику: 6 книг с рабочими инструментами

Выгорание — это не просто усталость, а пропавший интерес, спад продуктивности и вера в то, что ты разучился писать код. Разбираем шесть книг, которые дают конкретные приёмы, а не мотивацию.

Слогер 25.09.2026 ▲ 0
Fluxs lenta
Реклама · fluxs.ru
AI

Что такое RAG и как он работает: разбор восьми шагов для тех, кто не пишет код

RAG звучит как что-то из докладов для разработчиков, но объясняется за пять минут. Разбираем весь путь от вопроса к ответу — с архивом, секретарём и петлями, которые обычно не рисуют на схемах.

Слогер 25.09.2026 ▲ 0
Разработка

Как ловить гонки данных в тестовом задании: разбор задачи про последний товар на складе

Один зелёный тест ничего не доказывает, если весь код крутится в одном процессе. Разбираю, как устроить проверку на двух воркерах и что именно писать в рубрику оценки.

Слогер 25.09.2026 ▲ 0