ruby を利用した大規模ウェブサービスの開発・運用

120
Ruby を利用した 大規模ウェブサービスの 開発・運用 Large-scale web service and operations with Ruby cookpad id:secondlife / @hotchpotch 2011719日火曜日

Upload: yuichi-tateno

Post on 27-May-2015

24.051 views

Category:

Technology


0 download

DESCRIPTION

クックパッドでの、Ruby を利用した大規模ウェブサービスの開発・運用方法の説明

TRANSCRIPT

Page 1: Ruby を利用した大規模ウェブサービスの開発・運用

Ruby を利用した大規模ウェブサービスの

開発・運用Large-scale web service

and operations with Ruby

cookpadid:secondlife / @hotchpotch

2011年7月19日火曜日

Page 2: Ruby を利用した大規模ウェブサービスの開発・運用

提供

2011年7月19日火曜日

Page 3: Ruby を利用した大規模ウェブサービスの開発・運用

私とRuby会議

I andRubyKaigi

2011年7月19日火曜日

Page 4: Ruby を利用した大規模ウェブサービスの開発・運用

日本Rubyカンファレンス2006

2011年7月19日火曜日

Page 5: Ruby を利用した大規模ウェブサービスの開発・運用

日本Rubyカンファレンス2006

Perl の会社で使われるRuby の利用法とは!?

2011年7月19日火曜日

Page 6: Ruby を利用した大規模ウェブサービスの開発・運用

RubyKaigi 2007

2011年7月19日火曜日

Page 7: Ruby を利用した大規模ウェブサービスの開発・運用

RubyKaigi 2007

モテるRuby!

2011年7月19日火曜日

Page 8: Ruby を利用した大規模ウェブサービスの開発・運用

RubyKaigi 2011

Ruby を利用した大規模ウェブサービスの

開発・運用Large-scale web service

and operations with Ruby

2011年7月19日火曜日

Page 9: Ruby を利用した大規模ウェブサービスの開発・運用

RubyKaigi 2011

Ruby を利用した大規模ウェブサービスの

開発・運用Large-scale web service

and operations with Ruby

2011年7月19日火曜日

Page 10: Ruby を利用した大規模ウェブサービスの開発・運用

RubyKaigi 2011

Ruby を利用した大規模ウェブサービスの

開発・運用Large-scale web service

and operations with Ruby

イマココ!now

2011年7月19日火曜日

Page 11: Ruby を利用した大規模ウェブサービスの開発・運用

RubyKaigi 2011

Ruby を利用した大規模ウェブサービスの

開発・運用Large-scale web service

and operations with Ruby

イマココ!now

2011年7月19日火曜日

Page 12: Ruby を利用した大規模ウェブサービスの開発・運用

•id:secondlife•@hotchpotch•舘野祐一 / Yuichi Tateno•Shibuya.js 発起人•Asakusa.rb 所属•Ruby, Vim, Git

2011年7月19日火曜日

Page 13: Ruby を利用した大規模ウェブサービスの開発・運用

2011年7月19日火曜日

Page 14: Ruby を利用した大規模ウェブサービスの開発・運用

ミッションMission

2011年7月19日火曜日

Page 15: Ruby を利用した大規模ウェブサービスの開発・運用

2011年7月19日火曜日

Page 16: Ruby を利用した大規模ウェブサービスの開発・運用

毎日の料理を楽しみにすることで

2011年7月19日火曜日

Page 17: Ruby を利用した大規模ウェブサービスの開発・運用

毎日の料理を楽しみにすることで心からの笑顔を増やす

2011年7月19日火曜日

Page 18: Ruby を利用した大規模ウェブサービスの開発・運用

毎日の料理を楽しみにすることで心からの笑顔を増やす

Bringing smiles to everyone by making every day cooking more

enjoyable.

2011年7月19日火曜日

Page 19: Ruby を利用した大規模ウェブサービスの開発・運用

サービス紹介What is

COOKPAD?

2011年7月19日火曜日

Page 20: Ruby を利用した大規模ウェブサービスの開発・運用

COOKPAD

2011年7月19日火曜日

Page 21: Ruby を利用した大規模ウェブサービスの開発・運用

COOKPAD12,300,000 UU (pc only)

1+ million Recipes

Used by 1 in 2 women in their 30s

2011年7月19日火曜日

