イベント
[GDC 2016]110万人が同時接続する「World of Tanks」のバトルを支えるサーバーアーキテクチャとは
GDC 2016の最終日(北米時間の2016年3月18日),「Engineering Decisions Behind World of Tanks Server」と題するセッションで,ピーク時には110万人が接続するというWorld of Tanksのサーバー概要が語られた。
「World of Tanks」公式サイト
マップを分割してサーバーの負荷を分散化
Baryshnikov氏によると,World of TanksはBigWorld Technologyが提供している大規模オンラインゲーム向けのソリューションを用いて開発されている。サーバーは大規模なクラスタを用いており,そこで動作しているコンポーネントの設計は以下のスライドのようなものだという。
それぞれのコンポーネントの機能を説明しておくと,LoginAppはユーザーのログインを制御,DBAppはユーザー情報のデータベース,BaseAppはゲームのスタートと共に起動されるコンポーネントで,ユーザーとCellAppを仲介する役目を持つ。そして,CellAppがオンラインバトルを司るコンポーネントである。また,BaseAppやCellAppには,それぞれを管理するBaseAppMgr,CellAppMgrといったマネージャコンポーネントが存在している。
「それぞれのコンポーネントは,クラスタ上で別のプロセスとして動いている」(Baryshnikov氏)とのこと。ユーザーがWorld of Tanksに接続すると,LoginAppがログインを受け持ち,DBAppによってユーザー情報を参照,ゲームをスタートするとBaseAppMgrがBaseAppを起動する。そして,バトルが行われるCellAppに接続するというイメージで動作しているようだ。
これらのコンポーネントの中でも,非常にユニークなのがCellAppだ。World of Tanksの戦場(Battle Arena)を複数の区画(Cell)に分け,それぞれを1つのCellAppが担当する形になっている。このようにして,広大な戦場のバトルで生じる負荷をサーバー上で分散しているというわけだ。
さらに,ある区画のバトルが激しくなり,CellAppの負荷が高まったことを検出すると,CellAppMgrによってその区画が分割される。そして,新たなCellAppが起動するという。CellAppMgrは100ms(ミリ秒)単位で,それぞれの区画で起きるイベントを監視しており,負荷に応じて柔軟にCellAppを起動することで,サーバーの負荷分散を行っている,とBaryshnikov氏は説明していた。
戦場が区分されていて,サーバー上でそれぞれ別のプロセスとしてバトルが行われているならば,「区画の境界で問題が生じるのでは?」と疑問に思われるかもしれない。
Baryshnikov氏によると,World of Tanksではプレイヤーを中心とした1km(500m×2)四方の正方形を「Area of Interest(AoI)」というエリアに設定しているという。このAoIはプレイヤーから見える範囲というわけではなく,「ゲームロジックの都合で設定しているエリア」。そしてプレイヤーから見える範囲は,AoIの内側になっている。
AoIが先のCellをまたぐとどうなるかだが,隣りのCellにいる敵(など)がGhost(ゴースト)として見える仕組みになっているそうだ。
BaseAppは,プレイヤーがいるCellに対応するCellAppのほかに,Ghostがいる隣りのCellのCellAppからも情報を取得している。また,隣り合うCellApp同士も情報をやり取りしているという。そして,プレイヤーが移動して隣りのエリアに入ると,Ghostがリアルな実体に切り替わる仕掛けである。
隣りのCellへの攻撃も同様で,CellAppが攻撃に対応する「ProjectileMover」(弾道移動とでも訳せばいいだろうか)という実体をセットし,その弾道がCellの境界を超えた先のGhostに当たったかを計算できる仕組みになっているという。
110万人の同時接続に耐える堅牢なバックアップシステム
World of Tanksにとって,戦場を区分けするCellと,そのCellでの戦いを実現するCellAppがとても重要な仕組みであるということが分かったと思う。さらに非常に巧妙だと感心させられたのは,このモジュールに分散させている構造を一種のバックアップシステムとして活用している点だ。
あるユーザーのBaseAppは,ユーザーを囲むAoIの範囲内の敵の情報を持っている。そのため,あるCellAppがクラッシュしても,BaseAppに残っている情報からCellAppを即座に復帰させることができるそうである。一方,BaseAppにはバックアップが用意されており,仮にBaseAppがクラッシュしても復帰できると,Baryshnikov氏は説明する。
CellAppがクラッシュした場合の復帰プロセスを示したのが下のスライドだ。CellAppMgrが,クラッシュしたCellの隣りのCellを拡張して,BaseAppに残っている情報からリカバリを行うのである。スライドにも記されているように,このプロセスには1,2秒の時間がかかるが,大きな問題にならない程度の短時間で復帰できるというわけだ。
さて,そのWorld of Tanksのクラスタサーバー群はどのように運用されているのだろうか。下のスライドは東欧の分散クラスタを示したものだが,モスクワやクラスノヤルスク,フランクフルト,アムステルダムにサーバー群が設置されているという。
Baryshnikov氏によると,この分散クラスタをCAP定理※から,CPアプローチ※で運用しているという。というのも,World of Tanksにおいてはユーザー情報の一貫性が,何よりも重要だからだである。
※CAP定理とは,分散システムにおけるマシン間の情報複製の定理のこと。一貫性=Consistency,可用性=Availability,分断耐性=Partition-toleranceの3つは同時に実現できないというもの。つまり,CPアプローチは可用性以外の2つを重視したアプローチを指す。
また,World of Tanksではe-SportsやClanに関連する外部サービスを行っているが,これらにはイベント駆動型アーキテクチャ(Event-Driven SOA)を構築しているとのこと。イベントをやり取りするEvent Busには,VMWareの「RabbitMQ」や「Apache Kafka」といったメッセージングシステムを利用しているそうだ。
ちなみに,現在,World of Tanksは3000万人のプレイヤーを抱え,ピーク時には全世界で110万人が同時に接続してバトルを繰り広げている。ログイン数は1秒あたり200以上,最大ログイン数は1秒あたり1000を超えるという。
こうした大規模なバトルが分散システムで動いているのだが,「ある物理マシン上で起きた(ゲームの)イベントは2ms(ミリ秒)以内には,ほかの物理マシンに伝達される」とのこと。極めて高速なモジュール群によって,クラスタが構成されていることがうかがえる。
今回のセッションは,典型的なMOゲームのサーバー事例として,開発者にとって貴重なものと言えるだろう。もちろん,World of Tanksのプレイヤーにとっても,プレイ中にちょっとしたラグが発生したら「CellAppがクラッシュしたのかな?」などと思ってみると,ゲームをより楽しめるかも……しれない。
「World of Tanks」公式サイト
4Gamer GDC 2016関連記事一覧
- 関連タイトル:
World of Tanks
- 関連タイトル:
World of Tanks Modern Armor
- 関連タイトル:
World of Tanks Modern Armor
- この記事のURL:
キーワード
(C) Wargaming.net
(C)2009-2015 Wargaming.net 2013 Wargaming.net LLP. All rights reserved.
(C) Wargaming.net