PayFlow
Um sistema de transferências financeiras construído com três microsserviços em Go que se comunicam exclusivamente por mensageria assíncrona.
- Go
- PostgreSQL
- RabbitMQ
- Docker
Desafio
Coordenar uma transferência financeira entre serviços independentes sem depender de banco compartilhado ou acoplamento síncrono.
Abordagem
Modelar os limites de usuário, conta e transferência como serviços Go conectados por RabbitMQ, com idempotência, compensação Saga coreografada, circuit breaker e tracing distribuído.
Resultado
Um fluxo de transferência tolerante a falhas cujas decisões de consistência podem ser inspecionadas por traces do OpenTelemetry.
Arquitetura
Decisões e trade-offs
Uma Saga coreografada, sem coordenador central
Cada serviço reage a eventos, o que é mais simples do que manter um orquestrador separado.
O serviço de transferência precisa guardar o estado de cada transferência em andamento.
O Transfer nunca lê o banco do Account; tudo passa pelo RabbitMQ
O serviço de contas é o dono dos dados de saldo.
O Transfer precisa de um timeout para perceber uma resposta que não chegou e compensar.
A referência da transferência é a chave de idempotência
Um consumer que recebe a mesma mensagem duas vezes, depois de uma reconexão ou de um retry, produz o mesmo resultado. Os estornos usam a mesma referência com um sufixo de refund.
Os saldos são guardados em centavos, como int64
Para evitar erros de ponto flutuante com dinheiro.
