Home Broker
Corretora fictícia para compra e venda de ações — cotações em tempo real, carteira por usuário e três serviços independentes conectados por HTTP, WebSocket e Apache Kafka.
Visão geral
O Home Broker é uma corretora fictícia para compra e venda de ações, com cotações atualizadas em tempo real e consulta da carteira de cada usuário.
O projeto é formado por três serviços independentes — front-end, API da corretora e simulador da bolsa — que se comunicam por HTTP, WebSocket e Apache Kafka, todos rodando em containers Docker.
Stack
Front-end: Next.js · React · Tailwind CSS · shadcn/ui · Zustand · Lightweight Charts · Socket.IO
API da corretora: NestJS · MongoDB · Mongoose
Simulador da bolsa: Go
Mensageria: Apache Kafka (Confluent)
Infraestrutura: Docker · Docker Compose
Arquitetura
O front-end conversa com a API em NestJS por HTTP e WebSocket. A API não chama o simulador da bolsa diretamente: as ordens vão para um tópico do Kafka, o serviço em Go processa e devolve o resultado em outro tópico. Os dados ficam no MongoDB, que roda como replica set para permitir o uso de Change Streams.
Next.js <-- HTTP / WebSocket --> NestJS API <-- Kafka --> Simulador (Go)
|
MongoDB
Como uma ordem é processada
- O usuário cria uma ordem de compra ou venda pelo front-end, que envia o pedido via WebSocket.
- A API grava a ordem com status
PENDINGe publica no tópicoinputdo Kafka. - O simulador em Go consome a ordem, coloca no livro de ofertas do ativo e tenta casar com ordens do lado oposto. Uma ordem pode ser executada por completo ou só em parte.
- O resultado, com as transações realizadas, é publicado no tópico
output. - A API consome esse resultado e, numa única transação do MongoDB, registra o negócio, atualiza o status da ordem e ajusta a carteira do usuário. Se for uma compra fechada, o preço do ativo também é atualizado.
- A mudança de preço é detectada pelas Change Streams e enviada ao front-end via WebSocket.
Tempo real
O front-end se conecta via Socket.IO e entra numa sala para cada ativo exibido na tela, então só recebe atualizações do que está mostrando. Os eventos partem das Change Streams do MongoDB: a API observa as coleções de ativos e de cotações diárias e emite o novo valor apenas para a sala do ativo correspondente. No navegador, uma store Zustand guarda os preços, e as tabelas e o gráfico leem dela.
Simulador da bolsa em Go
O simulador mantém um livro de ofertas com filas de compra e venda por ativo. As ordens chegam por um channel, passam pelo matching e saem por outro channel, com o consumo do Kafka rodando numa goroutine separada. Cada ordem guarda quantas ações ainda faltam negociar, o que permite execuções parciais.
O que aprendi
- Modelar comunicação assíncrona com Kafka, tratando a ordem como um estado que muda conforme as mensagens chegam
- Integrar o cliente Kafka da Confluent ao NestJS com um transporte customizado
- Usar goroutines e channels para organizar o fluxo de processamento em Go
- Enviar dados em tempo real com WebSockets, separando os clientes em salas por ativo
- Usar Change Streams e transações no MongoDB, e entender por que ambos exigem replica set
- Orquestrar vários serviços com Docker Compose
Status
O projeto está em andamento. O fluxo completo, da criação da ordem no front-end até a atualização do preço na tela, já funciona de ponta a ponta.
Repositório: github.com/Viniciusrbr/homebroker.