Page 22: Ruby を利用した大規模ウェブサービスの開発・運用

MOBAREPIモバれぴ

2011年7月19日火曜日

Page 23: Ruby を利用した大規模ウェブサービスの開発・運用

MOBAREPIモバれぴ

フィーチャーフォンfor mobile

2011年7月19日火曜日

Page 24: Ruby を利用した大規模ウェブサービスの開発・運用

Smartphone App

iPhone Android2011年7月19日火曜日

Page 25: Ruby を利用した大規模ウェブサービスの開発・運用

Smartphone App

iPhone Android

(iPhone App only)

2.5+ Million Downloads

2011年7月19日火曜日

Page 26: Ruby を利用した大規模ウェブサービスの開発・運用

TABEMIRUたべみる

2011年7月19日火曜日

Page 27: Ruby を利用した大規模ウェブサービスの開発・運用

Technology

2011年7月19日火曜日

Page 28: Ruby を利用した大規模ウェブサービスの開発・運用

Ruby 1.8.7

Rails 2.32011年7月19日火曜日

Page 29: Ruby を利用した大規模ウェブサービスの開発・運用

EC2

Architecture

lvs

proxy

lvs

app

task

EC2/EMR

Akamailvs

db

log

cache

S3

Image(EC2)

searcher

AWS

2011年7月19日火曜日

Page 30: Ruby を利用した大規模ウェブサービスの開発・運用

定石な構成Architecture based on best practices

http://www.flickr.com/photos/chadmiller/7270219/2011年7月19日火曜日

Page 31: Ruby を利用した大規模ウェブサービスの開発・運用

EC2

App / DB

lvs

proxy

lvs

task

EC2/EMR

Akamailvs

log

cache

S3

Image(EC2)

searcher

AWS

app

db2011年7月19日火曜日

Page 32: Ruby を利用した大規模ウェブサービスの開発・運用

EC2

App / DB

lvs

proxy

lvs

task

EC2/EMR

Akamailvs

log

cache

S3

Image(EC2)

searcher

AWS

app

db

•Ruby 1.8.7•Rails 2.3•haml / sass / jQuery•Passenger 2.2•MySQL 5.0•memcached

2011年7月19日火曜日

Page 33: Ruby を利用した大規模ウェブサービスの開発・運用

EC2lvs

proxy

lvs

task

EC2/EMR

Akamailvs

log

S3

Image(EC2)

searcher

AWS

app

db

cache

Cache

2011年7月19日火曜日

Page 34: Ruby を利用した大規模ウェブサービスの開発・運用

Cache

2.1.52011年7月19日火曜日

Page 35: Ruby を利用した大規模ウェブサービスの開発・運用

Cache

2.1.5About

30ms2011年7月19日火曜日

Page 36: Ruby を利用した大規模ウェブサービスの開発・運用

EC2

Image

lvs

proxy

lvs

task

EC2/EMR

Akamailvs

log

S3

searcher

AWS

app

db

cacheImage(EC2)

2011年7月19日火曜日

Page 37: Ruby を利用した大規模ウェブサービスの開発・運用

http://www.flickr.com/photos/h4ck/3031427985/2011年7月19日火曜日

Page 38: Ruby を利用した大規模ウェブサービスの開発・運用

Image Server

Tofuhttp://www.flickr.com/photos/h4ck/3031427985/

2011年7月19日火曜日

Page 39: Ruby を利用した大規模ウェブサービスの開発・運用

http://www.flickr.com/photos/h4ck/3031427985/

Tofu•Upload Server on EC2•Rails 3 -> S3•Delivery Server on EC2•Apache 2.2•mod_tofu (image magick)•+ CDN (akamai)

2011年7月19日火曜日

Page 42: Ruby を利用した大規模ウェブサービスの開発・運用

http://www.flickr.com/photos/h4ck/3031427985/

‘100x100c40_198_137_104_300’

‘100’

‘100x100’

‘100x100c’

2011年7月19日火曜日

Page 43: Ruby を利用した大規模ウェブサービスの開発・運用

EC2

Searcher

lvs

proxy

lvs

task

EC2/EMR

Akamailvs

log

S3

AWS

app

db

cacheImage(EC2)

searcher

2011年7月19日火曜日

Page 44: Ruby を利用した大規模ウェブサービスの開発・運用

Search

