Pular para o conteúdo

apps/messaging-streaming/event-collaboration

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

Event Collaboration

Serviços colaboram reagindo a fatos publicados uns pelos outros, sem orquestrador central. Cada serviço conhece só os eventos que consome e os que emite; o fluxo emerge da coreografia. Os eventos trafegam num stream JetStream, então um serviço fora do ar não perde nada.

passos
6
arquivos
11
teste
1
tecnologias
4
Infraestrutura realTypeScriptBunNATSDocker
Baixar cartão

Cenário

Uma transferência passa por saldo, antifraude, liquidação e notificação. O serviço de saldo reserva o valor e publica o fato; o antifraude reage e publica o veredito; a liquidação credita o destino; se o antifraude recusa, quem devolve o dinheiro é o próprio serviço de saldo, dono do razão. Nenhum serviço chama outro nem sabe quem vem depois.

Planta

Sequência
10/10
transfer.requested1consumer durável balance2transfer.balance.reserved ou transfer.balance.rejected3consumer durável fraud4transfer.fraud.approved ou transfer.fraud.rejected5transfer.fraud.approved6transfer.settled7transfer.fraud.rejected8transfer.balance.released9settled, rejected ou released10avisa o cliente uma vez por evento finalApp do clienteJetStream TRANSFERSaldoFraudeLiquidaçãoNotificação
10

10 passos — reproduza para seguir o fluxo

Como funciona

6 passos

Serviços cooperam reagindo a eventos.

Esconde cada passo: lembre antes de tocar para revelar.

  1. 01

    Todo evento é um CloudEvent no passado (transfer.balance.reserved) com correlationid = transferência e causationid = evento que o causou

  2. 02

    O stream TRANSFER (retenção Limits) guarda todos os subjects transfer.>; cada serviço tem consumer durável com filter_subjects só dos fatos que lhe interessam

  3. 03

    Saldo e liquidação mudam o razão num bucket KV com compare-and-set pela revisão; o id da operação fica na própria conta, então evento reentregue não debita duas vezes

  4. 04

    O id do evento (<transferência>.<tipo>) é o msgID do publish: republicar depois de uma reentrega é descartado pela janela de duplicata

  5. 05

    Falha transitória → nak com atraso; evento sem transferência válida ou última tentativa → stream TRANSFER_DLQ e term

  6. 06

    Serviço fora do ar retoma do ponto do seu consumer durável — no NATS core o evento teria se perdido

Trade-offs

O que se ganha, o que se paga

4 vantagenscada ganho tem um preço4 custos

Vantagens

  • Serviços desacoplados: nova etapa é um novo consumer

  • Cada serviço escala e sai do ar sem parar os outros

  • Stream com replay e auditoria da cadeia inteira

  • causationid reconstrói quem causou o quê

Custos

  • Fluxo espalhado — o histórico do stream é o único mapa

  • Compensação distribuída entre os donos de cada dado

  • Consistência eventual entre as etapas

  • Sem estado central da transferência — consultar exige ler eventos

apps/messaging-streaming/event-collaboration

11 arquivos

src/

  • event_transfer.tsEnvelope CloudEvents, subjects, streams, publish com msgID e leitura do histórico
  • ledger_account.tsRazão em KV com compare-and-set e operação idempotente
  • service_runtime.tsConsumer durável, slots, nak com atraso, DLQ e term
  • service_balance.tsReserva e devolve saldo
  • service_fraud.tsVeredito de fraude pelo limite de valor
  • service_settlement.tsCredita o destino da transferência aprovada
  • service_notification.tsAvisa o cliente uma vez por evento final
  • choreography_transfer.tsAbre stream e buckets e liga cada serviço aos seus subjects
  • service_transfer.test.tstesteIntegração com JetStream real: cadeia completa, saldo insuficiente, limite de fraude, serviço que volta, reentrega, notificação única e DLQ
  • demo.tsdemoTrês transferências com três desfechos e a liquidação voltando do ar

./

  • docker.shinfraSobe o NATS 2 com JetStream na porta 4222

Executar · com Docker

  1. ./docker.sh up# sobe NATS
  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
NATS

Por que se relacionam

Teste rápido

Qual destes combina com Event Collaboration?

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

↑ ↓ navegarEnter abrir191 resultados