最近構築したスマホゲームのサーバーの話

            <h1>最近構築したスマホゲームのサーバーの話</h1>

これは、少し前に開発/運用していたスマホゲームのサーバー構成です。 大きく5つのブロックに分けています。

[peg-image src="https://lh3.googleusercontent.com/-9pYT3oOxQi0/VvIxO4SIarI/AAAAAAAAHvQ/Rnv3xEmDVyc9FAgD9N39qGtaOV8hzvNrwCHM/s144-o/system_map_2015.png" href="https://picasaweb.google.com/101465714064559237741/iJepED#6265124163322145458" caption="" type="image" alt="system_map_2015.png" image_size="1618x893" ]

  • Contents 画像やパッチを配信するサーバー群。
  • Application ゲームの中枢。WebAPIのためのサーバー群。 ゲームロジックはほとんどここに置いてあります。
  • Socket リアルタイムマルチプレイのためのサーバー群。
  • Tool 管理者がなにかしら操作したり、KPIを見たりするためのサーバー群。
  • その他

Contents

画像やパッチを配信するサーバー群です。

https://contents.tnnsst35.me/1.00.00/assets/hogehoge https://contents.tnnsst35.me/1.01.00/assets/hogehoge

上記のように、Versionごとに管理、配信するようにしています。 実際にはCDNでキャッシュを返しています。

Application

ゲームの中枢。WebAPIのためのサーバー群です。

ほぼ全てのデータはMySQLに格納しており、Redisのデータ型を上手く利用できる一部のデータだけをRedisに格納しています。

MySQLのデータは、データの用途に対していくつかのグループをつくり、グループごとにデータベースを作成しています(機能による垂直分割)。 とある要因で水平分割はしていませんが、将来的にできるような想定でアプリケーション側を構築しています。

MySQLアクセスによる負荷の軽減のために、Tomcatサーバーのヒープメモリ上に、MySQLのマスタデータを一部キャッシュしています。 キャッシュタイミングはTomcat起動時で、MySQLのマスタデータが切り替わる時に、Tomcatを再起動してあげる必要があります。 ダウンタイムなしにアップデートが可能で、サーバー間によるキャッシュデータの差異をなくすために、ホットスタンバイさせているTomcatを先に再起動/最新データをキャッシュさせ、Proxyでアクセス先を変更しています。

残念ながらApplicationサーバーは、最新のVersionのみしか管理、配信できていないので、ゲームアップデート時にメンテナンスが高確率で必要など課題を残しています。

Applicationサーバー群のパフォーマンステストには、JMeterを利用しています。

Socket

リアルタイムマルチプレイのためのサーバー群です。 Node.js + socket.ioで、セッションストア兼リレーサーバーにはRedisを採用しています。 Node.jsのマルチスレッド対応にはPM2モジュールを利用しています。

Socketサーバー群のパフォーマンステストには、自作クライアントを利用しています。

Tool

管理者がなにかしら操作したり、KPIを見たりするためのサーバー群です。 実際には、ランキング集計バッチなんかも動作させています。

その他

その他に置いているサーバー群です。 Deployは、DeployサーバーのユーザーがSubversionからリソースを取得し、Contents、Application、Socket、Toolの各サーバーにrsyncで配布します。

通信ルール

クライアントとサーバーの通信には以下のルールを適応しています。

  • サーバーからのレスポンスはJSON形式。
  • サーバーからクライアントへのレスポンスに、最新クライアントVersionを付加するので、今のクライアントVersionと比較して古ければストアに飛ばす。
  • サーバーからクライアントへのレスポンスに、最新パッチVersionを付加するので、今のパッチVersionと比較して古ければ(タイトルから遷移するときにパッチ適応させるため)タイトルに飛ばす。
  • サーバーがメンテナンスの場合は、メンテナンスコードをレスポンスに含めるので、クライアントでメンテナンス表示にする。

まとめ

「ユーザーがいっぱい来たらお金をかけてがんばりましょう」というのが方針なので派手なことはしていませんが、最低限の冗長化と負荷対策、スケールアウトできる構成にしています。 残念ながら悲鳴をあげるほどゲームが流行らなかったのですが・・・。

