とあるアプリの開発運用(トラブルシュート)

83
© RailsDevCon 2010 2010/11/20

Transcript of とあるアプリの開発運用(トラブルシュート)

Page 1: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved.RailsDevCon 2010

2010/11/20

Page 2: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 2222

自己

紹介

Page 3: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 3333

株式会社ドリコム

ソーシャルゲーム開発デザイン部

大仲 能史

@onk

Page 4: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 4444

株式会社ドリコム

ソーシャルゲーム開発デザイン部

大仲 能史

@onk

ソーシャルゲームの企画と開発

Page 5: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 5555

ソーシャルゲームとは

Page 6: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 6666

ソーシャルゲームとは

SNS上にウェブブラウザ上で動作するAPI

などの動作環境(アプリケーション・プ

ラットフォーム)が提供され、これを基盤

として制作されたアプリケーションソフト

を、ソーシャルアプリケーション(Social

Application)と総称し、その中のゲーム

のことをソーシャルゲームと呼ぶ。

Wikipedia より

Page 7: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 7777

大規模SNS上の

ソーシャルアプリ開発

重要なポイントは?

Page 8: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 8888

•API利用

•人口爆発

•短納期

Page 9: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 9999

API利用

• ユーザはSNSにアクセス

• Gadgetサーバがユーザのリクエストを転送

• アプリケーションはAPIに問い合わせてHTML

を生成

Page 10: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 10101010

API利用

• 2-legged OAuth

– GadgetサーバからのRequestを検証

– こちらからのRequestに署名

• SNS内の機能を使うときもAPIを利用

– アプリの招待

– Activityの送信

– アプリからMessage送信

– 位置情報取得

– アプリからフォトアップロード

– SNS内のポイントでの決済サービス

– etc

Page 11: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 11111111

人口爆発

• mixi

2,190万人

• mbga

2,167万人

• gree

2,246万人

• hangame

3,432万人

• ixen

175万人

• ybga

100万人

Page 12: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 12121212

人口爆発

Page 13: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 13131313

短納期

2ヶ月でリリースは想定の範囲内

Page 14: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 14141414

短納期

毎月2回リリース必須

Page 15: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 15151515

どんな対策が必要?

Page 16: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 16161616

agenda

• API利用

– デバッグの勘所

• 人口爆発

– 負荷を想定する

– 正しくwebアプリを作る

• 短納期

– 何を犠牲にして何を得るか

– 超高速でPDCAサイクルを回す

Page 17: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 17171717

agenda(gem)

• net-http-spy

• masochism

• data_fabrick

• faker

• resque

• activerecord-import

• scribe

Page 18: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 18181818

ミドルウェア環境

• MySQL 5.1

• memcached 1.4.5

• Redis 1.2.6 (近々2.0.4に)

• TokyoTyrant 1.1.40

• Ruby 1.9.2-p0

• Rails 3.0.3

• unicorn 2.0.0

• nginx 0.7.67

Page 19: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 19191919

基本サーバ構成図

• 仮想化しています

– CPU Xeon L5520

(2.26GHz 8コア)

– メモリ 32GB

• webにCPUを多く割

り当て

• cacheとdbにメモリ

を多く割り当て

Page 20: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 20202020

agenda

• API利用

– デバッグの勘所

• 人口爆発

– 何を想定しなければいけないか

– 正しくwebアプリを作るということ

• 短納期

– 何を犠牲にして何を得るか

– 超高速でPDCAサイクルを回す

Page 21: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 21212121

たった一つの

大事なこと

Page 22: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 22222222

困ったら

request/response

を確認する

Page 23: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 23232323

あくまでフィクションです

• リリース1週間前に「課金APIがどうして

も通らない」とprintデバッグしつつ悩ん

でいる人が居るんですよ。フィクション

ですけど。

• 結論から言うと

request.path

を使っていたためにクエリパラメータが

消えてたんですが。

Page 24: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 24242424

request/responseを確認する

• 困ったらTCPレイヤまで降りてパケット

