SlideShare a Scribd company logo
オリジナル
ゲーム専用プラットフォーム
について
少し自己紹介
● 2008年 DeNA入社(みんなのウェディング)
● 2010年 エンジニアになる
● 2011年 DeNA退社 -> 福岡へ
● 2013年 DeNAに出戻り
● 2016年 ゲーム事業本部
●
●
春山 誠
DeNAのゲーム開発について
DeNA for GAME CREATORS
参照元 : http://recruit-games.dena.jp/technology/
DeNA for GAME CREATORS
参照元 : http://recruit-games.dena.jp/technology/
DeNA for GAME CREATORS
参照元 : http://recruit-games.dena.jp/technology/
DeNA for GAME CREATORS
参照元 : http://recruit-games.dena.jp/technology/
今日お話すること
1. Sakashoとは
2. Sakashoの構成について
3. Rubyを使った開発について
4. 最近の取り組み
5. まとめ
Sakashoとは
DeNA for GAME CREATORS
ネイティブゲーム用プラットフォーム
Sakasho
Sakashoとは
ネイティブアプリゲーム開発に
必要とされるサーバー機能を
提供するゲームプラットフォーム
ゲーム開発におけるサーバーサイドで
やるべき事をSakashoが一括で受け持
つことで、各開発チームはクライアント側
の開発に専念できる
運用のしやすさも見据えたゲームの
作り方のルールもある程度強いる
ゲーム開発・運用に必要なAPIの提供
● ユーザー情報API
● マスターデータ配信API
● ログインボーナスAPI など
Sakashoが提供している機能
● 課金API
● アセット配信API
● CS対応のための機能
SDK
● 課金やPush通知など、OSに依存している機能について
簡単に使えるインターフェースの提供
● Unity、C++のゲームエンジンに対応
Sakashoが提供している機能
WebView用インターフェースの提供
● お知らせの配信
● 掲示板
● 利用規約など
Sakashoが提供している機能
ゲーム専用サーバーとの連携機能
● ゲーム専用サーバーからSakashoにアクセスできるWeb APIを提供
● ゲーム専用サーバーを介してのユーザー情報の取得などに対応
Sakashoが提供している機能
Sakashoの機能一覧(一部抜粋)
● マスターデータ配信
● アセット配信
● プレイヤー管理
● お知らせ管理
● アイテム管理
● ログインボーナス
● お問合せ機能
● 課金
● ログ管理
● ランキング
● 掲示板
● 補填機能
● メンテナンス
● Push通知
● プレイヤー検索機能
● ギルド
● アプリのバージョン管理
● CS運用ツール
Sakashoが提供している機能
主なリリースタイトル
Sakashoの構成について
Sakashoの構成について
Sakashoの構成について(Web View)
マイクロサービス?
役割毎に10の独立したAPIコード群がある
○ メリット
■ 他のAPIへの影響を考えずにデプロイできる
■ リソースを細かく調整できる
○ デメリット
■ 運用工数がかかる(gemの更新とか)
■ 結局サービス毎に人を専用にアサインとかしなかったので、全員
全部見る状態
コード量も少ない(API全部ファイル数が700程度、行数3万行)のでこの規模
だと管理工数のほうが大きい
Sakashoの構成について
Sakashoの構成について
○ MySQLのMaster/Slave構成 + sharding
○ MHAでMasterの高可用性
○ MySQLへの接続は都度接続
○ DNSサーバーはMyDNSを使って、DeNA独自の拡張も入っている
DB周りは、基本インフラチームの指針にそっており、DeNAのオーソドックス
な構成になっています
Sakashoの構成について
DBに関して
Rubyを使った開発
Rubyを書ける人が多いチーム
○ Rubyで開発、運用 > Perlでの開発・運用
○ 何かあってもフォローできる人材がいる
採用面
○ Rubyでサービス開発を経験している人材の増加
Rubyの選択
Rubyを使った開発
PerlからRubyへの移行対応も責任をもって進めた
1. API サーバー : Sinatra + Sequel + Jbuilder
a. アクセス数が多いので、省メモリ・ハイパフォーマンス
b. JSONしか返さない
2. Web View向けWeb サーバ : Ruby on Rails
a. アクセス数は少ない
b. DBに直接アクセスせずに、1のAPIを経由してデータを取得する(API
の仕様そのまま)
c. Web UIを簡単に作れる
フレームワーク選定
Rubyを使った開発
1. 管理 ツール : Ruby on Rails
a. アクセス数は限られている
b. Web UIを簡単に作れる
c. 多少パフォーマンスが犠牲にしても、開発スピードを上げる
フレームワーク選定
Rubyを使った開発
詳細は下記資料をご参照頂ければ
Rubyを使った開発期
http://www.slideshare.net/blueskyblue/de-na-game-backend-as-a-service-20150129
最近の取り組み
パフォーマンス向上
キャッシュ戦略
最近の取り組み
● 基本的にSakashoのキャッシュ戦略はオンメモリキャッシュ
● 幸か不幸かマイクロサービスっぽい作りで、役割分担がされている
○ SakahsoはのAPIサーバーはprefork型(rubyのUnicorn)
○ wokerの数はAPI単位だと少ない(10位)
○ メモリの消費は激しくないため、念のため定期的に再起動はしてい
るが、それにも1h一回程度
■ 1サーバ 125プロセス(60MB 〜 100MB/process)
○ 主にゲームの設定値をキャッシュするので、そこまでメモリを消費す
ることもない
メモリキャッシュ
最近の取り組み
DBのクエリ改善
最近の取り組み
● KVS使う?
○ 一旦冷静に考えて
○ request headerに詰めて渡しているのもある
■ プレイヤーのID
■ shardのID
Proxy -> API間でどうやって共有?
DBのindex
最近の取り組み
● まあ、あるあるで昔作ったコードでPKがない、indexが足りてないとかとか
がたくさんある。。。。
● どうやって修正していくか?
○ 目をつむって ALTER(まあ、40万rowsくらい目安) + Online DDL
○ 徐々に移行(別テーブルに移す)
○ ALTER打ってMHA(最終手段)
○ 仕様変える
まあ、当たり前にみんなやるよね。。
最近の取り組み
● まあ、あるあるで昔作ったコードでPKがない、indexが足りてないとかとか
がたくさんある。。。。
● どうやって修正していくか?
○ 目をつむって ALTER(まあ、40万rowsくらい目安) + Online DDL
○ 徐々に移行(別テーブルに移す)
○ ALTER打ってMHA(最終手段)
○ 仕様変える
まあ、当たり前にみんなやるよね。。
最近の取り組み
● テーブル定義、indexが正しいテーブルを用意
● 古いテーブルと新しいテーブルへ二重に書き込み
○ 整合性チェックスクリプトは用意しておく
● (有効期限あるデータなのであれば)古いテーブルにデータがなければ、
新しいテーブルをみるようなフォールバックコードをいれる
● 移行完了かどうか判定するスクリプトは用意しておき、確認
● 確認完了したら、古いテーブルへの書き込みは停止
● 新しいテーブルのみの参照に切り替え
徐々に移行
Disk Full
最近の取り組み
Diskがあふれる
● プレイヤーの保存履歴を持っている
○ 保存するたびにjsonを保存している
○ DBに保存するには大きすぎるが、ログとして残しておく必要がある
○ DBの増設やshardで対応は現実的でない
最近の取り組み
S3へ逃がす
● jsonをS3へ逃がす
○ dailyでプレイヤー毎に履歴をjsonファイルにして、S3へアップロード
する
○ 今は毎日バッチで対応
● 管理ツールからの検索
○ 日付とプレイヤーのIDで履歴を閲覧可能に
○ そこまでの検索頻度はないので転送量はそこまでかかっていない
メモリ効率化
最近の取り組み
● SakahsoはのAPIサーバーはprefork型(rubyのUnicorn)
● 今までは、Unicornの新しいプロセス(master + worker)が全て新規に立ち
上がるのを見届けてから古いプロセスを停止させていた
○ 一時的にプロセス数が全体の2倍になり、最悪の場合メモリ使用量
が平常時の2倍になりえる (CoWが効いているのでので実際には2
倍にはならないが。。。)
● これを防ぐために、新しいworkerプロセスを1つ起動できたタイミングで古
いworkerプロセスを停止するように修正
APIサーバーのslow restart
最近の取り組み
DeNAのオーソドックスなプロセス管理
● daemontools
○ プロセスの監視
■ プロセスが死んだ場合の自動再起動
○ ログの収集
最近の取り組み
DeNAのオーソドックスなプロセス管理
● daemontools + unicorn
○ unicornをdaemontoolsの配下で動かそうと思ったとき、masterを
graceful restartしようとSIGUSR2を送信すると、親プロセス(旧
worker)が終了した時点で子プロセス(新worker)がinitプロセスの養
子に入ってしまう
○ そうするとdaemontoolsの管理から外れてしまう
○ そこでgraceful restartをServer::Starterに任せる構成にしている
参照元 : http://d.hatena.ne.jp/limitusus/20131225/1387993119
最近の取り組み
DeNAのオーソドックスなプロセス管理
/bin/sh /command/svscanboot
_ svscan /service
| _ supervise log
| | _ multilog t s999999 n10 ./main
| _ supervise sake
| | _ perl start_server --path=/sake/current/tmp/sockets/unicorn.sock --
signal-on-term=QUIT --signal-on-hup=QUIT --status-file=/sake.status --
pid-file=/sake.pid --dir=/sake/current --envdir=/sake/env --
/sake/current/bin/unicorn -c config/unicorn.rb
| | _ unicorn master #sake -c config/unicorn.rb
| | _ unicorn worker[0] #sake -c config/unicorn.rb
最近の取り組み
● すでにServer::Starter + kill-old-delay で運用されている
● 稼働サーバー台数も増えている
○ --signal-on-hupの変更(QUITからCONTへ)を行うことは、作業量が
多すぎるため避ける
○ ワーカー数の多いAPIについてはkill-old-delayを伸ばした上で、
slow restartを導入する
Sakashoの場合の運用事情
最近の取り組み
● check-rack-server-status での監視が unicorn の masterプロセスに対
して、空いているワーカー数を数えている
○ 再起動直後はワーカー数が足りない状態が検出されてしまうという
問題
○ 回避するためcheck-rack-server-statusは複数リクエストの結果で
判断してもらうように監視を修正
Sakashoの場合の運用事情
APIサーバーのslow restart
最近の取り組み
● 実際どうなったの?
キャパシティ管理
最近の取り組み
● リソースの取得方法
○ 自前 daemon
○ fluentd
● リソースの可視化
○ kpi-viewer
○ kibana
● 必要リソースの見積もり + リソースレポート作成
○ report-sakasho-web-kpi
キャパシティ管理
● リソースログの取得
○ 共通
■
■
■
○
■
○
■
●
●
● など
○ 内製 を各サーバに設置し収集したリソースログを に保存
リソースの取得方法1
● アクセスログの収集
○
■ 各 サーバ上で実行
● を収集
○
○
○
○
■
●
○ 物理実機
● で可視化
リソースの取得方法2
● 収集した 上のリソースログを可視化
● 内製ツール
○
○ 等
○ 範囲を特定して表示可能
○ 過去データが丸まらない
● に集めた の可視化
● を駆使して頑張っている
○ 単位の や実行回数の可視化
■ 性能劣化があればひと目で分かる
○ 単位の表示にも切り替え可能
DeNAオリジナル ゲーム専用プラットフォーム Sakashoについて
● の 回数はゲームによって異なる
○ なら 万 捌けても、 は一極集中型のため、 万が限界
○ ということもあり、リソース見積もりが難しい
○ 分間 万回のコールならば捌けるという視点で考える
● 単位の収容限界値は、ここまでで取得したデータから見積もり可能
○ ならば、 万 処理可能
● つまり、テストプレイで得られたデータ 目標 の負荷が乗った場合、耐え
られるか計算すればよい
● キャパシティの過不足判断を出来るコマンドを開発
基準日
目標
● 基準日に新規タイトルの負荷が上乗せされた場合のリソースをシミュレーション
● 経験上、 は の を超えることは非常に考えにくい
● すべてのユーザがテストプレイ通りにアクティブにプレイすることはあり得ない
○ 上限値と見做して問題なし
● 本スクリプトを に仕込み、日次で実行
○ を飛ばし、日々振り返り実施
○ 台数調整の指標
最近の課題
Sakashoチーム
チーム
○ だいたい8人くらい
■ ブラウザタイトル担当からアプリタイトル担当へ移行する際に
Sakashoの運用を経験することが多い
リリースサイクル
○ 2週間に一度のペースでリリース
○ 2週間でできることやる
Sakasho専任チーム
Sakashoチーム
リリースサイクル
● 要望確確認会: リリースに含める
フィーチャーを検討
● Sakasho定例: リリースに含める予
定のフィーチャーをチームにシェア
● QA Kickoff: リリースに予定の
フィーチャーをQAに伝え、リリース
するフィーチャーとリリース日を決
める
● リリース告知: ゲームデベロッパに
アナウンスする。
リリースサイクルを細かく
● 仕様書コンプリート
● 開発開始
● SDKのスケルトン提出
● フィーチャーコンプリート
● QA開始
● サインオフ(QA完了)
● リリース
● QA確認
● ゲームデベロッパにリリースした旨をア
ナウンス
● Sakasho定例: フェーズの振り返り
Sakashoチーム
その結果
Sakashoチーム
● 機能数の増大
○ 約50のAPI(メソッド単位だともっと、、)
● SDKのバージョンも増えている
○ 全部で45バージョンくらい
● 変にマイクロサービスぽくしていて開発効率が悪い
○ 共通化されているgemの管理
機能数の増大と複数バージョンのサポー
ト
品質の担保
デグレチェック
人の手でやることじゃない
SDKのテストと自動化
最近の取り組み
● google製のC++テスティングFW
○ https://github.com/google/googletest
○ ライブラリのインストールはいらず、ccファイルをテストコードと一緒
にビルドすればテストの実行ファイルができる
● Xcode(XCTest)と一緒に動かせる
● テスト結果を出力しやすいこと(JUnit形式)
● Native Sakasho SDKが対象
googletestの採用
最近の取り組み
SDK
✔テスト結果を
通知
テストを実行
Slackプラグインで通知も
GitHub pull request builder plugin
で結果を表示
PP
Junit XML
最近の取り組み
SDKのテスト(iOS)
DEMO(時間があれば)
最近の取り組み
SDKのテスト
● SWETチームとの共同作業
参照元 : https://career.dena.jp/job.phtml?job_code=476
まとめ
ゲーム開発を支えるプラットフォームSakasho
○ Sakashoがサーバー側の運用を一括で受け持つことで
各ゲームタイトルはゲーム開発に集中できる
Sakashoのサーバーサイドの開発はRubyを使っている
○ 大規模なアプリケーションの開発・運用に
必要な仕組みを整備しました
開発・運用の効率化を行っています
○ API
■ メモリキャッシュの利用
■ slow restartの対応
○ SDK
■ googletestを利用した結合テストの整備

