Jungle Wallet
Carteira de apostas em Go em que o próprio banco garante que o saldo nunca diverge do ledger.
Meu papel
Todo o código, a infraestrutura e o CI/CD. Repositório público.
- 232
- req/s numa VM de 2 vCPU
- 29,8 ms
- de p95
- 0
- divergências na reconciliação
Problema
O desafio era processar BET, WIN, LOSS, REFUND e ROLLBACK de vários provedores, por HTTP e por fila SQS FIFO, sem perder atualização, sem saldo negativo e sem processar duas vezes.
Solução
Go com Uber Fx e pgx (SQL explícito, sem ORM), PostgreSQL 17, SQS e SNS FIFO e Keycloak para OIDC. Dinheiro é int64 em centavos, e um teste de AST proíbe float em todo o código interno.
Destaques
- Invariantes no banco, com ledger append-only, cadeia contínua de versão e saldo e uma constraint trigger DEFERRABLE que confere no commit se o saldo bate com o último lançamento.
- Idempotência com hash canônico RFC 8785, compartilhada entre HTTP e fila.
- Um REFUND que chega antes do BET fica pendente e é resolvido quando o BET chega.
- Outbox ordenado por carteira, com fencing token.
- CI com 10 gates (testes -race, testes de sistema com SIGKILL no meio do commit, E2E, Trivy, CodeQL e Gitleaks), imagem assinada com Cosign e deploy via Tailscale com rollback.
Resultado
Aguentou 232 req/s sustentados numa VM de 2 vCPU rodando a stack inteira, com p95 de 29,8 ms e zero divergência na reconciliação. Está no ar em jungle.lab.fredzol.io.