- 誰でも同時に操作できる100万枚のチェス盤を提供する実験的なウェブサイト One Million Chessboards
- 1人が駒を動かすと全ユーザーにリアルタイムで反映され、ターンなしで盤の間を自由に移動することも可能
- すべてのチェス盤の状態は 6,400万個の
uint64 で構成された2次元メモリ配列に保存され、サーバーは1台 בלבד
- Go言語で書かれた最初のプロジェクトであり、WebSocketベースの zstd 圧縮された Protobuf メッセージで同期が行われる
- 楽観的適用 + ロールバック方式のクライアントロジックの実装だけで1週間を要するほど、技術的に挑戦的なプロジェクトだった
One Million Chessboards
背景
技術的な実装方法
- このプロジェクトは最近手がけたものの中で最も 技術的に挑戦的な作業だった
- 主な技術概要:
- スケーラビリティを考慮した設計
- 単一サーバーで稼働
- チェス盤全体をメモリ内の2次元
uint64 配列として構成(合計6,400万セル)
- Go言語で書かれたバックエンド、制作者にとって 初のGoプロジェクト
- 単一の writer スレッド + 多数の reader スレッド、mutex でアクセス制御
- クライアントは楽観的更新を適用し、サーバーから競合する更新が届いたら ロールバック処理
- zstd 圧縮された protobuf メッセージを WebSocket でクライアントに送信
- クライアントは 50x50 のゾーンに区分され、隣接ゾーンの動きのみ受信
- グローバルデータ(統計、ミニマップなど)は HTTP GET でポーリングし、Cloudflare キャッシュを活用
クライアント動作方式の核心
- 楽観的適用 + ロールバック方式(optimistic update with rollback) は約 1,600行のコードで構成され、7日間専念して開発された
> 「ここ最近で最も苦労した問題だった」
リリース後の反応
- リリースから8時間で 130万件以上の駒移動記録、同時接続ユーザー約400人
- サーバー負荷は 無視できるほど低い
現在の統計
- オンラインプレイヤー 数: 199,276人
- 総移動数: 5,238,978回
- 駒の総数: 1,490,061,914個
- キングの数: 9,035,389個
3件のコメント
もう少しサイズを小さくしていたらどうだったんだろう……誰かに出会える確率が低すぎますね(笑) 泣
試してみましたが、現在のテーブルをはみ出して、黒番基準で下のチェス盤へ移動できる部分が興味深いですね。
Hacker Newsのコメント
こんにちは! これを作った本人です。ブログの説明が足りなくてすみません。アーキテクチャについて質問があれば喜んで答えます。このプロジェクトを単一プロセスで数千人の同時クライアントを処理できるようにすることに打ち込んでいました。golangはこの作業にとても向いていました
このゲームは面白くなってきました。たとえば、人々は外周の端を2マスの深さで埋めた単一のボードが無敵だと気づきました。emergent gameplayを見るのは楽しいです。eieioのプロジェクトの天才的なところです。一見シンプルに見えますが、大規模になると興味深い可能性が見えてきます
誰かが王を40個ほどのルークで囲っていました。私がナイトで入り込んだら、すぐに王で取られて、別のルークで隙間を塞がれました。面白かったです
ボード間の移動はできますが、キャプチャはできません。奇妙なのは、移動が投影されていないわけではないことです。たとえば、クイーンの青い線はボードの境界を越えて正確に示されますが、別のボードのすべての駒で止まります。スケールの実験としてよくできています
エラーが出ました。Uncaught TypeError: nullのプロパティを読み取れません
各ボードに「ターン」があるものだと思っていました。ランダムなボードを選んで黒のクイーンを解放すれば、相手が何もできない間に白の駒を全部片付けられるとは思いませんでした
別の色でプレイしているチーターがいます。昨日見た気がしましたが、今日は確実に見ました。報復に使われていたようです。黒の要塞が破壊された途端、最も近い白の要塞の駒が最悪の位置へ移動しました
これがボット戦争に発展すると予想しています。たとえば、ポーンを前進させるコード片があります
人を追い回すのがものすごく楽しいです。チェスそのものが理由でなくても楽しめます
AndroidスマートフォンのFirefoxで問題なく動きます。よくやりました