地味で地道なはてなブログ

ダイアリー「地味で地道な」から引っ越しました。

Webデベロッパの祭典@秋葉原【B-2】国内最大規模のRuby on Railsサイト「クックパッド」の裏側見せます。

2009.05.13 全内容反映完了

Webデベロッパの祭典@秋葉原
http://www.pasonatech.co.jp/10th/event/dev_fest/tokyo.jsp

B-2セッション
http://www.pasonatech.co.jp/event/index.jsp?no=1159

クックパッドCTO
橋本 健太氏

http://www.web-career.com/contents/buyuden/34.html

クックパッドとは?

クックパッドのミッション

「毎日の料理を楽しくすることで、心からの笑顔を増やす」
これだけのためにやっている。

http://cookpad.com/

1998年 open

・想い

「世界で一番生活の役に立つウェブサイト」

使い方

1)おいしいものができたとき

レシピを載せる

2)おいしいものを食べたいとき

レシピを探す

現在47万点以上のレシピがある

3)レシピをみて作った料理の写真をとってのせられる

作りましたフォトレポート「つくれぽ」
例:
http://cookpad.com/recipe/438908

クックパッドの規模

月間ユーザ数 547万人
#四国の人口が約400万人なのでそれを越えている

Railsサイトでは世界7位
http://rails100.pbworks.com/Alexa+Rankings

月間2.8億PV(世界3位)

リピーターが多い
1日のうちでも何回もみる

レシピ47万点
#日々増加中・・・

生活に密着しているのでトラフィックが特徴的

一日のうち16〜18時がピーク

年間では秋からバレンタインにかけてピーク
バレンタイン時期は通常の倍に達する

547万人を支える技術

メモがおっつかなかったので以下のエントリを参考にして補完した
http://www.sssg.org/blogs/naoya/archives/1126
http://d.hatena.ne.jp/h-nakao/20090201/1233458486

構成
  • ロードバランサ
  • APサーバ
    • 52台
  • DBサーバ(スレーブDB)
    • 18台
運用
  • デプロイ

Capistrano
http://www.capify.org/
#2009.02.25 Capistranoの開発終了アナウンスあり
#http://weblog.jamisbuck.org/2009/2/25/net-ssh-capistrano-and-saying-goodbye
#今は何使ってるんだろう

  • god

http://rails.takeda-soft.jp/blog/show/213
Mogrelの再起動
メモリがやたらたまりやすいため

  • 監視

nagios
http://www.nagios.org/

  • モニタリング

munin
http://sourceforge.net/projects/munin/

参考:
http://tech.lampetty.net/tech/index.php/archives/308

パフォーマンス

バレンタインで普段の倍トラフィックがあがる
まさに今(2009.02.07、バレンタインデーの約1週間前)

  1. キャッシュ
  2. クエリチューニング
  3. DB調査

Mongrel・・・無駄が出てしまう

1) キャッシュ・・・3種類

ページキャッシュ
NFS
APサーバ見ないでApacheから直接返す

キャッシュできないページ
フラグメントキャッシュ

Apache

APサーバ→memcached

memcached
http://www.danga.com/memcached/

キャッシュできないもの

  • ユーザ毎の表示
    ex.ユーザ名表示欄等
  • アクセスログ
  • 広告
    ものによってはランダム

→これらはAjaxでとってきてる

バラバラにやるとすごく重い
一回のリクエストでこの3種類を解決する

2) クエリチューニング

FiveRuns TuneUp

http://www.fiveruns.com/products/tuneup

http://jp.techcrunch.com/archives/20080529dont-debug-alone-with-fiveruns-tuneup/

開発モード

事項されたクエリ、レンダリングの結果をリアルタイム表示
インデックスの使われ方とか

スロークエリログ
throw query log

DBメモリ

リニューアル直後にサーバパフォーマンスを出せず、リソース調査を行った

→DBの持ち方の問題だった
ひとつのVM-複数のVM

VM内メモリ構成
Apache 2GB
AP 2GB
スレーブDB 8GB
検索DB 4GB
 
→検索DBをスレーブDBに統合

Apache 2GB
AP 2GB
スレーブDB 12GB

に変更

原因:メモリにのっかるデータの量が8GBを越えていた

これがのりきらなくなったらスレーブを16GBにする
さらに越えたらDBを分割する

OSのキャッシュにデータが全部のりきるかを常に考える

開発基盤

ノウハウを共有しやすいため

同上
rails.elを使う
http://tam.qmix.org/wiki/EmacsRailsMode.html

  • バージョン管理ツール

Subversion
http://subversion.tigris.org/
Trac

  • コードレビューシステム

