Un millón de tableros de ajedrez: el experimento web donde todos juegan juntos
(onemillionchessboards.com)- Un sitio web experimental, One Million Chessboards, ofrece un millón de tableros de ajedrez que cualquiera puede manipular al mismo tiempo
- Cuando una persona mueve una pieza, el cambio se refleja en tiempo real para todos los usuarios, y también es posible moverse libremente entre tableros sin turnos
- El estado de todos los tableros se guarda en un arreglo bidimensional en memoria compuesto por 64 millones de
uint64, y el servidor es uno solo - Es el primer proyecto escrito en Go, y la sincronización se realiza mediante mensajes Protobuf comprimidos con zstd sobre WebSocket
- Fue un proyecto técnicamente desafiante, al punto de que solo implementar la lógica del cliente con aplicación optimista + rollback tomó una semana
One Million Chessboards
- One Million Chessboards ofrece un millón de tableros de ajedrez, y cualquiera puede mover piezas al mismo tiempo
- No funciona por turnos; cuando una persona mueve una pieza, el cambio se refleja de inmediato para todos los usuarios
- También es posible desplazarse libremente entre tableros, ofreciendo una experiencia sin precedentes
Contexto
- Es una obra experimental que continúa el proyecto anterior One Million Checkboxes, con el objetivo de apuntar a una escala mayor y a retos más difíciles
- El creador invirtió mucho tiempo en este proyecto y espera que la gente lo disfrute
Cómo fue implementado técnicamente
- Este proyecto fue uno de los trabajos más desafiantes técnicamente entre los que ha hecho recientemente
- Resumen técnico principal:
- Diseño pensado para la escalabilidad
- Funciona en un solo servidor
- Todos los tableros de ajedrez se representan como un arreglo bidimensional en memoria de
uint64(64 millones de celdas en total) - Backend escrito en Go, el primer proyecto en Go del creador
- Un solo hilo writer + múltiples hilos reader, con control de acceso mediante mutex
- El cliente aplica actualizaciones optimistas y, si llegan actualizaciones conflictivas desde el servidor, hace rollback
- Mensajes protobuf comprimidos con zstd enviados al cliente mediante WebSocket
- El cliente está dividido en zonas de 50x50 y solo recibe movimientos de las zonas adyacentes
- Los datos globales (estadísticas, minimapa, etc.) se consultan por polling con HTTP GET, aprovechando la caché de Cloudflare
Punto clave del funcionamiento del cliente
- La estrategia de aplicación optimista + rollback (optimistic update with rollback) consta de unas 1,600 líneas de código y tomó 7 días de trabajo dedicado
“Fue el problema más difícil con el que he lidiado últimamente”
Reacción tras el lanzamiento
- En solo 8 horas desde el lanzamiento, se registraron más de 1.3 millones de movimientos de piezas y alrededor de 400 usuarios concurrentes
- La carga del servidor es tan baja que resulta despreciable
Estadísticas actuales
- Jugadores en línea: 199,276
- Movimientos totales: 5,238,978
- Cantidad total de piezas: 1,490,061,914
- Cantidad de reyes: 9,035,389
3 comentarios
¿Y si lo hubieran hecho un poco más pequeño...? La probabilidad de encontrarte con alguien es demasiado baja jajaja T_T
Lo probé, y me parece interesante que actualmente hay una parte donde puedes salirte de la mesa y pasar al tablero de abajo desde la perspectiva de las negras.
Comentarios de Hacker News
¡Hola! Yo lo hice. Perdón porque la explicación en el blog es insuficiente. Si tienen preguntas sobre la arquitectura, con gusto las responderé. Estuve obsesionado con lograr que este proyecto pudiera manejar miles de clientes concurrentes en un solo proceso.
golangencajó muy bien para este trabajoEste juego se puso interesante. Por ejemplo, la gente descubrió que un solo tablero con el borde exterior llenado con una profundidad de dos casillas era invencible. Está bueno ver el gameplay emergente. Es la genialidad del proyecto de eieio. A simple vista parece sencillo, pero a gran escala te lleva a descubrir posibilidades interesantes
Alguien bloqueó al rey con unas 40 torres. Entré con un caballo, pero de inmediato me capturaron con el rey y luego cerraron el hueco con otra torre. Fue divertido
Se puede mover entre tableros, pero no capturar. Lo raro no es que el movimiento no se proyecte. Por ejemplo, la línea azul de la reina apunta correctamente más allá del borde del tablero, pero se detiene en todas las piezas del otro tablero. Bien hecho como ejercicio de escala
Me salió un error. Uncaught TypeError: Cannot read properties of null
Pensé que cada tablero tendría su propio "turno". No esperaba poder elegir un tablero al azar, liberar a la reina negra y limpiar todas las piezas blancas mientras el oponente no podía hacer nada
Hay un tramposo jugando con el otro color. Creí haberlo visto ayer, pero hoy lo vi con seguridad. Parece que lo está usando por venganza. En cuanto destruyeron la fortaleza negra, las piezas de la fortaleza blanca más cercana se movieron a las peores posiciones posibles
Predigo que esto va a convertirse en una guerra de bots. Por ejemplo, aquí hay un fragmento de código que hace avanzar peones
Es muy divertido andar persiguiendo gente. Incluso aparte del ajedrez, es entretenido
Funciona bien en Firefox en Android. Bien hecho