Redis、Socketサーバー群の各ミドルウェアの採用は私が決めましたが、それ以外は前任者から引き継いだものをより柔軟に対応できるように構成を再構築したものです。

ポケモン緑をプレイ中(4日目)

            <h1>ポケモン緑をプレイ中(4日目)</h1>

4日目。プレイ時間が12時間くらい。 シルフカンパニーでサカキを倒し、ジムでナツメも倒しサイクリングロード経由でセキチクシティに到着。 パーティはこんな感じ。

[peg-image src="https://lh3.googleusercontent.com/-1DER93QLOVw/VuZJgDCItzI/AAAAAAAAHts/CiX7XzXMX0c2GPxJest2C9zJjwN9XGGOg/s144-o/IMG_3959.JPG" href="https://picasaweb.google.com/101465714064559237741/iJepED#6261773146824161074" caption="" type="image" alt="IMG_3959.JPG" image_size="3024x3024" ]

ロコンがほのおのうずを覚えたので、キュウコンに進化させました。

ポケットモンスター ピカチュウ 専用ダウンロードカード特別版 (『ポケットモンスター X・Y・オメガルビー・アルファサファイア』で利用できる幻のポケモン「ミュウ」の特典コード付) &【Amazon.co.jp限定】「ポケットモンスター ピカチュウ」デザイン PC壁紙配信(2016年3月31日注文分まで)
ポケットモンスター ピカチュウ 専用ダウンロードカード特別版

ドラゴンクエストモンスターズ ジョーカー3【Amazon.co.jp限定】「魔法使いのゆびわ★★★」を先行入手できるダウンロードコード付
ドラゴンクエストモンスターズ ジョーカー3

ポケモン緑をプレイ中(3日目)

            <h1>ポケモン緑をプレイ中(3日目)</h1>

3日目。プレイ時間が10時間くらい。 シオンタウンを攻略後、ヤマブキシティシルフカンパニーを攻略中です。 パーティはこんな感じ。

[peg-image src="https://lh3.googleusercontent.com/-3jC4NJ8DGkU/VuZJgM_CqNI/AAAAAAAAHtc/cABY39DssXg0nAmJ6HDtmU3ljqM3_-b0Q/s144-o/IMG_3958.JPG" href="https://picasaweb.google.com/101465714064559237741/iJepED#6261773149495535826" caption="" type="image" alt="IMG_3958.JPG" image_size="3024x3024" ]

ポケットモンスター 赤 専用ダウンロードカード特別版 (『ポケットモンスター X・Y・オメガルビー・アルファサファイア』で利用できる幻のポケモン「ミュウ」の特典コード付) &【Amazon.co.jp限定】「ポケットモンスター 赤」デザイン PC壁紙配信(2016年3月31日注文分まで)
ポケットモンスター 赤 専用ダウンロードカード特別版

ドラゴンクエストモンスターズ ジョーカー3【Amazon.co.jp限定】「魔法使いのゆびわ★★★」を先行入手できるダウンロードコード付
ドラゴンクエストモンスターズ ジョーカー3

ポケモン緑をプレイ中(2日目)

            <h1>ポケモン緑をプレイ中(2日目)</h1>

2日目。プレイ時間が7時間を突破! タマムシシティでエリカを倒して、ロケット団のアジトを壊滅させました。 パーティはこんな感じ。

[peg-image src="http://lh3.googleusercontent.com/-G7SCTD3XAFU/VtZERZZ5S2I/AAAAAAAAHqw/vuaNsaaCUg8/s144-o/IMG_3957.JPG" href="https://picasaweb.google.com/101465714064559237741/iJepED#6257263797945846626" caption="" type="image" alt="IMG_3957.JPG" image_size="2626x2682" ]

ロコンが新加入。バトルで使っていないポケモンはボックスにあずけました。 次はイーブイをもらいつつ、シオンタウンのポケモンタワーへGO!

ポケットモンスター 緑 専用ダウンロードカード特別版 (幻のポケモン「ミュウ」が『ポケットモンスター X・Y・オメガルビー・アルファサファイア』で受け取れる) &【Amazon.co.jp限定】「ポケットモンスター 緑」デザイン PC壁紙配信(2016年2月27日注文分まで)
ポケットモンスター 緑 専用ダウンロードカード特別版

