札幌RubyKaigi2012に行けませんでしたが、ビデオを見てみたのでメモ。
技評さんの写真付きのスペシャルレポートはこちら http://gihyo.jp/news/report/01/sapporo-rubykaigi2012
料理を支える技術 2012 @hotchpotch
http://www.ustream.tv/recorded/25395951
cookpadの大規模railsサービスをどうやってバージョンアップしたのか
まずやったこと
- 最初はローカルでバージョンアップ。rspec 流して地道にあげる。
- 自動HTMLエスケープ対応. Rails 2.x => 3.x になって erb の中のHTMLタグ<>が自動エスケープされるようになった
word-diff
- ケースもたくさんあるので、rspec 流すと HTML が出力されるように改造
- word-diff 機能をつかって必要なところだけチェック
- git diff --word-diff-regex='HTMLエスケープの文字列だけチェック'
パフォーマンス
- ab / JMeter でベンチマークとったらパフォーマンス落ちてた. 200% ほど
- プロファイリングとったがよくわらない。
- 毎回ネックとなる場所が変わる => GC?
- passenger -> unicorn に変更した。パフォーマンス変わらんかった。
- ただし Unicorn::OobGC という仕組みがある
- request が来ている間は GC 止めて、request 終わった直後に走らせる。unicorn に取り込んでもらった。
- これで改善
- 詳しくは WEB+DB Rails高速化みてね
最終確認。spec で発見できない問題をどう解決するか
- 問題をどう認識するか
- em-proxy リクエストを複製して、本番サーバと rails3 サーバ(readonly)両方にリクエストをなげて試してみた
最終の最終確認
- 一部ユーザに実際にリリースする
- Cookie: r3balance=xxx. xxxが特定値のユーザをRails3.0に流す。
- SessionStore シリアライズ形式の違い(2.x から 3.x に切り替えた瞬間のみ起こる)。MySQLへのおかしな master へのクエリ。JavaScript エラー
切り替え方法
- Rails2.xと同じ台数のRails3.xサーバ用意(AWS)
- リバプロの向き先を切り替えただけ
2012年変わった事
- Sara Framework を導入. @tikeda
- Twitter Bootstrap みたいなものの cookpad 版
- cookpad デザインの抽象化
- CSS(SaaS)の実装力
Android App
- Native から HTML5 へ移行
- Android アプリ開発のスキルがいらない
- Native の機能を使う場合、JS からブリッジ
- ザッカーバーグが HTML5 失敗と言っているが、そこまでリアルタイム性がいらないので大丈夫
fluentd
- Rails アプリケーションサーバでログ集約
- Softare Design にも書いているのでみてみてください
GitHub Enterprise
- コードレビューがはかどる
Distributed CI
- どうやって分散 rspec を安定させるか
- AWS EC2 を利用した自動縮退
- 9/16 @muraken の発表みてね
その他
- AWD
- Chanko
- kuroko
- IMon
メモまとめ
- em-proxy でリクエストコピーしてテストするとか、
- Cookieの値が特定のユーザのみバージョンアップしたサーバに流して1部ユーザのみで試すとか、勉強になった!
- あと、unicorn は GC のタイミングを操れるからいいね
分散rspec @muraken
rake stats
- Model 800 LOC
- Integration spec 17381 LOC
- Chanko spec 13030 LOC
- 遅い!
Chanko
- cookpad の開発は chanko 前提
- 詳しくは https://speakerdeck.com/u/mrkn/p/chanko
- ※よくわかんなかったのでぐぐった。ユーザ別に別画面を見せられるらしい。仮説検証に役立つ。
検証サイクルの短縮
- デプロイできるまでの待ち時間を短くしたい
- テストを早く流せないとすぐデプロイできない
計算
- 1日40回デプロイしようと思ったら、1ビルド何分で終われば大丈夫?
- ビルドが必ず成功するとする。労働8時間 => 1ビルド6分
そのためには
- master に push したものは、必ずビルドが成功してくれないとダメ。
- 開発者向けテスト環境でもフルテストが必要。多数の開発者が同時多発。
- そして高速に
分散 rspec
- Remote Spec 開発した
- それを使って分散CI
Remote Spec
- 1. rsync で application code をサーバに動機
- 2. MySQL などを準備
- 3. remote spec を実行
仕組み
- spec ファイル毎に実行時間を記録して、それを元にグループ分け
- ssh で入ってグループで実行
- spec の結果をパイプで集計
比較
- single spec. 待てなかったのではかってない
- paralell_tests を使って 8-core で。1時間以上
- remote spec で 5 workers, 6-core で。15分
課題
- 実行時間を調整して分散したつもりなのに、160sec のサーバー、460sec のサーバーなんかがあった
- 実行時のサーバーの condition しだいなんじゃないだろうか?
- 事前分配じゃ無理がある
Dynamic distribution
- Producer-Consumer Pattern 使え
- Queue にいれて、worker が1つずつ task をとっていく
- 遅い worker はより少ない task を実行することになる。
- task == spec file のパス
Dynamic distribution 実装した
- dRuby と Rinda::TupleSpace を使用
- worker 側で spec file のパスを取る毎に rspec 実行すると、プロセスロードがかかって遅い。
- まだできてない
どうやろうとしているか
- rspec のコードを読んだ。RSpec::Core::World オブジェクトを clear すればできそう
- 帰ったら実験してみます
メモまとめ
- 勉強になった!
- Dynamic でない分散rspecなら自分たちでもなんとかできそう!
- Dynamic なほうはちょっとまってみよう。MQサーバたてたりも必要になるのかな。
Inside Sqale's Backend by Gosuke Miyashita
Rubyの世界の継続的デリバリ by @hsbt
- http://www.ustream.tv/recorded/25442229
- https://speakerdeck.com/u/hsbt/p/20120916-sappororubykaigi2012
- Q. 途中からやるにはどうすれば?
- A. 最低限のトップページ、ログインぐらいのテストを作る。で、仕組みを作る。それから少しずつ追加していく。
DCI(Data, Context and Interaction) and the application builds our mental models by @kakutani
http://www.ustream.tv/recorded/25448633
MVCの問題
- MVCをやっていると、Model が太りすぎる
- どう整理したら良いか?の1つの案がDCI
DCI
- Data: Active Record
- Context: ユースケース (Activity)
- Interaction: Role (moduleで)
- ※よくわからんのでぐぐった http://www.artima.com/articles/dci_vision.html
- http://www.infoq.com/jp/news/2009/05/dci-coplien-reenskau
Rails MVC
- どう組み込む?
- Model を DCI に分ける
- Controller からユースケース毎に Context を作って
- Contextから Data を Role 毎に呼び出す
- @ITを書いてみた
感想
- ちょっとよくわかんなかんなかったので(特に Interaction)、後で勉強する