Pular para o conteúdo

apps/messaging-streaming/splitter

058 · Comunicação & Mensageria · ≈ 5 min de estudo

Splitter

Decompõe uma mensagem composta em várias mensagens individuais, cada uma processada de forma independente. É o padrão inverso do Aggregator: aqui uma mensagem vira muitas; no Aggregator, muitas viram uma.

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

Cenário

Um arquivo de remessa (estilo CNAB) chega com um lote de pagamentos PIX, TED e boleto. Liquidar o lote como unidade faria um pagamento inválido derrubar os outros 499. O splitter recebe o lote, publica uma mensagem por pagamento e responde na hora; cada pagamento liquida — ou falha — sozinho, carregando batchId, sequence e total para a reagregação posterior (padrão Aggregator).

Planta

Fluxo
5/5
Arquivo de remessabatchId + N pagamentosSplitterúnico que vê o loteremittance-itemWorker de liquidaçãoum item por vezremittance.dlxremittance-item-dlqPOST /remittances1 mensagempersistentepor pagamentocorrelationId= batchId,sequence/totalnack sem requeue
5

5 passos — reproduza para seguir o fluxo

Como funciona

6 passos

Quebra um lote em mensagens unitárias.

Esconde cada passo: lembre antes de tocar para revelar.

  1. 01

    POST /remittances recebe { batchId, payments[] } validado: lote vazio ou valor fora de centavos inteiros é 422

  2. 02

    O split é um generatorCada item sai com batchId, sequence (a partir de 1), total e paymentId próprio, sem montar o lote inteiro em memória

  3. 03

    Cada item é publicado persistente e confirmado um a um, com correlationId = batchId — se o splitter cair no meio, o já publicado fica

  4. 04

    O splitter responde 202 com a contagem de itens, sem esperar liquidação

  5. 05

    O worker de liquidação vê só o próprio item; ack depois de liquidar

  6. 06

    Item que não liquida (conta encerrada) vai para a DLQ sozinho; os irmãos seguem

apps/messaging-streaming/splitter

9 arquivos

src/

  • split_remittance.tsSplit em generator com batchId, sequence, total e paymentId
  • topology_remittance.tsExchange, fila de itens com DLX e publicação persistente confirmada
  • api_remittance.tsSplitter em Elysia: valida o lote, publica item a item, responde 202
  • worker_settlement.tsLiquidação de um item por vez; recusa vai para a DLQ
  • config_remittance.tsVariáveis de ambiente validadas no boot
  • split_remittance.test.tstesteSplit: numeração, tamanho do lote, ids distintos e streaming
  • worker_settlement.test.tstesteIntegração com RabbitMQ real: uma mensagem persistente por pagamento, falha isolada na DLQ e lote inválido
  • demo.tsdemoRemessa de cinco pagamentos com uma conta encerrada

./

  • 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 é o próximo passo depois de Splitter?

Próximo projeto · Comunicação & MensageriaAggregator
Esc

↑ ↓ navegarEnter abrir191 resultados