PgQ — это надстройка над PostgreSQL, предназначенная для работы с очередями событий. В то время как классическая Outbox-таблица представляет собой простой способ реализации паттерна Outbox, PgQ предлагает оптимизированный, отказоустойчивый и высокопроизводительный механизм.
В стандартной Outbox-таблице каждое событие — это обычная запись в таблице, которая:
- Нарастает со временем - её размер постоянно увеличивается.
- Требует активного удаления обработанных событий (
DELETEилиVACUUM). - Индексы со временем раздуваются (
bloat), что приводит к деградации производительности.
- PgQ не требует DELETE - обработанные события просто перестают быть видимыми для консюмера, а фоновый процесс автоматически архивирует их в логически организованные партиции.
- PgQ использует эффективную систему слайсинга (партиционирование данных), что позволяет избежать перегрузки индексами.
Внутренне PgQ работает на базе слоёв событий, что избегает проблем с bloating’ом в отличие от обычной таблицы.
Обычно обработчики работают так:
SELECT * FROM outbox WHERE processed_at IS NULL ORDER BY created_at LIMIT 100; UPDATE outbox SET processed_at = now() WHERE id IN (...);
Но!
- Конкурентные консюмеры блокируют друг друга (
UPDATEблокирует строки). LIMIT 100может приводить к неоптимальному использованию индекса.- Нет распределения нагрузки между обработчиками.
- Консюмеры не блокируют друг друга - они получают уникальный batch ID при вызове
pgq.next_batch(). - Нет необходимости в
UPDATE- обработанные события автоматически скрываются от последующих запросов.
Если нужно масштабировать обработку, приходится:
- Добавлять физическое шардирование таблицы.
- Делать разделение по разным обработчикам вручную.
- Ручное управление конкурентным доступом.
- Поддержка подочередей (subqueues) - можно разделять события по группам.
- Горизонтальное масштабирование - можно запускать много обработчиков без конфликтов.
- Можно шардинговать PgQ по разным БД.
PgQ лучше подходит для больших нагрузок и высокопроизводительных систем.
PgQ автоматически решает проблемы индексов, очистки и конкуренции консюмеров.