検索2011年7月19日火曜日

Page 45: Ruby を利用した大規模ウェブサービスの開発・運用

2011年7月19日火曜日

Page 46: Ruby を利用した大規模ウェブサービスの開発・運用

MySQL+Tritonn

Solr2011年7月19日火曜日

Page 47: Ruby を利用した大規模ウェブサービスの開発・運用

柔軟な検索Easily customizable

search

2011年7月19日火曜日

Page 48: Ruby を利用した大規模ウェブサービスの開発・運用

•Facet (like group by)•集合を扱う•Boost Search •重みづけ検索•Dynamicfields •動的なフィールド追加

2011年7月19日火曜日

Page 49: Ruby を利用した大規模ウェブサービスの開発・運用

Log Analytics

lvs

proxy

lvs

Akamailvs

AWS

app

db

cacheImage(EC2)

searcher

task

log EC2

S3

EC2/EMR

2011年7月19日火曜日

Page 50: Ruby を利用した大規模ウェブサービスの開発・運用

•TABEMIRU (たべみる)•EC2 + hadoop•Other•Elastic MapReduce (AWS)•Mapper/Reducer•Ruby

Log Analytics

2011年7月19日火曜日

Page 51: Ruby を利用した大規模ウェブサービスの開発・運用

速度speed

2011年7月19日火曜日

Page 52: Ruby を利用した大規模ウェブサービスの開発・運用

速度speed

slow?

2011年7月19日火曜日

Page 53: Ruby を利用した大規模ウェブサービスの開発・運用

速度speedNo!

2011年7月19日火曜日

Page 54: Ruby を利用した大規模ウェブサービスの開発・運用

速度speed

> 200ms2011年7月19日火曜日

Page 55: Ruby を利用した大規模ウェブサービスの開発・運用

定石をきちんとArchitecture based on best practices

http://www.flickr.com/photos/chadmiller/7270219/2011年7月19日火曜日

Page 56: Ruby を利用した大規模ウェブサービスの開発・運用

“GOOD はやらない”“Best のみ集中”

“Good enough” is not good enough.Always focus on what is best

2011年7月19日火曜日

Page 57: Ruby を利用した大規模ウェブサービスの開発・運用

シンプルさを保つKeep It Simple

Stupid

2011年7月19日火曜日

Page 58: Ruby を利用した大規模ウェブサービスの開発・運用

シンプルさを保つ

•本当に必要な機能のみに絞る• Only add absolutely necessary features

•無駄に複雑なことをやらない• Avoid complexity

2011年7月19日火曜日

Page 59: Ruby を利用した大規模ウェブサービスの開発・運用

シンプルさを保つ

•キャッシュにのりやすく• Design for caching

•シンプルなクエリ• Avoid complex SQL queries

2011年7月19日火曜日

Page 60: Ruby を利用した大規模ウェブサービスの開発・運用

あとでやるAsync Loading

2011年7月19日火曜日

Page 61: Ruby を利用した大規模ウェブサービスの開発・運用

非同期処理

2011年7月19日火曜日

Page 62: Ruby を利用した大規模ウェブサービスの開発・運用

非同期処理

2011年7月19日火曜日

Page 63: Ruby を利用した大規模ウェブサービスの開発・運用

非同期処理

2011年7月19日火曜日

Page 64: Ruby を利用した大規模ウェブサービスの開発・運用

非同期処理

2011年7月19日火曜日

Page 65: Ruby を利用した大規模ウェブサービスの開発・運用

速度speednot slow

2011年7月19日火曜日

Page 66: Ruby を利用した大規模ウェブサービスの開発・運用

【PR】

2011年7月19日火曜日

Page 67: Ruby を利用した大規模ウェブサービスの開発・運用

Development

2011年7月19日火曜日

Page 68: Ruby を利用した大規模ウェブサービスの開発・運用

2011年7月19日火曜日

Page 69: Ruby を利用した大規模ウェブサービスの開発・運用

30+Engineers

2011年7月19日火曜日

Page 70: Ruby を利用した大規模ウェブサービスの開発・運用

Rails アプリの多人数開発

Working with Rails within a large team

2011年7月19日火曜日

Page 71: Ruby を利用した大規模ウェブサービスの開発・運用

DevelopmentCycle

2011年7月19日火曜日

Page 72: Ruby を利用した大規模ウェブサービスの開発・運用

