Hacker News Digest

24 июля 2026 г. в 19:05 • dbos.dev • ⭐ 312 • 💬 59

OriginalHN

#buffering#dbos#github#listen-notify#postgresql#scalability

Postgres LISTEN/NOTIFY actually scales

Postgres LISTEN/NOTIFY позволяет реализовать низко‑задержку стриминг в базе, но изначально его масштабируемость ограничивала глобальная эксклюзивная блокировка, которая захватывается при вызове NOTIFY во время коммита транзакции. Эта блокировка гарантирует порядок уведомлений, однако приводит к сильной конкуренции и низкой пропускной способности: в первой версии стримы писали лишь около 2,9 K записей в секунду, при этом ресурсы БД почти не нагружались.

Оптимизация заключается в буферизации уведомлений и их групповой отправке, что снимает блокировку с отдельных записей и позволяет использовать групповой коммит. При этом добавлен fallback‑опрос, чтобы уведомления не терялись при сбое процесса. В результате при нагрузке с несколькими читателями достигается до 60 K записей в секунду с задержкой 15‑100 мс, а процессор загружается, показывая насыщение БД. Такой подход позволил избежать «LISTEN/NOTIFY не масштабируется», потому что блокировка берётся только при очистке буфера, а не при каждой записи, что дает возможность использовать оптимизации Postgres вроде группового коммита. В итоге получилось в 20 раза больше записей, а задержка оставалась в пределах десятков миллисекунд, а процессор загружался, показывая насыщение БД. Исходный код доступен на GitHub, а подробнее — в статье автора.