を見よう

• ライブラリのエラーメッセージから追う

よりもHTTPのステータスコードを見る

方が早い

– APIが本文にエラーメッセージを入れて返し

てくれている場合も多い

Page 25: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 25252525

位置情報を取得しようとしたら

• 住所を取得したつもりが

「東北自動車道」

というものが取れたりとか

• Placemarkが複数返ってきているので他

のPlacemarkの住所を使えばOK

Page 26: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 26262626

oauthのverifyが通らない

• 2-legged OAuth

– requestに署名を付けて送る仕組み

• 署名の検証が通らない

– requestを眺めて

– requestから組み立てたBaseStringを確認す

れば

– 違いに気づける

Page 27: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 27272727

知ってると便利な小技

• net-http-spy

– Net::HTTPにloggerを仕込む

irb > require "net-http-spy"irb > Hase.container.handler("john.doe").person

CONNECT: ["localhost", 8080]GET /social/rest/people/@me/@self?fields=id,name,displayName,thumbnailUrl,gender,dateOfBirth&xoauth_requestor_id=john.doe&oauth_consumer_key=http%3A%2F%2Flocalhost%3A8080%2Fsamplecontainer%2Fexamples%2FSocialHelloWorld.xml&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1290204829&oauth_nonce=ROb9UmacNPtJYnaPtE7C7n7yWU8TpMWfHDI4EbY0yY&oauth_version=1.0&oauth_signature=8Cl2X%2FVDiwVd6gglSZX0s9aWaa4%3DBODY: Net::HTTPOK

# => {"container_user_id"=>"john.doe", "nickname"=>"Johnny", "thumbnail_url"=>nil, "gender"=>1, "birthday"=>nil}

Page 28: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 28282828

知ってると便利な小技

• WEBrick::HTTPProxyServer

– Proxyを通せる環境なら便利

• tcpflow

– tcpdumpの保存しないバージョン

– webサーバに来るアクセスを覗き見したいと

きとか

Page 29: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 29292929

agenda

• API利用

– デバッグの勘所

• 人口爆発

– 負荷を想定する

– 正しくwebアプリを作る

• 短納期

– 何を犠牲にして何を得るか

– 超高速でPDCAサイクルを回す

Page 30: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 30303030

負荷を想定する

アクセス数

データ量

Page 31: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 31313131

アクセス数

巨大SNSだから

ソーシャルだから

スモールスタートさせてくれない

口コミや招待インセンティブの力は異常

リロードするたびにユーザが増加

いきなりオススメに載ったりも……

Page 32: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 32323232

アクセス数

リリース1週間で10万ユーザ突破

1ヶ月で30万ユーザも視野に

1ユーザ平均100クリック/Dayとして

10万ユーザで1,000万imp

Page 33: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 33333333

いきなり

1,000万imp

230 imp/sec

(ピーク時は平均の2倍)

Page 34: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 34343434

230 imp/sec

どれぐらいのサーバ台数が必要なのか

• web/ap

– 230 Throughput / sec

– レスポンスを1秒で返すなら230worker必要

– Railsが200MB弱使うので40GBのメモリが

必要

– メモリ8GBが5台

Page 35: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 35353535

230 imp/sec

• cache

– 5query/impとして1,150 QPS出ればOK

– メモリに載っているなら1台で十分

• db

– 10query/impとして2,300 QPS出ればOK

– それなりなマシンなら1台で十分かも?

– 足りないならmaster/slave分散必須

– 更新に耐えられないならpartitioningも必要

Page 36: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 36363636

データ量

1Clickで1レコード増加するアクション

– あしあと帳とか

– 課金ログとか

1秒1クリック=2,592,000クリック/月

1ヶ月で数千万レコード超に成長するDB

Page 37: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 37373737

データ量

• 捨てられないデータがあるとすぐに

数十GB突破

• メモリに載りきらない

Page 38: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 38383838

まずはDBをなんとかする

Page 39: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 39393939

メモリに載らないなら

