札幌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

検証サイクルの短縮

  • デプロイできるまでの待ち時間を短くしたい
  • テストを早く流せないとすぐデプロイできない

計算

  • 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サーバたてたりも必要になるのかな。

Rubyの世界の継続的デリバリ by @hsbt

  • 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

Rails MVC

  • どう組み込む?
  • Model を DCI に分ける
  • Controller からユースケース毎に Context を作って
  • Contextから Data を Role 毎に呼び出す
  • @ITを書いてみた

感想

  • ちょっとよくわかんなかんなかったので(特に Interaction)、後で勉強する

Ruby; Exported @miyagawa

http://www.ustream.tv/recorded/25418815

One Size Does Not Fit All @matz

http://www.ustream.tv/recorded/25417206

クックパッドの作り方 by @ihara2525

クックパッドの組織づくりについて

http://www.ustream.tv/recorded/25395485