More Related Content

PPTX
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
PPTX
DeNAの最新のマスタデータ管理システム Oyakata の全容
PPTX
DeNAのゲームを支えるプラットフォーム Sakasho #denatechcon
PPTX
え!?データがオンプレにあるけどPower BI で BI したいの?
PDF
DeNAのゲーム開発を支える Game Backend as a Service
PPTX
BuildKitによる高速でセキュアなイメージビルド
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
PPTX
FINAL FANTASY Record Keeperのマスターデータを支える技術
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAのゲームを支えるプラットフォーム Sakasho #denatechcon
え!?データがオンプレにあるけどPower BI で BI したいの?
DeNAのゲーム開発を支える Game Backend as a Service
BuildKitによる高速でセキュアなイメージビルド
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
FINAL FANTASY Record Keeperのマスターデータを支える技術

What's hot (20)

PDF
DockerとPodmanの比較
PDF
マイクロにしすぎた結果がこれだよ!
PDF
多様な働き⽅のチームでどうやって アジャイルにやるの?(雁行陣開発)
PPTX
Cesiumを動かしてみよう
PPTX
もしSIerのエンジニアがSRE本を読んだら
PPTX
Cloud Firestore を使って、Polling をやめたい話
PDF
開発速度が速い #とは(LayerX社内資料)
PDF
ソーシャルゲームのためのデータベース設計
PPTX
Docker Tokyo
PDF
Google Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps Online
PPTX
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
PPTX
Power BI + OneDrive の最も簡単でかつ最も効率的な使い方のひとつ
PPTX
WayOfNoTrouble.pptx
PDF
人生がときめくAPIテスト自動化 with Karate
PPTX
技術選択とアーキテクトの役割
PDF
初めての Spanner 移行
PDF
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
PDF
Elasticsearchを使うときの注意点 公開用スライド
PDF
クラウド環境下におけるAPIリトライ設計
PDF
他社製品と比較した際のAuth0のいいところ
DockerとPodmanの比較
マイクロにしすぎた結果がこれだよ!
多様な働き⽅のチームでどうやって アジャイルにやるの?(雁行陣開発)
Cesiumを動かしてみよう
もしSIerのエンジニアがSRE本を読んだら
Cloud Firestore を使って、Polling をやめたい話
開発速度が速い #とは(LayerX社内資料)
ソーシャルゲームのためのデータベース設計
Docker Tokyo
Google Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps Online
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
Power BI + OneDrive の最も簡単でかつ最も効率的な使い方のひとつ
WayOfNoTrouble.pptx
人生がときめくAPIテスト自動化 with Karate
技術選択とアーキテクトの役割
初めての Spanner 移行
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
Elasticsearchを使うときの注意点 公開用スライド
クラウド環境下におけるAPIリトライ設計
他社製品と比較した際のAuth0のいいところ
Ad