開発Dev

デプロイDeploy

フィードバックFeedback

2011年7月19日火曜日

Page 73: Ruby を利用した大規模ウェブサービスの開発・運用

開発Dev

デプロイDeploy

フィードバックFeedback

2011年7月19日火曜日

Page 74: Ruby を利用した大規模ウェブサービスの開発・運用

•rspec 1.x•unit•functional•Integration

Tests

2011年7月19日火曜日

Page 75: Ruby を利用した大規模ウェブサービスの開発・運用

beforeUnit

Functional

Integration

2011年7月19日火曜日

Page 76: Ruby を利用した大規模ウェブサービスの開発・運用

nearUnitFunctional

Integration2011年7月19日火曜日

Page 77: Ruby を利用した大規模ウェブサービスの開発・運用

nearUnitFunctional

Integration2011年7月19日火曜日

Page 78: Ruby を利用した大規模ウェブサービスの開発・運用

nearUnitFunctional

IntegrationJavaScript

2011年7月19日火曜日

Page 79: Ruby を利用した大規模ウェブサービスの開発・運用

nearUnitFunctional

Integration

JavaScript♥

capybara-webkit

2011年7月19日火曜日

Page 80: Ruby を利用した大規模ウェブサービスの開発・運用

nearUnitFunctional

Integration

JavaScript♥

capybara-webkit

2011年7月19日火曜日

Page 81: Ruby を利用した大規模ウェブサービスの開発・運用

nearUnitFunctional

Integration

JavaScript♥

capybara-webkit

2011年7月19日火曜日

Page 82: Ruby を利用した大規模ウェブサービスの開発・運用

30+Engineers

2011年7月19日火曜日

Page 83: Ruby を利用した大規模ウェブサービスの開発・運用

manyspecs

2011年7月19日火曜日

Page 84: Ruby を利用した大規模ウェブサービスの開発・運用

2011年7月19日火曜日

Page 85: Ruby を利用した大規模ウェブサービスの開発・運用

So slow!!

@ryo_katsuma2011年7月19日火曜日

Page 86: Ruby を利用した大規模ウェブサービスの開発・運用

テストをリモート上で実行するRun specs remotely

2011年7月19日火曜日

Page 87: Ruby を利用した大規模ウェブサービスの開発・運用

•Custom in-house library•Designated test servers•Synchronize local source code via rsync•Test results are fetched via ssh

remote spec

$  rake  cookpad:spec:remote2011年7月19日火曜日

Page 88: Ruby を利用した大規模ウェブサービスの開発・運用

x4 servers32 parallel processes

2011年7月19日火曜日

Page 89: Ruby を利用した大規模ウェブサービスの開発・運用

Speed test

0

750

1500

2250

3000

1.8.7 REE para.. remote

速度(秒) メモリ(MB)

2011年7月19日火曜日

Page 90: Ruby を利用した大規模ウェブサービスの開発・運用

19.2x50sec

2011年7月19日火曜日

Page 91: Ruby を利用した大規模ウェブサービスの開発・運用

For more infoOedo RubyKaigi 01

http://d.hatena.ne.jp/secondlife/20110410/1302442313

2011年7月19日火曜日

Page 92: Ruby を利用した大規模ウェブサービスの開発・運用

開発Dev

デプロイDeploy

フィードバックFeedback

2011年7月19日火曜日

Page 93: Ruby を利用した大規模ウェブサービスの開発・運用

•Only allow successful CI builds to be deployed

•Send deploy notifications•Always check error logs after deployment

Deploy Rules

2011年7月19日火曜日

Page 94: Ruby を利用した大規模ウェブサービスの開発・運用

Continuous Integration

継続的インテグレーション

2011年7月19日火曜日

Page 95: Ruby を利用した大規模ウェブサービスの開発・運用

2011年7月19日火曜日

Page 96: Ruby を利用した大規模ウェブサービスの開発・運用

2011年7月19日火曜日

Page 97: Ruby を利用した大規模ウェブサービスの開発・運用

CI が導入され変わった開発パターン•CI を通ったコードのみリリース•みんなテストを書く・実行するように•「CIで動かないテスト」≒「将来的に価値がないテスト」の認識•継続することの重要性•新しい技術を導入する=CIで動くテストが書けるを意識 (JavaScript のテストなども...)

