- 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
E se tivessem diminuído um pouco o tamanho...? A chance de encontrar alguém é pequena demais kkk T_T
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.
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