Viewers also liked (9)

PDF
DeNA流cocos2d xとの付き合い方
PDF
ガールアックス:リアルタイム通信処理の効率的な実装
PPT
制作を支えたツール達 (パズル戦隊デナレンジャー)
PDF
Game BaaS Implemented in Ruby
PDF
FFRKを支えるWebアプリケーションフレームワークの技術
PDF
FINAL FANTASY
 Record Keeper 演出データについて
PDF
DeNA の新しいネイティブ開発(パズル戦隊デナレンジャー)
PPTX
Unityで本格戦国シュミレーションRPG 開発
PDF
ガールアックス マルチプレイのリアルタイム通信ゲーム開発入門
DeNA流cocos2d xとの付き合い方
ガールアックス:リアルタイム通信処理の効率的な実装
制作を支えたツール達 (パズル戦隊デナレンジャー)
Game BaaS Implemented in Ruby
FFRKを支えるWebアプリケーションフレームワークの技術
FINAL FANTASY
 Record Keeper 演出データについて
DeNA の新しいネイティブ開発(パズル戦隊デナレンジャー)
Unityで本格戦国シュミレーションRPG 開発
ガールアックス マルチプレイのリアルタイム通信ゲーム開発入門
Ad

Similar to DeNAオリジナル ゲーム専用プラットフォーム Sakashoについて (20)

