Ingress Canônico de Webhook & Forwarder Assíncrono RabbitMQ
1. Contexto Operacional
Provedores de WhatsApp (Evolution API, Zapster) suportam apenas uma única URL de callback por instância. Para eliminar a concorrência e o acoplamento síncrono no banco relacional rocketz.webhooks (~1,3 milhão de registros), o ecossistema centraliza a ingestão na URL canônica agnóstica:
O servidor atua como Ingress Gateway, persistindo eventos com durabilidade no RabbitMQ e repassando assincronamente para o sistema legado e para o processador de status interno.
2. Topologia AMQP e Retry Loop Escalonado
| Componente | Nomenclatura | Propósito |
|---|---|---|
Topic Exchange Principal |
|
Roteamento pub/sub durável de todos os eventos da plataforma. |
Topic Exchange Retry |
|
Roteamento de retries com backoff escalonado por TTL. |
Direct Exchange DLX |
|
Roteamento de mensagens descartadas definitivamente (DLQ). |
Fila Principal de Repasse |
|
Consumo pelo worker de repasse com prefetch 20. |
Filas de Retry com TTL |
|
Dead-letter loop onde a mensagem aguarda o TTL e retorna via DLX para a fila principal. |
DLQ Definitiva |
|
Armazenamento permanente de poison pills (4xx) ou retries esgotados. |
Fila de Eventos Interna |
|
Atualização assíncrona de |
3. Garantias de Engenharia SRE
-
Stream Bruto Inviolável: O payload original é transmitido em Base64 com hash SHA-256 de integridade, prevenindo corrupção em requisições
application/x-www-form-urlencodedou reordenação JSON. -
Autenticação Serviço-a-Serviço (S2S): O repasse ao Supabase legado é assinado via HMAC-SHA256 (
x-webhook-signature) comLEGACY_WEBHOOK_HMAC_SECRETsegregado e carimbo temporal anti-replay de 5 minutos. -
Allowlist Estrita de Headers: Repassa apenas
content-type,user-agent,traceparent,x-request-id,x-webhook-signatureex-webhook-timestamp. Headers de rede ou autenticações internas são sanitizados. -
Idempotência Compartilhada: Deduplicação no Redis com estados
processing→forwarded. -
Classificação Semântica e Circuit Breaker: Respostas 2xx recebem ACK; erros 4xx permanentes vão direto à DLQ; 5xx/Timeout entram no retry loop escalonado. 10 falhas consecutivas abrem o circuit breaker por 30 segundos.