Roteador PG-wire em Rust. Quatro demos ao vivo, cada uma em três colunas — Proxy+PG · concorrente+PG · Proxy+Nano — contra o backend real.
Um motor, muitas formas — do embarcado ao gerenciado.
O cliente não muda nada. Quatro diferenciais, cada um vs o concorrente real.
Uma camada PG-wire, sem extensão no banco — as marcadas DEMO são as de hoje.
Seis capacidades combinam para distribuir um banco Postgres-compatível — transparente, na frente de qualquer backend PG-wire.
Distribuem dentro de um Postgres: coordenador + workers, SQL distribuído. Poderoso — mas você adota um motor específico e acopla a aplicação a ele.
Distribui no fio: sharding por schema/tenant, leitura ativo-ativo multi-região, failover com replay — sem extensão. E cada nó pode ser um Nano de 32 MB.
Camada diferente do planejador do Citus. Para rotear, replicar e distribuir bancos Postgres-compatíveis de forma transparente, é a camada mais completa — e, com o Nano, a mais barata de escalar.
Escreva → o backend perde os dados → POST /api/replay re-aplica a janela journalada.
journal → replay → statements_replayed=3. Linhas voltam.
sem journal → nada a re-aplicar → dados perdidos p/ sempre.
mesmo journal+replay no Nano. Funciona nos dois = upgrade drop-in.
1.7.0: tr_mode faz failover em sessão — conexão viva, re-home no novo primary, SET/GUC restaurados; leituras re-executadas (select) apenas quando toda função chamada é comprovadamente sem efeitos colaterais — built-in do PostgreSQL na allowlist ou nome declarado em tr_read_functions; leitura opaca devolve 08007 e nunca roda duas vezes; transação não confirmada re-aplicada (transaction, opt-in). COMMIT de resultado desconhecido nunca é repetido (08007) — sem double-apply, sem promessa de zero perda em voo.
| tr_mode | O que o proxy faz na perda do backend | Análogo |
|---|---|---|
| none | erro PostgreSQL real (57P01) e a conexão fecha | PgBouncer / PG puro |
| session (padrão) | conexão fica viva: re-home no novo primary + SET/GUC restaurados; a instrução interrompida recebe um erro (57P01 não entregue · 08007 resultado desconhecido); autocommit não entregue é re-executado | Oracle TAF · SESSION |
| select | + leituras interrompidas re-executadas de forma transparente — só quando toda função chamada é comprovadamente sem efeitos colaterais (built-in na allowlist ou nome em tr_read_functions); leitura opaca → 08007, nunca roda duas vezes | Oracle TAF · SELECT |
| transaction (opt-in) | + re-aplica a transação não confirmada no novo primary e continua; falha no replay → 40001 | Oracle Application Continuity |
Fronteira honesta: em todos os modos, um COMMIT de resultado desconhecido nunca é repetido (08007) — sem double-apply, sem promessa de zero perda em voo. O replay é verificado: as frames de resposta de cada instrução são digeridas como o cliente as viu e re-conferidas no backend substituto — divergência desfaz o replay e devolve 40001. Transações em SERIALIZABLE ou REPEATABLE READ nunca são re-aplicadas. Exceder o teto de estado de sessão rastreado (tr_max_session_set_statements, 256) recusa o failover com 08006. COPY em andamento → 08006. Backends com senha exigem o proxy como fronteira de auth ([auth] mode = "scram"). Verificado ao vivo: tr-failover-test.sh, 77 checks, 4 modos, PostgreSQL 18.4. A promoção do standby fica com o seu orquestrador HA — ou com a HA nativa do Nano.
POST /api/shadow: a mesma query em dois backends, com diff. Valida upgrade (PG→PG) e migração (PG→Nano).
valida o upgrade: is_clean=true; depois uma linha muda → DRIFT CAUGHT.
um pooler fala com um backend só. Nada para comparar.
valida a migração — a prova do Any2Helios — clean, depois drift capturado.
Flagrou até a serialização de NUMERIC diferente entre PG e Nano no fio. Captura tudo.
Detector no proxy: o SQL injection aparece em GET /anomalies, com os padrões que casaram.
sql_injection flagrado: classic_or_payload, union_select, information_schema_probe.
um pooler não lê o SQL. A injeção passa sem ser vista.
mesma guarda — a detecção é no proxy, agnóstica de backend.
Você descobre o ataque no /anomalies — não no relatório de incidente.
pgbench · 8 clientes · mesmo workload. Competitivo — enquanto faz journal, replay e anomalias.
~30k tps
~26k tps
~28k tps
Gravados back-to-back no mesmo host. O ponto: pooling de verdade sem abrir mão dos outros três recursos.
Escaneie: lembrete no calendário + link do Product Hunt. Apoie e compartilhe nas primeiras horas 🙏
Apache-2.0 · crates.io/crates/heliosdb-proxy · crates.io/crates/heliosdb-nano