Отладка Postgres «слишком много уведомлений в очереди NOTIFY»

Я использую таблицу Postgres, которая получает 2000-3000 обновлений в секунду. Я использую для обновления этой таблицы запросы, созданные с помощью помощника по обновлению библиотеки pg-promise.

Каждое обновление вызывает уведомление с помощью функции pg_notify(). Некоторые сценарии nodejs обрабатывают эти уведомления. По какой-то причине в журналах Postgres продолжают появляться сообщения «слишком много уведомлений в очереди NOTIFY», а также указание о размере очереди уведомлений, который продолжает увеличиваться до 100%. Я прочитал несколько постов типа: https://postgrespro.com/list/thread-id/1557124 или https://github.com/hasura/graphql-engine/issues/6263 но я не могу найти способ отладить эту проблему. Как правильно поступить в этой ситуации?

PostgreSQL документирует это — см. Примечания.

vitaly-t 12.12.2020 11:48

Да, я читал это, но мне не очень понятно, что означает «еще не обработано всеми сеансами прослушивания -». Я использую событие «уведомление» реализации pg-node, насколько я понимаю, каждый раз, когда это событие запускается, уведомление обрабатывается.

Arian Mareș 12.12.2020 11:54

Ваша проблема связана не с библиотекой или даже средой NodeJS, а строго с сервером, поэтому вам нужно подходить к этому соответственно — либо путем изменения стратегии уведомлений, либо стратегии обновления/объема, либо даже отслеживать размер очереди с помощью функция в документации.

vitaly-t 12.12.2020 13:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
1 189
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваш слушатель, кажется, не потребляет уведомления достаточно быстро, или, возможно, не потребляет вообще. Таким образом, первым шагом будет что-то вроде регистрации обработки каждого уведомления из кода вашего приложения, чтобы выяснить, что на самом деле происходит.

что вы имеете в виду под потреблением? Я использую событие уведомления библиотеки pg-node, поэтому каждый раз, когда запускается уведомление, оно запускает обратный вызов, в котором я что-то делаю.

Arian Mareș 12.12.2020 18:48

pg_notify вызывается в триггере таблицы при обновлении. Вы предлагаете мне где-то регистрировать каждый вызов pg_notify и сравнивать этот журнал с журналом, созданным обратными вызовами событий уведомлений. ХОРОШО. Будет ли это делать? А что делать, если некоторые уведомления пропали?

Arian Mareș 12.12.2020 18:52

«поэтому каждый раз, когда срабатывает уведомление, он вызывает обратный вызов, когда я что-то делаю». Да, это то, что вы хотите. Работает? Откуда вы знаете?

jjanes 12.12.2020 19:48

Большинство из них рабочие. Я не мог знать наверняка, потому что все это выглядит так, как и ожидалось. Единственная досада — это неконтролируемый рост размера очереди. Вы говорите, что некоторые события уведомлений не срабатывают? Что может быть причиной? Я проверю это, регистрируя как уведомления, так и инициированные события уведомлений.

Arian Mareș 12.12.2020 19:55

Это может быть связано с тем, что существует длительная транзакция, которая блокирует выпуск старых сообщений из буфера. Этот процесс описан в руководствах и чем-то похож на очистку — старые транзакции должны быть завершены, чтобы очистить старые данные.

Суть в том, что любой длительный запрос может задержать очистку; для меня это был процесс, который запускал Listen — он был разработан, чтобы просто продолжать работать вечно. В журнале сервера PG есть внутренний PID, который может быть виновником, поэтому вы можете найти его в pg_stat_activity и продолжить оттуда.

Другие вопросы по теме