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

51,081 views
50,203 views

Published on

1 Comment
101 Likes
Statistics
Notes
No Downloads
Views
Total views
51,081
On SlideShare
0
From Embeds
0
Number of Embeds
11,987
Actions
Shares
0
Downloads
539
Comments
1
Likes
101
Embeds 0
No embeds

No notes for slide

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

  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 ご清聴ありがとうございました

×