- Experimentelle Website One Million Chessboards mit einer Million Schachbrettern, die jeder gleichzeitig bedienen kann
- Wenn eine Person eine Figur bewegt, wird das in Echtzeit für alle Nutzer übernommen, außerdem ist ein freier Wechsel zwischen den Brettern ohne Züge in Reihenfolge möglich
- Der Zustand aller Schachbretter wird als zweidimensionales Memory-Array aus 64 Millionen
uint64 gespeichert, und es gibt nur einen einzigen Server
- Das erste in Go geschriebene Projekt, die Synchronisierung erfolgt über zstd-komprimierte Protobuf-Nachrichten auf WebSocket-Basis
- Technisch ein anspruchsvolles Projekt, bei dem allein die Implementierung der Client-Logik mit optimistischer Anwendung + Rollback eine Woche dauerte
One Million Chessboards
- One Million Chessboards bietet eine Million Schachbretter, auf denen jeder gleichzeitig Figuren bewegen kann
- Nicht zugbasiert: Wenn eine Person eine Figur bewegt, wird das sofort für alle Nutzer übernommen
- Auch der Wechsel zwischen Brettern ist frei möglich und sorgt für ein beispielloses Erlebnis
Hintergrund
- Ein experimentelles Werk nach dem zuvor entstandenen Projekt One Million Checkboxes, mit dem Ziel, einen noch größeren Maßstab und schwierigere Herausforderungen anzugehen
- Der Entwickler hat viel Zeit in dieses Projekt investiert und hofft, dass die Nutzer Spaß damit haben
Technische Umsetzung
- Dieses Projekt war eines der technisch anspruchsvollsten, an denen zuletzt gearbeitet wurde
- Überblick über die wichtigsten technischen Punkte:
- Mit Blick auf Skalierbarkeit entworfen
- Läuft auf einem einzigen Server
- Alle Schachbretter als zweidimensionales
uint64-Array im Speicher organisiert (insgesamt 64 Millionen Zellen)
- Backend in Go geschrieben, das erste Go-Projekt des Entwicklers
- Ein einzelner Writer-Thread + viele Reader-Threads, Zugriffskontrolle per Mutex
- Der Client wendet Updates optimistisch an und führt bei kollidierenden Updates vom Server ein Rollback durch
- zstd-komprimierte Protobuf-Nachrichten werden per WebSocket an die Clients gesendet
- Der Client ist in 50x50 Zonen unterteilt und empfängt nur Bewegungen aus benachbarten Zonen
- Globale Daten (Statistiken, Minimap usw.) werden per HTTP GET abgefragt, unter Nutzung des Cloudflare-Caches
Kern der Client-Funktionsweise
- Der Ansatz optimistische Updates + Rollback (optimistic update with rollback) umfasst rund 1.600 Zeilen Code und wurde in 7 Tagen konzentrierter Arbeit entwickelt
> „Das war in letzter Zeit das schwierigste Problem, mit dem ich gerungen habe.“
Reaktionen nach dem Launch
- Bereits 8 Stunden nach dem Start gab es mehr als 1,3 Millionen Figurenbewegungen und rund 400 gleichzeitige Nutzer
- Die Serverlast ist vernachlässigbar gering
Aktuelle Statistiken
- Zahl der Online-Spieler: 199.276
- Gesamtzahl der Züge: 5.238.978
- Gesamtzahl der Figuren: 1.490.061.914
- Zahl der Könige: 9.035.389
3 Kommentare
Wäre es vielleicht besser gewesen, die Größe ein wenig zu reduzieren ... Die Wahrscheinlichkeit, jemandem zu begegnen, ist einfach viel zu gering, haha, heul
Ich habe es getestet, und es ist interessant, dass man derzeit den Tisch verlassen und aus der Perspektive von Schwarz zum darunterliegenden Schachbrett wechseln kann.
Hacker-News-Kommentare
Hallo! Das habe ich gebaut. Entschuldigt, dass die Erklärung im Blog nicht ausführlicher ist. Wenn ihr Fragen zur Architektur habt, beantworte ich sie gern. Ich war darauf fokussiert, dieses Projekt so zu bauen, dass es mit einem einzelnen Prozess Tausende gleichzeitige Clients verarbeiten kann. Golang passte gut zu dieser Aufgabe.
Dieses Spiel ist interessant geworden. Zum Beispiel haben Leute herausgefunden, dass ein einzelnes Brett unbesiegbar ist, wenn man die äußeren Ränder zwei Felder tief auffüllt. Es ist schön, emergentes Gameplay zu beobachten. Das ist die Genialität von eieios Projekt. Es wirkt oberflächlich einfach, führt aber in großem Maßstab zur Entdeckung interessanter Möglichkeiten.
Jemand hat den König mit ungefähr 40 Türmen blockiert. Ich bin mit einem Springer eingedrungen, aber er hat mich sofort mit dem König geschlagen und die Lücke mit einem anderen Turm wieder geschlossen. Das war lustig.
Man kann zwischen Brettern ziehen, aber nicht schlagen. Das Seltsame ist, dass Züge sehr wohl projiziert werden. Zum Beispiel zeigen die blauen Linien der Dame über die Brettgrenze hinweg korrekt weiter, stoppen aber an allen Figuren auf dem anderen Brett. Gute Arbeit als Übung in Sachen Skalierung.
Ich habe einen Fehler bekommen. Uncaught TypeError: Cannot read properties of null
Ich dachte, jedes Brett hätte einen eigenen "Zug". Ich hätte nie erwartet, dass man einfach ein zufälliges Brett auswählen, die schwarze Dame befreien und dann alle weißen Figuren abräumen kann, während der Gegner nichts tun kann.
Es gibt einen Cheater, der mit der anderen Farbe spielt. Ich glaube, ich habe das gestern schon gesehen, aber heute definitiv. Es wirkte, als wäre es aus Rachsucht benutzt worden. Sobald die schwarze Festung zerstört wurde, bewegten sich die Figuren der nächstgelegenen weißen Festung in die schlechtestmöglichen Positionen.
Ich sage voraus, dass sich das zu einem Krieg der Bots entwickeln wird. Zum Beispiel gibt es Code-Schnipsel, die Bauern nach vorne ziehen.
Es macht riesigen Spaß, Leute zu jagen. Auch abgesehen vom Schach ist es unterhaltsam.
Funktioniert gut mit Firefox auf einem Android-Smartphone. Gut gemacht.