Google Cloud で Diarkis を使った低コストかつ安定なゲームサーバーを実現
Google Cloud Japan Gaming Team
リアルタイムサーバーとは
リアルタイムサーバーとは1つのサーバーに多数のユーザーが接続し、遅延なく通信をやりとりするためのサーバーです。マルチプレイヤーゲームなどの高頻度の双方向通信に使用されるサーバーになります。特徴として、クライアントとのコネクションを維持するステートフルなサーバーであることがあげられます。
リアルタイムサーバーの特徴とコスト
リアルタイムサーバーの特徴
リアルタイムサーバーは高頻度に双方向通信を行うため、ユーザーのクライアントからリアルタイムサーバーに直接通信することが必要不可欠です。
またリアルタイム通信の特性上クライアントとのコネクションを維持する必要があるため、ステートフルサーバーでもあります。
ステートレスなサーバーではないことによって必然的にステートレスな HTTP 通信を想定しているロードバランサーだったり、一般的なオートスケール機能は利用できないという特徴を備えています。
リアルタイムサーバーの運用コスト
リアルタイムサーバーの人的コスト
前章で述べたリアルタイムサーバーの特徴から、リアルタイムサーバーの運用には大きな人的コストが必要になってしまうことが多いという欠点があります。
ロードバランサーを使えないことから、リアルタイムサーバーへのルーティングを管理する必要があったり、オートスケールができないためにサーバーの増減をサービスの運用計画とともに、人が決定し、手作業により行っているサービスが大半です。
このことからサーバーの数が多いまま放置されてしまうことで、大きなインフラコストがかかってしまうことや、サーバーの数が足りないことによってサービスの障害につながってしまうという課題を抱えています。
リアルタイムサーバーのインフラコスト
オートスケールが効かない、サーバーへのルーティングが適切になっていないといった問題から、リアルタイムサーバーを運用する際には、インスタンスの台数が常に多めで運用されていることが多いです。
また、リアルタイムサーバーはクライアントとのコネクションが維持されるステートフルサーバーなので、サーバーの増減に関しても時間がかかったり、メンテナンスを入れてサービスの提供を止める必要があることもあります。
ここまでのまとめ
リアルタイムサーバーはステートフルサーバー
ステートフルサーバーは運用に際してコスト面に関する課題が多い
ここで Google Cloud 上で Diarkis というリアルタイムサーバーエンジンのソリューションを提案します。
Diarkis とは
Diarkis ( https://diarkis.io/ja ) とはリアルタイムサーバーを実現させるためのフレームワークエンジンです。Diarkisは様々なプラットフォーム上で動作し、 N 対 N のリアルタイムな相互通信を容易に実現させてくれます。
また従来までのリアルタイム通信サーバーと異なり、リアルタイムサーバー同士でも通信を行うことによってスケール性やフォールトトレラント性を担保しています。
Diarkis のアーキテクチャ
Diarkis は様々なコンポーネントが協調しあうことで、Diarkis クラスタを構成し、リアルタイムサーバーとしての役割を果たします。
http server
Diarkis への認証やマッチメイキングを行うコンポーネントudp server
暗号化された UDP プロトコルによるリアルタイム通信を担う
tcp server
暗号化された TCP プロトコルによるリアルタイム通信を担うmars server
Diarkis クラスタに関するサービスディスカバリを担う
以上のコンポーネントによって、Diarkis はリアルタイムサーバークラスタを構成します。
またそれぞれのコンポーネントはリアルタイムサーバー間による通信を駆使し、フォールトトレラントであり、スケール性、耐障害性が非常に高いです。
また Diarkis はリアルタイムサーバーとしての多彩な機能(https://diarkis.io/)を備えているだけではなく、運用に関しても非常に有用な機能が多数用意されています。
Diarkis によるリアルタイムサーバー運用に関する機能
Server Discovery
Diarkis クラスタはそれぞれのコンポーネント自身が Diarkis クラスタに自動的に参加します。これはオートスケールの実現への必須要件となっています。
Live upgrade
一般的にリアルタイムサーバーに対するデプロイはメンテナンスを挟まないと行けないということが多いですが、 Diarkis のサーバープロセスは、 SIGTERM を受け取ると、接続しているクライアントがなくなるまで終了せず、かつ新しい接続を受け付けないというメンテナンスモードを搭載しています。
この機能によって新しいコードが動いているサーバーと、古いコードが動いているサーバーの共存が可能となり、サービスインしたままのデプロイが可能になっています。
Room migration
上記の Live upgrade 機能によって、メンテナンスの無いデプロイは可能なのですが、インスタンスの終了までに時間がかかるという欠点があります。
そこで Room migration 機能です。
Room とは Diarkis においてパケットをやり取りする人達の集まりです。
Room migration は
0. 終了予定のサーバーにクライアントがつながって遊んでいる
1.サーバーからクライアントへ自身が終了予定であるというイベント通知
2.クライアントからの Room migration 指令
3.ユーザーが接続しているDiarkis サーバーがサーバー間通信により Diarkis クラスタ内の別サーバーに情報を転送
4.別サーバーへのダウンタイムの無いセッションを維持したままの再接続
といった動作を行います。再接続においては、再認証も必要ないので、非常に高速にこの処理は行うことができ、短時間でのサーバーの入れ替えが可能となります。この機能はデプロイ時や後述するプリエンプティブルVMで非常に有用です。
Diarkis を使った低コストかつ安定なゲームサーバー構成
GKE ( Google Kubernetes Engine ) と Diarkis を使った低コストかつ安定な構成を提案します。この構成の大きな特徴として、 Diarkis クラスタの半数をプリエンプティブルVMを使用して構成することにより、インフラのコストを低く押さえています。
プリエンプティブル VM とは
プリエンプティブル VM は、バッチジョブやフォールトトレラントなワークロードに適した、有効時間が短く手頃な料金のコンピューティングインスタンスです。プリエンプティブル VM は、通常のインスタンスと同じマシンタイプとオプションを備えており、最大 24 時間有効です。アプリケーションがフォールトトレラントで、インスタンスのプリエンプションに対応できる場合、プリエンプティブル VM を使用することで Compute Engine の費用を最大 80% 削減できます。
インフラコスト比較
プリエンプティブル VM を Diarkis サーバークラスタに使用することによって、インフラコストを全体を通常のインスタンスを使用した場合に比べて60%ほどに抑えることができます。
運用コスト
Diarkis を使用した場合のサーバー運用コストは一般的に非常に低く抑えることができます。
GKE によるオートスケールを使用しての、サーバーの自動スケール、セルフヒーリング機能をリアルタイムサーバーながら利用できます。
また、デプロイに際してメンテナンスを挟む必要もなくなるので、サービスを運用できる時間も増え、メンテナンスによる機会損失もなくなります。
まとめ
GCP で Diarkis を利用することによってコストを抑えつつ、運用性も非常に高いリアルタイムサーバーを構築することが可能になります。