viniciusrbr.dev
← Todos os projetos

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.

Next.jsNestJSGoKafkaMongoDBDockerReactTailwindZustandSocket.IO
Capa do projeto Home Broker

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

  1. O usuário cria uma ordem de compra ou venda pelo front-end, que envia o pedido via WebSocket.
  2. A API grava a ordem com status PENDING e publica no tópico input do Kafka.
  3. 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.
  4. O resultado, com as transações realizadas, é publicado no tópico output.
  5. 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.
  6. 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.