How did using a CI change our development flow?

Only release successful CI builds

Test coverage as a requirement

Tests should be written so they can run on a CI

2011年7月19日火曜日

Page 98: Ruby を利用した大規模ウェブサービスの開発・運用

For more infoRubyStudy@Sapporo#18

http://d.hatena.ne.jp/secondlife/20110704/1309759409

2011年7月19日火曜日

Page 99: Ruby を利用した大規模ウェブサービスの開発・運用

•デプロイ時にメッセージを記入•新機能の追加・大きな変更•Skype による通知•エンジニア以外にも変更点のメール

Notifications$  cap  production  deploy

Add a "deploy message" to every release

(ex: "Added feature x", "Fixed bug z" etc)

Skype notification

Mail sent to developer and support mailing lists

2011年7月19日火曜日

Page 100: Ruby を利用した大規模ウェブサービスの開発・運用

Error monitoring

2011年7月19日火曜日

Page 101: Ruby を利用した大規模ウェブサービスの開発・運用

monitoring

2011年7月19日火曜日

Page 102: Ruby を利用した大規模ウェブサービスの開発・運用

2011年7月19日火曜日

Page 103: Ruby を利用した大規模ウェブサービスの開発・運用

•Exception Log•Rails / JavaScript•例外を0件にするのは難しい•バースト検知するのは簡単

It is nearly impossible to reduce number of exceptions to 0

Looking for spikes in number of exceptions is key

2011年7月19日火曜日

Page 104: Ruby を利用した大規模ウェブサービスの開発・運用

2011年7月19日火曜日

Page 105: Ruby を利用した大規模ウェブサービスの開発・運用

開発Dev

デプロイDeploy

フィードバックfeedback

2011年7月19日火曜日

Page 106: Ruby を利用した大規模ウェブサービスの開発・運用

Extensions

2011年7月19日火曜日

Page 107: Ruby を利用した大規模ウェブサービスの開発・運用

•Rails 拡張•条件指定で有効化•一部ユーザのみ限定公開可能•プロトタイプ開発向き•“Spec を書かなくても良い” ルール•例外発生時 “自動で無効化”

ExtensionsExpands upon Rails functionality

Selective release of new features

(ex: “Show feature X only to users A, B, C)

Used for prototyping

Specs not required

If an exception occurs in an extension, it is turned off automatically

2011年7月19日火曜日

Page 108: Ruby を利用した大規模ウェブサービスの開発・運用

2011年7月19日火曜日

Page 109: Ruby を利用した大規模ウェブサービスの開発・運用

2011年7月19日火曜日

Page 110: Ruby を利用した大規模ウェブサービスの開発・運用

new features

stats for staff2011年7月19日火曜日

Page 111: Ruby を利用した大規模ウェブサービスの開発・運用

2011年7月19日火曜日

Page 112: Ruby を利用した大規模ウェブサービスの開発・運用

もし、機能をリリースしない決断をしたら

How do we handle prototypes we decide not to release?

2011年7月19日火曜日

Page 113: Ruby を利用した大規模ウェブサービスの開発・運用

$  rm  app/extensions/foobar_ext

2011年7月19日火曜日

Page 114: Ruby を利用した大規模ウェブサービスの開発・運用

For more info

テキスト

http://techlife.cookpad.com/2011/07/15/extension-framework/

2011年7月19日火曜日

Page 115: Ruby を利用した大規模ウェブサービスの開発・運用

DevelopmentCycle

2011年7月19日火曜日

Page 116: Ruby を利用した大規模ウェブサービスの開発・運用

開発Dev

デプロイDeploy

フィードバックfeedback

2011年7月19日火曜日

Page 117: Ruby を利用した大規模ウェブサービスの開発・運用

開発Dev

デプロイDeploy

フィードバックfeedback

2011年7月19日火曜日

Page 118: Ruby を利用した大規模ウェブサービスの開発・運用

提供

2011年7月19日火曜日

Page 119: Ruby を利用した大規模ウェブサービスの開発・運用

ご清聴ありがとうございました

Thank You

2011年7月19日火曜日

Page 120: Ruby を利用した大規模ウェブサービスの開発・運用

クックパッドでは一緒に働くエンジニアを募集しています

あなたの技術で、たくさんの笑顔をふやしませんか?

2011年7月19日火曜日