妖怪三国志 (封入特典『コマさん孫策』武将レジェンドメダル 同梱) 早期購入者特典『コマさん孫策』フィギュアストラップ & Amazon.co.jp限定特典(缶バッジ2個セット(コマさん孫策、コマじろう孫権)) 付
妖怪三国志 (封入特典『コマさん孫策』武将レジェンドメダル 同梱)

ポケモン緑をプレイ中(1日目)

            <h1>ポケモン緑をプレイ中(1日目)</h1>

2月27日に発売されたニンテンドー3DSバーチャルコンソールポケットモンスター赤・緑・青・ピカチュウ」。

ぼくは「青のニンテンドー2DS限定パック」の2DS本体で、「ポケモン緑」をやり始めました。 本体カラーは好きな青色がよかったんですが、ソフトは初めてプレイした緑がよかったんです。

[peg-image src="http://lh3.googleusercontent.com/-QSjv1CJga0c/VtPKOLjb8NI/AAAAAAAAHqA/uU2nh6PFt3A/s144-o/IMG_3948.JPG" href="https://picasaweb.google.com/101465714064559237741/iJepED#6256566652316152018" caption="" type="image" alt="IMG_3948.JPG" image_size="3024x3024" ]

3DSから2DSに引越ししたんですが、2DSにプリインストールされていたポケモン青が消えたのに焦りました・・・が、ニンテンドーeショップからポケモン青を無料でダウンロードできました。 ニンテンドー2DS『ポケットモンスター 赤・緑・青・ピカチュウ』限定パックをご購入いただいたお客様に重要なお知らせにDSの引越しについて書かれていますが、引越しする場合は引越し先で「ニンテンドーネットワークIDの連携」「プリインストールされているポケモンをプレイ」をする前に引越ししましょう。

27日に2DSは入手したんですが、Amazonポケモン緑を28日に届けてきたので、まだプレイ1日。5時間くらいのプレイで今こんな感じ。

[peg-image src="http://lh3.googleusercontent.com/-i9uf5oV9l1c/VtPKX6Z73HI/AAAAAAAAHqI/2O8lrPBuyS8/s144-o/IMG_3949.JPG" href="https://picasaweb.google.com/101465714064559237741/iJepED#6256566819511590002" caption="" type="image" alt="IMG_3949.JPG" image_size="3024x3024" ]

マチスを倒して、イワヤマトンネル向かっている途中です。

最初に選んだフシギダネフシギバナに進化しました。1体を集中して育てていくプレイスタイルです。 好きなプリンもじわじわ育てつつ、一応ピカチュウもいれつつ、いあいぎりのおしょう(カモネギ)です。 あとは、ボックスにあずけていないだけです。

おまけ

「青のニンテンドー2DS限定パック」はポケモンセンターオンラインで注文したんですが、配送の箱がかわいかったです。

[peg-image src="http://lh3.googleusercontent.com/-C52Bt5d5xd4/VtOiJKvSOII/AAAAAAAAHpI/aVIIUiML4V0/s144-o/IMG_3937.JPG" href="https://picasaweb.google.com/101465714064559237741/iJepED#6256522585732954242" caption="" type="image" alt="IMG_3937.JPG" image_size="3025x2035" ]

[peg-image src="http://lh3.googleusercontent.com/-rNjBrpK7DZA/VtOiSLBW06I/AAAAAAAAHpU/cKmE7AmsrIg/s144-o/IMG_3938.JPG" href="https://picasaweb.google.com/101465714064559237741/iJepED#6256522740427576226" caption="" type="image" alt="IMG_3938.JPG" image_size="3025x2985" ]

ポケットモンスター ピカチュウ 専用ダウンロードカード特別版 (幻のポケモン「ミュウ」が『ポケットモンスター X・Y・オメガルビー・アルファサファイア』で受け取れる) &【Amazon.co.jp限定】「ポケットモンスター ピカチュウ」デザイン PC壁紙配信(2016年3月31日注文分まで)
ポケットモンスター ピカチュウ 専用ダウンロードカード特別版

モンスターハンタークロス
モンスターハンタークロス