スマホゲームサーバーのしくみをしってみよう
by
Takuma Kajikawa
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
スマホゲームサーバの しくみをしってみよう Takuma Kajikawa 2018/10/29 サポーターズ CoLab
Slide 2
Slide 2 text
梶川琢⾺ Takuma Kajikawa - 2016卒 - モバイルゲーム開発会社 - サーバーエンジニア 3年⽬
Slide 3
Slide 3 text
過去の発表 - MySQLの基礎 - DBテーブル設計入門 - オンラインゲームのしくみをしってみよう
Slide 4
Slide 4 text
もくじ - スマホゲームの特徴 - システム構成例と通信の流れ - ゲームの開発・運用で気をつけるべきこと
Slide 5
Slide 5 text
スマホゲームの特徴
Slide 6
Slide 6 text
スマホゲームのゲームサイクル - キャラ育成 → バトル/クエスト → キャラ育成 →.. - シングル + マルチプレイモード - マルチプレイではよりリアルタイム性が求められる
Slide 7
Slide 7 text
課金モデル - 無料 + アプリ内課金 - ガチャ、スタミナ回復、時短など - 高可用性が求められる - ガチャが引きたい時に引けない… - せっかく時短したのにサーバー障害…
Slide 8
Slide 8 text
スマホゲームサーバの特徴 - 大量のアクセス - データ更新頻度が高い - ピーク時と平常時に求められる性能の差が大きい - メンテナンスをなるべくしない - 頻繁にコンテンツや機能の追加
Slide 9
Slide 9 text
データの特徴 - ユーザデータ - ユーザのレベルや所持アイテム、所持金など - マスタデータ - ゲームのステージやキャラなどの運営が管理するデータ - ログデータ - KPI分析や障害調査
Slide 10
Slide 10 text
システム構成・処理の流れ
Slide 11
Slide 11 text
ゲームモードで変わるシステム構成 - アウトゲーム - キャラ育成、ガチャ、バトル開始、終了など - HTTP(S)通信 - Webアプリの構成に近い
Slide 12
Slide 12 text
ゲームモードで変わるシステム構成 - インゲーム(マルチプレイ) - バトル中の味方や敵の位置、攻撃、チャットなど - WebSocketやP2Pなどの双方向通信
Slide 13
Slide 13 text
API サーバー DB サーバー KVS サーバー Log サーバー LB アウトゲームのサーバー構成 CDN Asset サーバー
Slide 14
Slide 14 text
APIサーバ - リクエスト先はロードバランサによって決まる - 一般的なWebアプリのAPIと同じ構成 - Apache/Nginx - PHP/Java/Go など
Slide 15
Slide 15 text
APIサーバ - スケールアウト・スケールインを柔軟に - ピーク時と平常時に求められる性能の差が大きい - 機能ごとに分割したサーバーを用意することもある - 課金、認証、マッチングなど - 特定の機能に特化することで、開発に専念
Slide 16
Slide 16 text
データストア - DB (MySQLやPostgreSQLなど) - 永続化データ - KVS (RedisやMemcachedなど) - キャッシュ、アクセス頻度が高く消えても問題ない - ログ(BigQueryなど) - 分析用のデータ
Slide 17
Slide 17 text
アセットサーバー - 静的ファイルの配信用のサーバー - 画像や音楽、3Dモデルなど - CDNでキャッシュさせる - 新バージョンだったらクライアントがリクエストする
Slide 18
Slide 18 text
アウトゲームの処理の流れ - 画面遷移時やデータ更新時にサーバーにリクエスト - サーバーがDBやKVSのデータを取得、更新 - 一度のリクエストでデータの追加や更新、取得 - リクエストメソッドの使い分けはほぼGETかPOST - × RESTful API
Slide 19
Slide 19 text
アセット取得の流れ - アセットの種別ごとにバージョンを管理するDBを用意 - 新しいアセットをデプロイしたらDBのバージョンを上げる - クライアントがアセットのバージョンを確認するリクエスト をする - サーバーはDBのバージョンを返す - クライアントで保持しているバージョンと違うアセットがあっ たらそのアセットをダウンロード
Slide 20
Slide 20 text
インゲーム (C/S方式) Battle サーバー DB サーバー KVS サーバー Log サーバー
Slide 21
Slide 21 text
Battleサーバー - 接続先はバトル開始前にAPIサーバーで割り振られる - リアルタイム性が求められる - WebSocketやリアルタイムゲームエンジン - C++/Node.js/Go など - サーバー集中型とクライアント分散型 - ゲームによって特色がある
Slide 22
Slide 22 text
サーバー集中型 - サーバー側でゲームロジックや進行を行う - バトル中サーバー側で必要なデータを保持しておく - 端末間でズレるとまずい処理 - 対戦ゲームでのキャラの位置や当たり判定 - 協力バトルのボスの位置やHP - サーバーの判定処理を待つ必要がある
Slide 23
Slide 23 text
クライアント分散型 - それぞれの端末でゲームの進行を行う - ゲーム進行上、端末間のズレが気にならない場合 - 協力バトルの雑魚敵の位置はズレても気にならない - 不正対策はしづらい - 擬似的なP2P、パケットのブロードキャストに専念する
Slide 24
Slide 24 text
インゲームの処理 パーティを組んで戦うアクションバトルの例 1. パーティ作成 or 参加 2. ルーム(バトル空間)を作成、バトル開始 3. ルーム内でバトル 4. バトル終了、ルーム削除、パーティ解散
Slide 25
Slide 25 text
ルーム入場からバトル開始まで 1. CL → API: パーティ参加リクエスト 2. API → DB: パーティがあるか確認、なければ作成 3. API → CL: Battleサーバーの接続先を返す 4. CL → Battle: ルーム作成リクエスト 5. CL → API: Battle開始
Slide 26
Slide 26 text
バトル中 1. CL → Battle: コマンドを送信 2. Battle → CL: バトル情報を返す 3. Battle → CL: イベント発生を通知
Slide 27
Slide 27 text
バトル終了 1. CL → Battle: バトル終了リクエスト 2. Battle → CL: ルームを削除し、切断 3. CL → API: リザルトのリクエスト 4. CL → API: パーティを解散
Slide 28
Slide 28 text
その他、運営に必要なシステム - レポジトリサーバー、デプロイサーバー - ソースコードやアセットの管理、デプロイに使う - 運営やカスタマーサポート用の管理ツール - データの確認、お知らせやバナーの反映、補填など - KPI基盤 - ログデータの分析や可視化、社内共通
Slide 29
Slide 29 text
運用・開発で 気をつけるべきこと
Slide 30
Slide 30 text
DBの負荷を考慮しよう - DBが負荷のボトルネックになりがち - オンラインでスキーマの変更がし辛い - インデックスやDBのパーティショニング - 集計データはバッチ処理して、キャッシュさせる - なるべく少ないクエリ数でデータを取得
Slide 31
Slide 31 text
DBの負荷分散 - 水平分割 - ユーザのIDごとにDBサーバを振り分ける - 期間限定のDBを日付でパーティショニング - Master/Slave構成 - マネージドサービスを使うのもあり
Slide 32
Slide 32 text
オンラインメンテ - DBのデータ設計を変えたときや定期メンテをオンライン でやりたい - Master DBがネック - Master/Slave切り替え - Percona Tool Kit Online Schema Change(MySQL) - マネージドサービスを使うのもあり
Slide 33
Slide 33 text
リリース後のアラート監視 - サーバーが止まる前に対処する - 各種サーバーのエラー、CPU使用率、リクエスト数 - DBサーバーのクエリ数 - レスポンスタイム - Disk write、使用量 - お客様の問い合わせ、Twitterでエゴサ
Slide 34
Slide 34 text
ゲーム運用で便利なツールを作る - データ管理のしくみを作ろう - ExcelやスプレッドシートからSQLへの変換 - デバッグ機能や管理ツールを作ろう - 開発スピードが格段に上がる - 管理ツールの権限管理は重要
Slide 35
Slide 35 text
まとめ
Slide 36
Slide 36 text
まとめ - ゲームのシステム構成は基本的にはWebアプリと一緒 - アクセス数や更新頻度が高くなる傾向 - リアルタイム性の求められるシステム構成はゲームによっ て異なる - 高い可用性を保つためにオンラインメンテ、アラート監 視などの工夫が必要
Slide 37
Slide 37 text
ご清聴ありがとうございました!