Pular para o conteúdo

apps/messaging-streaming/resequencer

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

Resequencer

Reordena ativamente mensagens que chegaram fora de ordem antes de repassá-las adiante, usando um buffer temporário que segura o que chegou adiantado até a lacuna anterior ser preenchida. Diferente do sequential-convoy (que evita a desordem roteando tudo de uma chave para o mesmo consumer), aqui a desordem já aconteceu — vinda de múltiplos serviços upstream em paralelo — e o padrão a corrige depois da chegada.

passos
6
arquivos
7
teste
1
tecnologias
6
Infraestrutura realTypeScriptBunElysiaRedisRabbitMQDocker
Baixar cartão

Cenário

Uma transferência PIX passa por initiated, processing e settled, cada status publicado por um serviço diferente rodando em paralelo — os eventos chegam embaralhados. O cliente nunca pode ver settled antes de processing: o Resequencer segura o evento adiantado até o anterior chegar e entrega a sequência em ordem estrita para a projeção que alimenta a tela do cliente.

Planta

Sequência
11/11
TRF-9001 seq 31seq 32Lua: 3 > esperado 1, ZADD no buffer3TRF-9001 seq 14seq 15Lua: libera 1, avança para 2, buffer não tem 26seq 1 (confirmado antes do ack)7TRF-9001 seq 28Lua: libera 2 e drena 3 do buffer9seq 2, seq 310projeção só avança com sequência maior11Serviços upstreampix-status-shuffledResequencerRedispix-status-orderedProjeção + API
11

11 passos — reproduza para seguir o fluxo

Como funciona

6 passos

Reordena mensagens fora de sequência.

Esconde cada passo: lembre antes de tocar para revelar.

  1. 01

    Cada evento traz um sequence explícito por transferência — a ordem nunca vem do horário de chegada

  2. 02

    Um script Lua lê o próximo esperado (resequencer:v1:next:{id}, ausente = 1) e, no mesmo passo, guarda o adiantado no sorted set (score = sequência), descarta o atrasado ou libera o esperado drenando o buffer

  3. 03

    O que foi liberado vai para uma lista por transferência; o worker publica na fila ordenada com confirmação, corta a lista e só então faz ack

  4. 04

    Instâncias concorrentes são segurasO Lua entrega cada sequência a um único chamador; a projeção ignora sequência que não seja maior que a atual

  5. 05

    Política de lacunaToda transferência com buffer aberto fica num índice com o instante em que a lacuna abriu; passado o timeout, vira alerta com o tamanho do buffer

  6. 06

    A API GET /transfers/:id/status lê só a projeção, alimentada só pela fila ordenada

apps/messaging-streaming/resequencer

7 arquivos

src/

  • resequencer_status.tsAceite atômico em Lua, liberação confirmada, alerta de lacuna e worker
  • projector_status.tsProjeção idempotente por sequência e API Elysia de status para o cliente
  • topology_status.tsFilas embaralhada e ordenada, DLX e tipo do evento
  • config_status.tsVariáveis de ambiente validadas no boot
  • resequencer_status.test.tstesteIntegração com Redis e RabbitMQ reais: em ordem, fora de ordem, duplicata, isolamento por transferência, corrida entre instâncias, lacuna e ponta a ponta
  • demo.tsdemoTrês transferências embaralhadas, uma com evento perdido e alerta

./

  • docker-compose.ymlinfraRabbitMQ 3 (5672) e Redis 7 com AOF (6379)

Executar · com Docker

  1. docker compose up -d --wait# sobe Redis · 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
RedisRabbitMQ

Por que se relacionam

Teste rápido

Qual destes combina com Resequencer?

Próximo projeto · Comunicação & MensageriaScatter-Gather
Esc

↑ ↓ navegarEnter abrir191 resultados