9 pontos por GN⁺ 2025-04-30 | 3 comentários | Compartilhar no WhatsApp
  • Um site experimental com um milhão de tabuleiros de xadrez que qualquer pessoa pode controlar ao mesmo tempo: One Million Chessboards
  • Quando uma pessoa move uma peça, a mudança é refletida em tempo real para todos os usuários, e também é possível se mover livremente entre os tabuleiros, sem turnos
  • Todo o estado dos tabuleiros é armazenado em um array de memória bidimensional composto por 64 milhões de uint64, e há apenas um único servidor
  • É o primeiro projeto escrito em Go, e a sincronização acontece por meio de mensagens Protobuf comprimidas com zstd via WebSocket
  • Foi um projeto tecnicamente desafiador, a ponto de a implementação da lógica de cliente com aplicação otimista + rollback ter levado uma semana inteira

One Million Chessboards

  • One Million Chessboards oferece um milhão de tabuleiros de xadrez, e qualquer pessoa pode mover peças simultaneamente
  • Não é baseado em turnos; quando uma pessoa move uma peça, a mudança aparece imediatamente para todos os usuários
  • Também é possível se mover livremente entre os tabuleiros, proporcionando uma experiência sem precedentes

Contexto

  • É uma obra experimental que dá continuidade ao projeto anterior One Million Checkboxes, buscando uma escala maior e desafios mais complexos
  • O criador investiu muito tempo neste projeto e espera que todos se divirtam com ele

Como foi implementado tecnicamente

  • Este foi um dos trabalhos mais desafiadores tecnicamente entre os feitos recentemente
  • Visão geral das principais tecnologias:
    • Arquitetura pensada para escalabilidade
    • Executado em um único servidor
    • Todos os tabuleiros armazenados em memória como um array bidimensional de uint64 (total de 64 milhões de células)
    • Backend escrito em Go, sendo o primeiro projeto em Go do criador
    • Uma única thread writer + várias threads reader, com controle de acesso por mutex
    • O cliente aplica atualizações de forma otimista e, quando chegam atualizações conflitantes do servidor, faz rollback
    • Mensagens protobuf comprimidas com zstd são enviadas aos clientes por WebSocket
    • O cliente é dividido em zonas de 50x50 e recebe apenas os movimentos das zonas adjacentes
    • Dados globais (estatísticas, minimapa etc.) são consultados por polling via HTTP GET, com uso do cache da Cloudflare

Núcleo do funcionamento do cliente

  • O modelo de aplicação otimista + rollback (optimistic update with rollback) tem cerca de 1.600 linhas de código e foi desenvolvido ao longo de 7 dias de dedicação
    > “Foi o problema mais difícil com que lutei nos últimos tempos”

Reação após o lançamento

  • Em apenas 8 horas após o lançamento, houve mais de 1,3 milhão de movimentos registrados, com cerca de 400 usuários simultâneos
  • A carga no servidor é praticamente desprezível

Estatísticas atuais

  • Jogadores online: 199.276
  • Total de movimentos: 5.238.978
  • Número total de peças: 1.490.061.914
  • Número de reis: 9.035.389

3 comentários

 
roxie 2025-05-03

E se tivessem diminuído um pouco o tamanho...? A chance de encontrar alguém é pequena demais kkk T_T

 
ifmkl 2025-04-30

Testei e achei interessante que, no momento, é possível sair da mesa atual e passar para o tabuleiro abaixo do ponto de vista das pretas.

 
GN⁺ 2025-04-30
Comentários do Hacker News
  • Olá! Fui eu que fiz isso. Desculpem pela falta de explicação no blog. Se tiverem perguntas sobre a arquitetura, terei prazer em responder. Fiquei obcecado em fazer este projeto conseguir lidar com milhares de clientes simultâneos em um único processo. Golang serviu muito bem para isso

  • Este jogo ficou interessante. Por exemplo, as pessoas descobriram que um único tabuleiro com as bordas externas preenchidas com duas casas de profundidade é invencível. É legal ver a jogabilidade emergente. É a genialidade do projeto do eieio. Parece simples por fora, mas em escala faz você descobrir possibilidades interessantes

  • Alguém bloqueou o rei com cerca de 40 torres. Entrei com um cavalo, então ele imediatamente me capturou com o rei e fechou a brecha com outra torre. Foi divertido

  • É possível se mover entre tabuleiros, mas não capturar. O estranho não é que o movimento não seja projetado. Por exemplo, a linha azul da rainha aponta corretamente além da fronteira do tabuleiro, mas para em todas as peças do outro tabuleiro. Bom trabalho como exercício de escala

  • Ocorreu um erro. Uncaught TypeError: Cannot read properties of null

  • Achei que cada tabuleiro teria seu próprio "turno". Não imaginei que eu poderia escolher um tabuleiro aleatório e libertar a rainha preta para limpar todas as peças brancas enquanto o adversário não pode fazer nada

  • Há um trapaceiro jogando com a outra cor. Achei que tinha visto isso ontem, mas hoje vi com certeza. Parece ter sido usado por vingança. Assim que a fortaleza preta foi destruída, as peças da fortaleza branca mais próxima se moveram para as piores posições possíveis

  • Prevejo que isso vai evoluir para uma guerra de bots. Por exemplo, há um trecho de código que avança peões

  • Perseguir pessoas é muito divertido. É prazeroso mesmo sem ser por causa do xadrez

  • Funciona bem no Firefox em um celular Android. Bom trabalho