Ground Zero
jogo online com economia entre jogadores, missões, guildas e chat em tempo real — o projeto onde aprendi fila, websocket e estado compartilhado.
queria um projeto que forçasse tudo que sistema de gestão não força: estado que muda sozinho com o tempo, vários jogadores agindo ao mesmo tempo sobre o mesmo recurso e comunicação instantânea.
backend em Express com Prisma sobre PostgreSQL, ciclos do jogo em fila Bull no Redis, tempo real por Socket.io e frontend em Next.js com estado em Zustand e cache de servidor em React Query. interface traduzida com next-intl.
como as peças se conectam
- NavegadorNext.js + Socket.io
- ExpressAPI e websocket
- Redis + Bullfila dos ciclos do jogo
- PostgreSQLestado persistido via Prisma
o que existe dentro
Mercado
implementadocompra e venda entre jogadores, com ordens e histórico de preço.
Missões
implementadoobjetivos com recompensa, progresso e ciclos de renovação.
Guildas
implementadogrupos de jogadores com papéis e recursos compartilhados.
Chat
implementadocanais em tempo real por sala e por guilda.
o que foi usado
decisões técnicas e o porquê
fila em vez de cron dentro da API
produção, energia e eventos rodam como jobs no Bull. a API não fica responsável por acordar sozinha, e um job que falha é reprocessado em vez de sumir.
Prisma para versionar o schema
num jogo o modelo muda toda semana. migração versionada evita o banco de produção divergir do código.
internacionalização desde o começo
colocar texto em arquivo de tradução no primeiro dia custa pouco; extrair string espalhada depois custa caro.
o que ficou
- todo job recorrente precisa ser idempotente: a fila vai reprocessar, e a segunda execução não pode pagar a recompensa de novo.
- estado de tempo real quer uma fonte de verdade só. quando o cliente e o servidor guardam versões do mesmo número, a divergência é questão de tempo.