Pular para o conteúdo

apps/messaging-streaming/normalizer

062 · Comunicação & Mensageria · ≈ 6 min de estudo

Normalizer

Converte mensagens de múltiplas fontes heterogêneas para um único formato canônico antes do processamento — diferente do Anti-Corruption Layer, que traduz um sistema externo específico, o Normalizer lida com N formatos de entrada convergindo em 1. Usa translators registrados por tipo de origem (Strategy/Factory por trás).

passos
6
arquivos
11
testes
2
tecnologias
5
Infraestrutura realTypeScriptBunElysiaRabbitMQDocker
Baixar cartão

Cenário

Três PSPs parceiros notificam ao banco as transferências PIX, cada um no seu formato: um em snake_case com valor em centavos, outro em camelCase com reais decimais e timestamp Unix, o terceiro com campos abreviados, valor 1.250,90 e horário de Brasília. O processamento downstream não pode conhecer nenhum desses formatos: recebe sempre a mesma transferência canônica.

Planta

Fluxo
7/7
PSP Alfasnake_case, centavos, UTCPSP BetacamelCase, reais, UnixPSP Gamaabreviado, 1.250,90,horário de BrasíliaWebhook ElysiaPOST /webhooks/:psppix.psp.nativerouting key = PSPNormalizerregistro de tradutorespix-transfer-canonicalpix-normalizer-dlqmodelo canônicoorigem sem tradutorou formato inválido
7

7 passos — reproduza para seguir o fluxo

Como funciona

6 passos

Formatos diversos viram um modelo canônico.

Esconde cada passo: lembre antes de tocar para revelar.

  1. 01

    Cada PSP chama POST /webhooks/:psp; o webhook só enfileira o payload nativo com a routing key do PSP — PSP desconhecido recebe 404

  2. 02

    O normalizer lê a origem da routing key e busca o tradutor no registro; origem sem tradutor lança erro

  3. 03

    Antes de traduzir, valida o payload contra o schema do formato daquele PSP — fora do formato, lança erro

  4. 04

    Cada tradutor converte para o modelo canônico: valor em centavos inteiros, instante em UTC, um vocabulário de status, sourcePsp gravado

  5. 05

    O canônico é publicado com confirmação antes do ack do nativo; o que não pôde ser traduzido vai para a DLQ

  6. 06

    PSP novo = um schema e um tradutor registrados; nenhum consumidor downstream muda

apps/messaging-streaming/normalizer

11 arquivos

src/

  • format_psp.tsSchemas dos formatos nativos de cada PSP
  • translator_pix.tsModelo canônico, registro de tradutores e pixTransferNormalize
  • sample_psp.tsA mesma transferência no formato de cada PSP
  • api_webhook.tsWebhook Elysia que enfileira a notificação nativa por PSP
  • worker_normalizer.tsConsome, traduz, publica o canônico ou manda à DLQ
  • topology_pix.tsExchanges nativa e canônica, filas e DLX
  • config_pix.tsVariáveis de ambiente validadas no boot
  • translator_pix.test.tstesteTradutores: mesma transferência dos três PSPs, centavos sem erro de ponto flutuante, fuso de Brasília na virada do dia, status e recusa
  • worker_normalizer.test.tstesteIntegração com RabbitMQ real: só canônico downstream, formato inválido na DLQ e PSP desconhecido
  • demo.tsdemoTrês PSPs, um payload quebrado e um PSP sem tradutor

./

  • docker.shinfraSobe o RabbitMQ 3 na porta 5672

Executar · com Docker

  1. ./docker.sh up# sobe RabbitMQ
  2. cp .env.example .env# variáveis de ambiente
  3. bun install# dependências
  4. bun run demo# roda o cenário
  5. bun run test# integração contra o serviço real
Requisitos
BunDocker
Sobe junto
RabbitMQ

Por que se relacionam

Teste rápido

Qual destes combina com Normalizer?

Próximo projeto · Comunicação & MensageriaRouting Slip
Esc

↑ ↓ navegarEnter abrir191 resultados