メモリを増やせば

いいじゃない

Page 40: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 40404040

master/slave分散

• 更新系のクエリはmasterに、参照系のク

エリはslaveに行くよう分散する

Page 41: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 41414141

master/slave分散

• 代表的なgem

– acts_as_readonlyable

– multi_db

– masochizm

– db-charmer

– data_fabric

– octopus

Page 42: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 42424242

master/slave分散

• 実装はそこまで難しくない

• Rails 2.2でConnectionPoolingを導入

• initialize– ActiveRecord::Base.establish_connection

– @connection_poolsにconnectionを保存

• find_by_sql– ActiveRecord::ConnectionAdapters::ConnectionHandler#retrieve_connection

Page 43: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 43434343

Partitioning

• ゲームは更新系のクエリが多い

– 体力が減った

– 経験値が増えた

– 対戦してアイテムを奪った

• 参照系のクエリをslaveに逃がしても

更新系のクエリだけでmasterのDiskIOが

限界に達する

Page 44: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 44444444

垂直分割

• カテゴリごとに別のDBへ

Page 45: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 45454545

垂直分割

テーブル単位で別のDB

JOIN不能

Page 46: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 46464646

垂直分割

Modelから

has_many

has_one

belongs_to

が消滅

Page 47: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 47474747

RDBMSを

リレーショナルに使わない

Page 48: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 48484848

水平分割

• 複数のテーブルにデータを分散

Page 49: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 49494949

Replication+Partitioning=

Sharding

Page 50: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 50505050

Sharding

• 代表的なgem

– db-charmer

– data_fabric

– octopus

Page 51: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 51515151

MongoDBにすれば解決

Page 52: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 52525252

負荷テスト

以上のようなことが必要かどうかを把握

するために,またどのぐらい改善された

かを確認するために負荷テストは必須な

のです。

どこまで耐えられるのかを知っておくた

めに過負荷テストも必須なのです。

Page 53: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 53535353

負荷テスト

リリース前に

50万ユーザが3ヶ月

遊んだ想定のデータを作り

本番想定と同じアクセス負荷をかける

• テストデータ生成に便利なgem

– faker

Page 54: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 54545454

負荷テスト

• 何に注目する?

– ThroughPut

– DiskIO

– connection数

Page 55: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 55555555

ThroughPutの改善

Page 56: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 56565656

最速でユーザに

レスポンスを返す

Page 57: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 57575757

最速でレスポンスを返す

• 時間がかかる処理はレスポンスだけ返し

裏で重い処理を実行するという手法

– 画像/Flashの合成

– APIを叩く

– ポイント付与

– クエスト達成判定

– 農園の作物が育ったかどうか

Page 58: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 58585858

5秒制限

5秒以内にレスポンスを返せなかったら

アプリをメンテナンス状態にされる

Page 59: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 59595959

例えば

• 経営シミュレーションアプリで

TOPページ→マイページ

という遷移

• TOPページへのアクセスを検知して

非同期に売買処理をしながら

TOPページというレスポンスを返す

• マイページに行ったときには完売になっ

た品物の姿が!

Page 60: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 60606060

非同期処理

• ユーザのアクセスをトリガーとして動作

• レスポンスは最速で返して裏で処理する

• 代表的なgem

– resque

– delayed_job

Page 61: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 61616161

Resque

• 管理画面が秀逸

– キューの状況

– workerの状況

– 失敗したjobの把握や再実行

• Resque Scheduler

– バッチ処理もRailsで管理

• cronの管理から開放

– 毎回Railsの起動をしなくても良い

Page 62: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 62626262

その他の工夫

• BULK INSERT

– 複数レコードのINSERTを1回で行う

INSERT INTO `example_table` VALUES(1, 'aaa', 11),

(2, 'bbb', 22),

(3, 'ccc', 33),

(4, 'ddd', 44);

Page 63: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 63636363

BULK INSERT

• いつ使う?

– 友だち関係をDBに保存したい