PPTX
DeNAのネイティブアプリにおけるサーバ開発の現在と未来
PPTX
Quiznowを支える技術 #yapcasia
PDF
マイクロサービスっぽい感じの話
PPTX
DeNAにおけるCorpTechエンジニアリング [DeNA TechCon 2019]
PDF
Unity開発で週イチ呑み会を支える技術
PDF
【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール
PPTX
レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる
PPTX
DeNAのサーバー"コード"レスアーキテクチャ
PDF
ゲーム業界から見たアジャイル開発
PDF
Fukuoka debianstudy02 / 福岡Debian勉強会 02
PDF
DeNAインフラの今とこれから - 今編 -
PDF
剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術
PDF
20130719 始めるdev ops
PPTX
AndApp開発における全て #denatechcon
PDF
『 イドラ ファンタシースターサーガ 』を支える GCP | Google Cloud INSIDE Games & Apps
PPTX
DeNA内製ゲームエンジンの現状と目指す未来 #denatechcon
PDF
Unix architecture
PPTX
iOSアプリ開発のCI環境 - Jenkins編 -
PPTX
その後のDeNAのネイティブアプリ開発 #denatechcon
PPTX
FINAL FANTASY Record Keeperを支えたGolang
DeNAのネイティブアプリにおけるサーバ開発の現在と未来
Quiznowを支える技術 #yapcasia
マイクロサービスっぽい感じの話
DeNAにおけるCorpTechエンジニアリング [DeNA TechCon 2019]
Unity開発で週イチ呑み会を支える技術
【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール
レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる
DeNAのサーバー"コード"レスアーキテクチャ
ゲーム業界から見たアジャイル開発
Fukuoka debianstudy02 / 福岡Debian勉強会 02
DeNAインフラの今とこれから - 今編 -
剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術
20130719 始めるdev ops
AndApp開発における全て #denatechcon
『 イドラ ファンタシースターサーガ 』を支える GCP | Google Cloud INSIDE Games & Apps
DeNA内製ゲームエンジンの現状と目指す未来 #denatechcon
Unix architecture
iOSアプリ開発のCI環境 - Jenkins編 -
その後のDeNAのネイティブアプリ開発 #denatechcon
FINAL FANTASY Record Keeperを支えたGolang

More from Makoto Haruyama (12)

PPTX
Rails on GKEで運用するWebアプリケーションの紹介
PDF
backbone.jsの使用例 その1
PDF
Fluentd in Co-Work
PDF
fluent-plugin-resque_stat
PDF
初心者エンジニアのシステム構築失敗談
KEY
初心者エンジニアの システム構築 失敗談
KEY
Mysql casual fukuoa_vlo_2
KEY
Yapc2012 ltthon
KEY
分散ファイルストレージ
KEY
Automation tech casual_talks_1_20120717
KEY
My sql casual_in_fukuoka_vol1
PPTX
20110622 haruyama webso]cket
Rails on GKEで運用するWebアプリケーションの紹介
backbone.jsの使用例 その1
Fluentd in Co-Work
fluent-plugin-resque_stat
初心者エンジニアのシステム構築失敗談
初心者エンジニアの システム構築 失敗談
Mysql casual fukuoa_vlo_2
Yapc2012 ltthon
分散ファイルストレージ
Automation tech casual_talks_1_20120717
My sql casual_in_fukuoka_vol1
20110622 haruyama webso]cket

DeNAオリジナル ゲーム専用プラットフォーム Sakashoについて