Shinji-ko(宍道湖
http://code.google.com/p/shinjiko/
Mondrianのクローン

DBのレプレケーション

Ruby onRails・・・そのままだとDB:DBサーバが1:1
1個しかのっけらんない

解決のためのプラグイン
Acts As Readonlyable
http://railsify.com/plugins/33-acts-as-readonlyable

レシピの全文検索

Tritton(未来検索ブラジル)
MySQLの拡張
テーブルをJOINしやすい

MySQLの欠点・・・1回にひとつしかクエリにインデックスを使えない
→Trittonだと2つ使えるようになる
MySQL・・・全文検索インデックス
稼動中サーバに対してかけると大変なことになる
他のサーバでインデックスはってからコピったらちゃんと動く

ユーザ専用URLの解決の仕方

一部のユーザ・・・自分用のURIをもてる
Ruby on Railsで実装するのはちょっとやっかい
routes.rb
http://railspress.matake.jp/rails20%E3%81%AErouting%EF%BC%88configroutesrb%EF%BC%89%E3%81%AE%E8%A8%98%E8%BF%B0%E6%96%B9%E5%BC%8F%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81%E3%80%82

コントローラファイル名を検索していって、ヒットしなかったらユーザURIとみなす
Rails立ち上げて一回だけ探しにいくのでサーバの負荷もかからない

全ページプレビュー機能

x月x日x時〜x時の限定公開、といったようなコンテンツがある場合
その時間にほんとうに出すことができるかどうかをテスト
全てのページにおいて、任意の日付として表示できる
Rubyだから簡単にできた
Time.nowを上書きして実装
http://www.ruby-lang.org/ja/man/html/Time.html#Time.2enow

※もちろんアクセス制限あり

クックパッドのものづくり

4つのきまり

1)つくるものを決める
2)計画する
3)製造する
4)質を高める

→方法論を決めて実行する

1)つくるものを決める


 [1] ベストなことに集中する

  ベターなこと、やったほうがいいことはやらない

  ではどうやって「ベスト」をみつけるか?

  「三つの輪」がすべて重なるもののみを実行する

  (1) やりたいこと
    情熱をもって取り組めること

  (2) できること
    自分たちが世界一になれるか
  
  (3) やるべきこと
    事業として儲けを出せること
  
    これら3つすべてを満たすこと。

    1つないし2つだけの場合は「ベスト」ではないのでやらない。

 [2] ユーザの欲求に基づいたゴール設定

 「EOGS」(Emotion Oriented Goal Setting)に基づき、ワークシートを穴埋めしていく

  (1) キャスト(登場人物)をたて、それぞれの疑いなき欲求(Emotion)をみつける

  (2) これをやればすべてかなえられるというものをみつける

  (3) 何をすれば実現できるか

  (4) どうなれば成功(Goal)とみなせるか
  
  例:レシピを検索するとき
  
  キャスト
  
  検索するひと
  →はやく見つけたい
  
  レシピを作った人
  →自分がおいしいと思ったレシピを他の人にもみてほしい
  レシピをとっておきたい
  
  クックパッド自身
  →料理を楽しめるようにしたい
   もうけたい
   

2)計画する

スケジュールを決める時、「3分割の法則」を使う

  1. 設計
  2. 開発
  3. 質を高める

のそれぞれのフェーズに同じだけ時間をかける
ex.3週間でサービスインするとする
設計に1週間
開発に1週間
質の向上に1週間
 
1週間でできるように設計する
いらんものは削ってベストなことに集中
※設計フェーズ・・・調査、プロト作成も含む
きちんとそれぞれ3分の1づつとる

ものづくり三原則

1)無言実行(むげんじっこう)
2)無言語化
3)サービスに値段をつける

1)無言実行(むげんじっこう)

→サービスの公開やリニューアルを事前に告知しない

公開前にサービスについて説明しない。
公開していないものを説明しようとすると、往々にしてユーザに無用の誤解を与える
不要な不安をあたえることになる

リリースを告知するメリットはない

(#編者注:こういいきれるのはすごい。まったくその通り。
それはこの次の「無言語化」があるから成り立つことであって、「無言語化」がないと更なる混乱を生む)

2)無言語化

機能を言葉で説明しない

一瞬で機能を理解できなければユーザはBackボタンおしてどこかへいってしまう!
※一瞬=2秒が限界だそうな

ヘルプやFAQもなし

読まないと使えないのはダメ
 ユーザに負担がかかる
 そもそも読まないし。

3)サービスに値段をつける

どんなサービスでも、いくらに相当するか値段をつけてみる

「無料だから大丈夫」という考え方では負ける

無料だからという理由ではユーザは使わない

Web以外では、リアルの世界ではすべてのものに値段がついている

だからWeb上のものにも値段をつけてみる

「この機能はお金に換算すると500円だな」とか

クックパッドは10年前に始まったときは有料サイトだった

有料のWebサービスというのは早すぎた


→有料だと思って作りこんできたものだからこそ、よかったのだと思う

設計する

順番
最低限必要なものを考える


設計の順番・・・広い範囲から詳細へ
詳細から設計するとき、機能にとらわれがちだと目標からずれる
ちゃんと目標から設計する

設計
アジャイル宣言の一節より
包括的なドキュメントよりも動くソフトウェアを重視する

→しかし、ドキュメントがなくていいわけではない

→では、最低限要るものは?

  • 画面遷移
    シンプルであるほうがいい
  • ページ詳細
  • DB構造
    途中で変わるのはかまわない

(あと、規模が大きいならばサイトマップ

3)製造する

開発三原則

  1. Railsに乗る
  2. リファクタリング
  3. DRY

Railsに乗る
Railsから外れない

リファクタリング
→テスト駆動により

DRY
Do Not Repeat Yourself
→やりすぎるとよくない

YAGNI(You Aren’t Going to Need It) のバランスを意識する

4)質を高める

ユーザテスト

バグの発見
しかし、狙った価値を提供できるのが大事
でないと使ってもらえない

→ゴールを伝える
ex.「今日作るものを探して」
途中で質問がくる場合は

マーケティング

マーケティング
かつき*1
売り
ライバルに勝てる売り
 
クックパッド開発者ブログ
http://techlife.cookpad.com/

*1:いかん、このへんメモしきれてない