– 友だち全員に通知を飛ばしたい

• 便利なgem

– activerecord-import

Page 64: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 64646464

正しくwebアプリを作る

手抜きかな?

と思いながら

作ったところは

必ず

ボトルネックになります

Page 65: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 65656565

例えば

• 1日の回復数の上限に達しているかどうか

を調べるのに履歴テーブルのcountを

取っているとか

–カウンターキャッシュを随所で使う

• ユーザ数×アイテム数だけレコードがで

きるとか

–間違いなく水平分割必須になる

– 1レコードにJSON化して入れてみる

• like 検索厳禁は当然

Page 66: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 66666666

ユーザ数数万程度を

想定しているコードは

全てNG

Page 67: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 67676767

正しくwebアプリを作る

• GAEでの制限の意味が分かってくる

– リクエスト処理時間30秒制限

–関連が存在しない

– 1,000件しか取れない

Page 68: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 68686868

正しくwebアプリを作る

• 巨大SNSから流れてくるユーザ数は

エンジニアの甘えを許してくれない

• 自らの技術的水準を飛躍的に向上させる

チャンス

Page 69: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 69696969

agenda

• API利用

– デバッグの勘所

• 人口爆発

– 負荷を想定する

– 正しくwebアプリを作る

• 短納期

– 何を犠牲にして何を得るか

– 超高速でPDCAサイクルを回す

Page 70: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 70707070

何を犠牲にして速度を得るか

• ドキュメントは最小限に

– Railsっぽい設計ならばER図を見れば中身が

分かる

– RESTっぽい設計ならばURLを見れば中身が

分かる

ER図とURL設計書以外のドキュメントは

(開発中は)管理しない

Page 71: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 71717171

何を犠牲にして速度を得るか

• ドキュメントは最小限に

Page 72: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 72727272

何を犠牲にして速度を得るか

• 迷う時間を最小限に

– Railsっぽいかどうかを考える

Do You Ride on Rails?

Page 73: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 73737373

超高速でPDCAサイクルを回す

• 売上=DAU*Daily ARPU*継続日数

• 注視KPI

– DAU

– ARPU/Day

–継続日数

– Install数

– バイラル率

Page 74: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 74747474

超高速でPDCAサイクルを回す

• Plan, Do, Check, Action

• Do, Actionは速度を上げるのが難しいの

でPとCを最速にすることを考える

Page 75: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 75757575

PDCAサイクルを超高速で回す

• Plan最速

–考えなくても施策が出てくる

–常に施策を考え続けられる環境を作る

• Check最速

– 何もしなくてもデータが手元に集まってくる

–常に施策の結果を閲覧できる環境を作る

Page 76: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 76767676

いつでも見られる環境を作る

Page 77: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 77777777

いつでも見られる環境を作る

Page 78: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 78787878

いつでも見られる環境を作る

• ログの集約・収集

• ログ?

– ユーザの行動を記録したもの

• ログインした

• ガチャを回した

• コメントした

• 友達にアイテムを渡した

Page 79: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 79797979

いつでも見られる環境を作る

• 1日3GB分のログが溜まっていく

• 数十サーバに分散されているので

集約や収集がとても面倒

• rsync?

• syslog-ng?

• scribe!

Page 80: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 80808080

scribe

• facebook++

• scribeサーバ間で勝手に転送してくれる

• エラー時の再送の面倒も見てくれたり

Page 81: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 81818181

scribe

• 転送量が心配になってきたので

MessagePackを使おうかなぁと

考えています

Page 82: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 82828282

まとめ

• APIには

– 送受信している内容の確認が鉄則

• 人口爆発には

– 負荷試験と監視大事

– データ量に耐えうる設計

– 正しく作ることを常に意識する

• 短納期には

– The Rails Way に任せる

– 動向把握を最速で行うことで意思決定速度UP

Page 83: とあるアプリの開発運用(トラブルシュート)

Copyright © DRECOM Co., Ltd All Rights Reserved. 83838383

ご清聴ありがとうございました