Your SlideShare is downloading. ×
  • Like
とあるアプリの開発運用(トラブルシュート)
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

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

  • 44,340 views
Published

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
44,340
On SlideShare
0
From Embeds
0
Number of Embeds
6

Actions

Shares
Downloads
535
Comments
1
Likes
100

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Copyright © DRECOM Co., Ltd All Rights Reserved. RailsDevCon 2010 2010/11/20
  • 2. Copyright © DRECOM Co., Ltd All Rights Reserved. 2222 自己 紹介
  • 3. Copyright © DRECOM Co., Ltd All Rights Reserved. 3333 株式会社ドリコム ソーシャルゲーム開発デザイン部 大仲 能史 @onk
  • 4. Copyright © DRECOM Co., Ltd All Rights Reserved. 4444 株式会社ドリコム ソーシャルゲーム開発デザイン部 大仲 能史 @onk ソーシャルゲームの企画と開発
  • 5. Copyright © DRECOM Co., Ltd All Rights Reserved. 5555 ソーシャルゲームとは
  • 6. Copyright © DRECOM Co., Ltd All Rights Reserved. 6666 ソーシャルゲームとは SNS上にウェブブラウザ上で動作するAPI などの動作環境(アプリケーション・プ ラットフォーム)が提供され、これを基盤 として制作されたアプリケーションソフト を、ソーシャルアプリケーション(Social Application)と総称し、その中のゲーム のことをソーシャルゲームと呼ぶ。 Wikipedia より
  • 7. Copyright © DRECOM Co., Ltd All Rights Reserved. 7777 大規模SNS上の ソーシャルアプリ開発 重要なポイントは?
  • 8. Copyright © DRECOM Co., Ltd All Rights Reserved. 8888 •API利用 •人口爆発 •短納期
  • 9. Copyright © DRECOM Co., Ltd All Rights Reserved. 9999 API利用 • ユーザはSNSにアクセス • Gadgetサーバがユーザのリクエストを転送 • アプリケーションはAPIに問い合わせてHTML を生成
  • 10. Copyright © DRECOM Co., Ltd All Rights Reserved. 10101010 API利用 • 2-legged OAuth – GadgetサーバからのRequestを検証 – こちらからのRequestに署名 • SNS内の機能を使うときもAPIを利用 – アプリの招待 – Activityの送信 – アプリからMessage送信 – 位置情報取得 – アプリからフォトアップロード – SNS内のポイントでの決済サービス – etc
  • 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万人
  • 12. Copyright © DRECOM Co., Ltd All Rights Reserved. 12121212 人口爆発
  • 13. Copyright © DRECOM Co., Ltd All Rights Reserved. 13131313 短納期 2ヶ月でリリースは想定の範囲内
  • 14. Copyright © DRECOM Co., Ltd All Rights Reserved. 14141414 短納期 毎月2回リリース必須
  • 15. Copyright © DRECOM Co., Ltd All Rights Reserved. 15151515 どんな対策が必要?
  • 16. Copyright © DRECOM Co., Ltd All Rights Reserved. 16161616 agenda • API利用 – デバッグの勘所 • 人口爆発 – 負荷を想定する – 正しくwebアプリを作る • 短納期 – 何を犠牲にして何を得るか – 超高速でPDCAサイクルを回す
  • 17. Copyright © DRECOM Co., Ltd All Rights Reserved. 17171717 agenda(gem) • net-http-spy • masochism • data_fabrick • faker • resque • activerecord-import • scribe
  • 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
  • 19. Copyright © DRECOM Co., Ltd All Rights Reserved. 19191919 基本サーバ構成図 • 仮想化しています – CPU Xeon L5520 (2.26GHz 8コア) – メモリ 32GB • webにCPUを多く割 り当て • cacheとdbにメモリ を多く割り当て
  • 20. Copyright © DRECOM Co., Ltd All Rights Reserved. 20202020 agenda • API利用 – デバッグの勘所 • 人口爆発 – 何を想定しなければいけないか – 正しくwebアプリを作るということ • 短納期 – 何を犠牲にして何を得るか – 超高速でPDCAサイクルを回す
  • 21. Copyright © DRECOM Co., Ltd All Rights Reserved. 21212121 たった一つの 大事なこと
  • 22. Copyright © DRECOM Co., Ltd All Rights Reserved. 22222222 困ったら request/response を確認する
  • 23. Copyright © DRECOM Co., Ltd All Rights Reserved. 23232323 あくまでフィクションです • リリース1週間前に「課金APIがどうして も通らない」とprintデバッグしつつ悩ん でいる人が居るんですよ。フィクション ですけど。 • 結論から言うと request.path を使っていたためにクエリパラメータが 消えてたんですが。
  • 24. Copyright © DRECOM Co., Ltd All Rights Reserved. 24242424 request/responseを確認する • 困ったらTCPレイヤまで降りてパケット を見よう • ライブラリのエラーメッセージから追う よりもHTTPのステータスコードを見る 方が早い – APIが本文にエラーメッセージを入れて返し てくれている場合も多い
  • 25. Copyright © DRECOM Co., Ltd All Rights Reserved. 25252525 位置情報を取得しようとしたら • 住所を取得したつもりが 「東北自動車道」 というものが取れたりとか • Placemarkが複数返ってきているので他 のPlacemarkの住所を使えばOK
  • 26. Copyright © DRECOM Co., Ltd All Rights Reserved. 26262626 oauthのverifyが通らない • 2-legged OAuth – requestに署名を付けて送る仕組み • 署名の検証が通らない – requestを眺めて – requestから組み立てたBaseStringを確認す れば – 違いに気づける
  • 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,thumbnai lUrl,gender,dateOfBirth&xoauth_requestor_id=john.doe&oauth_consumer_k ey=http%3A%2F%2Flocalhost%3A8080%2Fsamplecontainer%2Fexamples%2FSocia lHelloWorld.xml&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1290 204829&oauth_nonce=ROb9UmacNPtJYnaPtE7C7n7yWU8TpMWfHDI4EbY0yY&oauth_v ersion=1.0&oauth_signature=8Cl2X%2FVDiwVd6gglSZX0s9aWaa4%3D BODY: Net::HTTPOK # => {"container_user_id"=>"john.doe", "nickname"=>"Johnny", "thumbnail_url"=>nil, "gender"=>1, "birthday"=>nil}
  • 28. Copyright © DRECOM Co., Ltd All Rights Reserved. 28282828 知ってると便利な小技 • WEBrick::HTTPProxyServer – Proxyを通せる環境なら便利 • tcpflow – tcpdumpの保存しないバージョン – webサーバに来るアクセスを覗き見したいと きとか
  • 29. Copyright © DRECOM Co., Ltd All Rights Reserved. 29292929 agenda • API利用 – デバッグの勘所 • 人口爆発 – 負荷を想定する – 正しくwebアプリを作る • 短納期 – 何を犠牲にして何を得るか – 超高速でPDCAサイクルを回す
  • 30. Copyright © DRECOM Co., Ltd All Rights Reserved. 30303030 負荷を想定する アクセス数 データ量
  • 31. Copyright © DRECOM Co., Ltd All Rights Reserved. 31313131 アクセス数 巨大SNSだから ソーシャルだから スモールスタートさせてくれない 口コミや招待インセンティブの力は異常 リロードするたびにユーザが増加 いきなりオススメに載ったりも……
  • 32. Copyright © DRECOM Co., Ltd All Rights Reserved. 32323232 アクセス数 リリース1週間で10万ユーザ突破 1ヶ月で30万ユーザも視野に 1ユーザ平均100クリック/Dayとして 10万ユーザで1,000万imp
  • 33. Copyright © DRECOM Co., Ltd All Rights Reserved. 33333333 いきなり 1,000万imp = 230 imp/sec (ピーク時は平均の2倍)
  • 34. Copyright © DRECOM Co., Ltd All Rights Reserved. 34343434 230 imp/sec どれぐらいのサーバ台数が必要なのか • web/ap – 230 Throughput / sec – レスポンスを1秒で返すなら230worker必要 – Railsが200MB弱使うので40GBのメモリが 必要 – メモリ8GBが5台
  • 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も必要
  • 36. Copyright © DRECOM Co., Ltd All Rights Reserved. 36363636 データ量 1Clickで1レコード増加するアクション – あしあと帳とか – 課金ログとか 1秒1クリック=2,592,000クリック/月 1ヶ月で数千万レコード超に成長するDB
  • 37. Copyright © DRECOM Co., Ltd All Rights Reserved. 37373737 データ量 • 捨てられないデータがあるとすぐに 数十GB突破 • メモリに載りきらない
  • 38. Copyright © DRECOM Co., Ltd All Rights Reserved. 38383838 まずはDBをなんとかする
  • 39. Copyright © DRECOM Co., Ltd All Rights Reserved. 39393939 メモリに載らないなら メモリを増やせば いいじゃない
  • 40. Copyright © DRECOM Co., Ltd All Rights Reserved. 40404040 master/slave分散 • 更新系のクエリはmasterに、参照系のク エリはslaveに行くよう分散する
  • 41. Copyright © DRECOM Co., Ltd All Rights Reserved. 41414141 master/slave分散 • 代表的なgem – acts_as_readonlyable – multi_db – masochizm – db-charmer – data_fabric – octopus
  • 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::Connec tionHandler#retrieve_connection
  • 43. Copyright © DRECOM Co., Ltd All Rights Reserved. 43434343 Partitioning • ゲームは更新系のクエリが多い – 体力が減った – 経験値が増えた – 対戦してアイテムを奪った • 参照系のクエリをslaveに逃がしても 更新系のクエリだけでmasterのDiskIOが 限界に達する
  • 44. Copyright © DRECOM Co., Ltd All Rights Reserved. 44444444 垂直分割 • カテゴリごとに別のDBへ
  • 45. Copyright © DRECOM Co., Ltd All Rights Reserved. 45454545 垂直分割 テーブル単位で別のDB JOIN不能
  • 46. Copyright © DRECOM Co., Ltd All Rights Reserved. 46464646 垂直分割 Modelから has_many has_one belongs_to が消滅
  • 47. Copyright © DRECOM Co., Ltd All Rights Reserved. 47474747 RDBMSを リレーショナルに使わない
  • 48. Copyright © DRECOM Co., Ltd All Rights Reserved. 48484848 水平分割 • 複数のテーブルにデータを分散
  • 49. Copyright © DRECOM Co., Ltd All Rights Reserved. 49494949 Replication+Partitioning= Sharding
  • 50. Copyright © DRECOM Co., Ltd All Rights Reserved. 50505050 Sharding • 代表的なgem – db-charmer – data_fabric – octopus
  • 51. Copyright © DRECOM Co., Ltd All Rights Reserved. 51515151 MongoDBにすれば解決
  • 52. Copyright © DRECOM Co., Ltd All Rights Reserved. 52525252 負荷テスト 以上のようなことが必要かどうかを把握 するために,またどのぐらい改善された かを確認するために負荷テストは必須な のです。 どこまで耐えられるのかを知っておくた めに過負荷テストも必須なのです。
  • 53. Copyright © DRECOM Co., Ltd All Rights Reserved. 53535353 負荷テスト リリース前に 50万ユーザが3ヶ月 遊んだ想定のデータを作り 本番想定と同じアクセス負荷をかける • テストデータ生成に便利なgem – faker
  • 54. Copyright © DRECOM Co., Ltd All Rights Reserved. 54545454 負荷テスト • 何に注目する? – ThroughPut – DiskIO – connection数
  • 55. Copyright © DRECOM Co., Ltd All Rights Reserved. 55555555 ThroughPutの改善
  • 56. Copyright © DRECOM Co., Ltd All Rights Reserved. 56565656 最速でユーザに レスポンスを返す
  • 57. Copyright © DRECOM Co., Ltd All Rights Reserved. 57575757 最速でレスポンスを返す • 時間がかかる処理はレスポンスだけ返し 裏で重い処理を実行するという手法 – 画像/Flashの合成 – APIを叩く – ポイント付与 – クエスト達成判定 – 農園の作物が育ったかどうか
  • 58. Copyright © DRECOM Co., Ltd All Rights Reserved. 58585858 5秒制限 5秒以内にレスポンスを返せなかったら アプリをメンテナンス状態にされる
  • 59. Copyright © DRECOM Co., Ltd All Rights Reserved. 59595959 例えば • 経営シミュレーションアプリで TOPページ→マイページ という遷移 • TOPページへのアクセスを検知して 非同期に売買処理をしながら TOPページというレスポンスを返す • マイページに行ったときには完売になっ た品物の姿が!
  • 60. Copyright © DRECOM Co., Ltd All Rights Reserved. 60606060 非同期処理 • ユーザのアクセスをトリガーとして動作 • レスポンスは最速で返して裏で処理する • 代表的なgem – resque – delayed_job
  • 61. Copyright © DRECOM Co., Ltd All Rights Reserved. 61616161 Resque • 管理画面が秀逸 – キューの状況 – workerの状況 – 失敗したjobの把握や再実行 • Resque Scheduler – バッチ処理もRailsで管理 • cronの管理から開放 – 毎回Railsの起動をしなくても良い
  • 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);
  • 63. Copyright © DRECOM Co., Ltd All Rights Reserved. 63636363 BULK INSERT • いつ使う? – 友だち関係をDBに保存したい – 友だち全員に通知を飛ばしたい • 便利なgem – activerecord-import
  • 64. Copyright © DRECOM Co., Ltd All Rights Reserved. 64646464 正しくwebアプリを作る 手抜きかな? と思いながら 作ったところは 必ず ボトルネックになります
  • 65. Copyright © DRECOM Co., Ltd All Rights Reserved. 65656565 例えば • 1日の回復数の上限に達しているかどうか を調べるのに履歴テーブルのcountを 取っているとか – カウンターキャッシュを随所で使う • ユーザ数×アイテム数だけレコードがで きるとか – 間違いなく水平分割必須になる – 1レコードにJSON化して入れてみる • like 検索厳禁は当然
  • 66. Copyright © DRECOM Co., Ltd All Rights Reserved. 66666666 ユーザ数数万程度を 想定しているコードは 全てNG
  • 67. Copyright © DRECOM Co., Ltd All Rights Reserved. 67676767 正しくwebアプリを作る • GAEでの制限の意味が分かってくる – リクエスト処理時間30秒制限 – 関連が存在しない – 1,000件しか取れない
  • 68. Copyright © DRECOM Co., Ltd All Rights Reserved. 68686868 正しくwebアプリを作る • 巨大SNSから流れてくるユーザ数は エンジニアの甘えを許してくれない • 自らの技術的水準を飛躍的に向上させる チャンス
  • 69. Copyright © DRECOM Co., Ltd All Rights Reserved. 69696969 agenda • API利用 – デバッグの勘所 • 人口爆発 – 負荷を想定する – 正しくwebアプリを作る • 短納期 – 何を犠牲にして何を得るか – 超高速でPDCAサイクルを回す
  • 70. Copyright © DRECOM Co., Ltd All Rights Reserved. 70707070 何を犠牲にして速度を得るか • ドキュメントは最小限に – Railsっぽい設計ならばER図を見れば中身が 分かる – RESTっぽい設計ならばURLを見れば中身が 分かる ER図とURL設計書以外のドキュメントは (開発中は)管理しない
  • 71. Copyright © DRECOM Co., Ltd All Rights Reserved. 71717171 何を犠牲にして速度を得るか • ドキュメントは最小限に
  • 72. Copyright © DRECOM Co., Ltd All Rights Reserved. 72727272 何を犠牲にして速度を得るか • 迷う時間を最小限に – Railsっぽいかどうかを考える Do You Ride on Rails?
  • 73. Copyright © DRECOM Co., Ltd All Rights Reserved. 73737373 超高速でPDCAサイクルを回す • 売上=DAU*Daily ARPU*継続日数 • 注視KPI – DAU – ARPU/Day – 継続日数 – Install数 – バイラル率
  • 74. Copyright © DRECOM Co., Ltd All Rights Reserved. 74747474 超高速でPDCAサイクルを回す • Plan, Do, Check, Action • Do, Actionは速度を上げるのが難しいの でPとCを最速にすることを考える
  • 75. Copyright © DRECOM Co., Ltd All Rights Reserved. 75757575 PDCAサイクルを超高速で回す • Plan最速 – 考えなくても施策が出てくる – 常に施策を考え続けられる環境を作る • Check最速 – 何もしなくてもデータが手元に集まってくる – 常に施策の結果を閲覧できる環境を作る
  • 76. Copyright © DRECOM Co., Ltd All Rights Reserved. 76767676 いつでも見られる環境を作る
  • 77. Copyright © DRECOM Co., Ltd All Rights Reserved. 77777777 いつでも見られる環境を作る
  • 78. Copyright © DRECOM Co., Ltd All Rights Reserved. 78787878 いつでも見られる環境を作る • ログの集約・収集 • ログ? – ユーザの行動を記録したもの • ログインした • ガチャを回した • コメントした • 友達にアイテムを渡した
  • 79. Copyright © DRECOM Co., Ltd All Rights Reserved. 79797979 いつでも見られる環境を作る • 1日3GB分のログが溜まっていく • 数十サーバに分散されているので 集約や収集がとても面倒 • rsync? • syslog-ng? • scribe!
  • 80. Copyright © DRECOM Co., Ltd All Rights Reserved. 80808080 scribe • facebook++ • scribeサーバ間で勝手に転送してくれる • エラー時の再送の面倒も見てくれたり
  • 81. Copyright © DRECOM Co., Ltd All Rights Reserved. 81818181 scribe • 転送量が心配になってきたので MessagePackを使おうかなぁと 考えています
  • 82. Copyright © DRECOM Co., Ltd All Rights Reserved. 82828282 まとめ • APIには – 送受信している内容の確認が鉄則 • 人口爆発には – 負荷試験と監視大事 – データ量に耐えうる設計 – 正しく作ることを常に意識する • 短納期には – The Rails Way に任せる – 動向把握を最速で行うことで意思決定速度UP
  • 83. Copyright © DRECOM Co., Ltd All Rights Reserved. 83838383 ご清聴ありがとうございました