投稿日:2021/09/29

ゲームの「サーバ」って何なの?

   

始めに

こんにちは。
株式会社クロスプラススタジオでサーバ関連の仕事をしています
nekoです。

あえてかなりかなりざっくりしたタイトルを付けさせていただきました。
スマートフォン向けゲームでほぼすべてサーバとの通信を必要としていますが
どういったサーバが動いているか紹介したいと思います。

 

ゲームの「サーバ」って何なの?

サーバの種類

サーバの種類は大きく分けて以下となり。

  • APIサーバ
  • DBサーバ
  • キャッシュサーバ
  • ストレージサーバ
  • ゲームサーバ

呼び方は会社毎に違うことがあり、
APIサーバはwebサーバと呼ぶ場合もありますし
ゲームサーバはリアルタイムサーバなど様々です。

ゲームサーバ

ゲームサーバはインゲームと呼ばれる
リアルタイム性を求められる部分を専門に処理するサーバです。

このゲームサーバ以外はゲームだけでなく
webサイトなどでもよく利用されるサーバなのですが
このサーバはゲーム専用の内容で、ゲーム毎にも違います。

実行速度を求められる事が多いため
GOやC#などを使い、クライアントアプリと直接通信を行います。

APIサーバ

ゲームサーバで行われない処理全てが
APIサーバで処理されます。

このAPIサーバでガチャやゲーム開始までに必要な
デッキの編成やキャラクターなどの成長などを処理しています。

APIサーバはユーザからのアクセスを一番最初に受けるため
並列で何10台、多ければ100台を超える台数を使っている場合もあります。

DBサーバ

ゲームのデータと呼ばれるものを管理しているサーバです。
ユーザ情報以外にも敵のステータスやアイテムのデータなど
マスタデータと呼ばれるものもDBで管理されているケースが多いです。

マスターデータは頻繁にアクセスされるので
次に紹介するキャッシュサーバにキャッシュする事で
DBサーバの負荷軽減しています。

DBサーバはデータの種類毎にサーバが分けらる事が多く、
ユーザ情報もIDを元に下一桁目が0~4はDB1、5~9はDB2など、
複数のDBサーバに分ける事があります。

キャッシュサーバ

一時的に保持する必要のあるデータを扱うのが
キャッシュサーバの役割になります。

先ほどのDBサーバと同じデータを扱うサーバですが
大きく違うところは、キャッシュなので
データが消える事を前提としているサーバです。

マスタデータなど頻繁にアクセスされるDBのデータや
ユーザが再接続してきた際にゲームに復帰するために必要な
中断データなどが保持されます。

DBサーバよりも処理速度が速いのですが
大量のデータや巨大なデータを扱うことを苦手とする事が多いです。

ストレージサーバ

ゲーム中に表示する画像や3Dのモデル
音声などを送るサーバです。

アップデートが発生した際に
アプリにデータを送るだけのサーバで
このサーバはロジックを持った処理をする事はありません。

ゲームの説明など静的なコンテンツを扱うサーバです。
お知らせは機能的に似ていますが、日時や内容が更新される場合もあるので
このサーバから配信することは少ないです。

サーバが落ちる時

ゲームを遊んでいる時、サーバに接続出来ませんでした。
など、サーバ側とのやり取りでうまくいかないケースがあると思いますが
ゲームが一番最初に通信を行う時、APIサーバに接続しますが
APIサーバは多くの台数を用意しているケースが多いので
問題が起っているのはDBサーバのケースが多いです。

大抵の場合、何かしら情報を更新しようとした際にエラーが発生していると思うのですが
DBへの書き込みが集中すると、他のユーザの書き込みが終わるのを待つ必要があり
その待ち時間が長いと、接続できなかったなどのサーバエラーを返しています。

 

終わりに

大まかなサーバは以上になります。
他にも管理用のツールを動かすための管理サーバや
ランキングや定期実行するバッチサーバなどもあります。
さらにそれらサーバの通信を出来るようにするネットワークなど
その辺りも含めて多くの機器やサービズでゲームのサーバが動いています。

現在はAWSをはじめとしたVPSやクラウドサービスが多くあり
負荷に合わせてサーバーの台数やスペックを調整することで
サーバの維持費をコントロールしています。

昔の物理のサーバを用意してしないといけなかった時代と比べると
初期投資が減り柔軟性も高くなりましたが
サービスごとに覚える事も多く日々新しい情報に
目を光らせる必要があります。

次回は「開発環境」「ステージング」「本番」の違いなどについて書こうと思っています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です