8. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
Sakashoとは
ネイティブアプリゲーム開発に
必要とされるサーバー機能を
提供するゲームプラットフォーム
ゲーム開発におけるサーバー機能を
Sakashoが一括で受け持つ
ことで開発?運用コストを削減
運用のしやすさも見据えたゲームの
作り方のルールもある程度強いる
8
9. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
ゲーム開発?運用に必要なAPIの提供
● ユーザー情報API
● マスターデータ配信API
● ログインボーナスAPI など
9
Sakashoが提供している機能
10. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
SDK
● 課金やPush通知など、OSに依存している機能について
簡単に使えるインターフェースの提供
● Unity、C++のゲームエンジンに対応
10
Sakashoが提供している機能
11. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
WebView用インターフェースの提供
● お知らせの配信
● 掲示板
● 利用規約など
11
Sakashoが提供している機能
12. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
ゲーム専用サーバーとの連携機能
● ゲーム専用サーバーからSakashoにアクセスできる
Web APIを提供
● ゲーム専用サーバーを介しての
ユーザー情報の取得などに対応
12
Sakashoが提供している機能
29. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
1. API サーバー : Sinatra + Sequel + Jbuilder
a. 省メモリ?ハイパフォーマンス
b. JSONしか返さない
2. 管理 ツール : Ruby on Rails
a. アクセス数は限られている
b. Web UIを簡単に作れる
c. 多少パフォーマンスが犠牲にしても、開発スピードを上げる
フレームワーク選定
29
Rubyを使った開発期
30. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
高速化
○ capistrano-bundle_rsync
○ デプロイサーバでアプリを git clone して bundle install したものを
rsyncするためのgem
daemontoolsとの連携
○ インフラチーム
http://d.hatena.ne.jp/limitusus/20131225/1387993119
http://blog.livedoor.jp/sonots/archives/40248661.html
Deploy
30
Rubyを使った開発期
31. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
ridgepole
https://github.com/winebarrel/ridgepole
● ファイルの内容を実際のスキーマとの差分があればそれを自動的に
検知し、DDLを発行してくれる
● 1テーブル1ファイルで表現
● shardingにも対応したスクリプトを用意
スキーマ管理
31
Rubyを使った開発期
32. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
Sakashoの共通ロジックをgemにする
○ API毎のリクエスト?レスポンスの共通処理の切り出し
○ モデルの共通化
DBのコネクション管理
○ APIではコネクション管理用の軽いラッパーを用意
■ コードの中で明示的にMaster or Slaveなのかを書く
○ 管理ツール(Rails)ではSwitchPointを使用
その他
32
Rubyを使った開発期
33. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
Rubyを使った
アプリケーションの運用期
34. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
パフォーマンス向上
○ picojson_ruby
監視
○ stackprof
○ rack-server_status
運用ツール
○ unicorn-timeout_backtracer
○ unicorn-configurator_from_env
○ unicorn-log_error_one_liner
運用時
34
Rubyを使ったアプリケーションの運用期
35. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
PicojsonRuby
○ rubyの標準ライブラリを使ってJSONをparseすると元のJSONの大き
さの約10倍くらいのメモリを消費する
○ Proxyサーバーで共通のkey valueを1つだけ追加したいだけ
○ C++でかかれたpicojsonをrubyから呼び出せるようにして、JSONの
操作をC++で行うようにした
パフォーマンス向上
35
Rubyを使ったアプリケーションの運用期
36. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
Stackprof
○ https://github.com/tmm1/stackprof
○ SakashoのAPIサーバーに下記のようなコードを仕込んでいる
Rubyのプロファイリング
36
Rubyを使ったアプリケーションの運用期
37. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
Rack::ServerStatus
○ workerの状況を返すエンドポイントを追加する
rackミドルウェア
○ workerが枯渇して大障害になった経緯から作成
枯渇するとアラートが飛んでくるようになっている
Workerの状態監視
37
2016-01-25 19:23:15.643716
[host名 sakasho.test.example] BusyWorkers: 3, IdleWorkers: 0
pid status remote_addr host method uri protocol ss
22286 A 127.0.0.1 sakasho.test.example GET /server-status?json HTTP/1.0 0
22289 A 127.0.0.1 sakasho.test.example POST /v1foo HTTP/1.0 0
22292 A 127.0.0.1 sakasho.test.example GET /v1/bar HTTP/1.0 0
Rubyを使ったアプリケーションの運用期
38. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
Unicorn::ConfiguratorFromEnv
○ Unicornのworker数を環境変数で設定できる
○ アプリケーションのコードを修正せずに
インフラチームだけで対応できる
require するだけでOK
worker数をすぐに調整できるようにする
38
Rubyを使ったアプリケーションの運用期
39. Copyright ? DeNA Co.,Ltd. All Rights Reserved.
Unicornがタイムアウトしたときの調査
Rubyを使ったアプリケーションの運用期
Unicorn::TimeoutBackTracer
○ Unicornのworkerがタイムアウトしたときに、プロセスをkillする前に、
gdbrubyを使用してバックトレースを取得する
○ requireするだけでOK
$ cat /tmp/test-timeout-16768.log
command:
gdb -silent -nw /sake/.rbenv/versions/2.1.3/bin/ruby 16603
environ:
ruby_version:
c_backtrace:
#0 0x00007ff11bd1c2f3 in select () from /lib64/libc.so.6
#1 0x00007ff11ceba8f6 in rb_fd_select (max=13, read=0x7fff469285f0, write=0x0, except=0x0, timeout=0x7fff46928340) at
thread.c:3336