Pular para o conteúdo principal

PgQue

Tipo: Repositório Open Source Autor(es): Nikolay Samokhvalov (PostgresAI) Publicado: 2026 (v0.2.0 em 2026-05-25) Acessado: 2026-07-04

Relevância

PgQue é uma fila de eventos "zero-bloat" para PostgreSQL, implementada inteiramente em SQL e PL/pgSQL — sem extensão C — que reimplementa o algoritmo do PgQ (Skytools, criado na Skype) usando batching por snapshot e rotação via TRUNCATE em vez de DELETE/UPDATE por linha. Expõe uma API SQL completa: produção (send, send_batch), consumo com cursor próprio por consumidor (subscribe, receive, ack, nack), dead-letter queue (dlq_inspect, dlq_replay, dlq_purge) e observabilidade (get_queue_info, get_consumer_info). Requer PostgreSQL 14+ e, para o "tick" automático de rotação, pg_cron (ou um agendador externo chamando pgque.ticker() em loop, mais as funções de manutenção — incluindo pgque.maint_rotate_tables_step2(), que não está embutida em pgque.maint(); pgque.ticker_loop() é de uso interno do pg_cron, ver ADR-022).

Além da API normal de consumo (um cursor lógico único por nome de consumidor — réplicas concorrentes do mesmo nome duplicam o lote, não dividem), o PgQue 0.2 também expõe uma API de consumidores cooperativos (subscribe_subconsumer/register_subconsumer, receive_coop, next_batch de 4 argumentos), que permite múltiplas réplicas ("subconsumers") sob o mesmo grupo lógico dividirem lotes de eventos entre si de verdade, com takeover automático do lote de uma réplica travada via dead_interval. O próprio autor marca essa API como "Experimental in PgQue 0.2" — ver ADR-026.

Mecanismo adotado na ADR-022 (aceita em 2026-07-07) para substituir o RabbitMQ (ADR-008, histórico) no papel de log de eventos multi-consumidor (fan-out) do stack — eliminando a dependência de um cliente AMQP em Perl, cujo módulo principal (Net::AMQP::RabbitMQ) não compila em Windows. Por ser SQL puro, PgQue é acessado inteiramente via Mojo::Pg (ADR-016), sem nenhuma dependência XS nova no cpanfile.

É um projeto em estágio inicial (v0.2.0, "early-stage" segundo o próprio README) — o motor conceitual (PgQ) tem mais de uma década de uso em produção na Skype, mas o empacotamento PgQue em si é recente. O estudo completo de prós, contras e armadilhas está em docs/adrs/references/ADR-022-estudo-filas-postgresql.md.

Referenciada em

  • ADR-022 — decisão de substituir o RabbitMQ pelo PgQue como mecanismo de filas em PostgreSQL (aceita em 2026-07-07)
  • ADR-018 — a Stega usa o PgQue como fila de eventos multi-consumidor (NotificationWorker)
  • ADR-025 — o próprio tick do PgQue já depende de "pg_cron ou um agendador externo" (nota acima); a ADR-025 aplica o mesmo raciocínio ao agendamento de jobs do Minion, com um processo dedicado equivalente ao script/pgque_ticker
  • ADR-026 — usa a API de consumidores cooperativos (nota acima) para dividir trabalho de verdade entre múltiplas réplicas do Stega::Worker::SlaBreachWorker