20140425 ruby conftaiwan2014

85
From ‘Legacy' to ‘Edge' 2014 edition Hiroshi SHIBATA @hsbt RubyConfTaiwan 2014

Transcript of 20140425 ruby conftaiwan2014

Page 1: 20140425 ruby conftaiwan2014

!

From ‘Legacy' to ‘Edge' 2014 edition

!

Hiroshi SHIBATA @hsbt

RubyConfTaiwan 2014

Page 2: 20140425 ruby conftaiwan2014

Thank you!

Page 3: 20140425 ruby conftaiwan2014

SHIBATA Hiroshi(@hsbt)

Page 4: 20140425 ruby conftaiwan2014

Ruby Committer

Page 5: 20140425 ruby conftaiwan2014

ruby-lang.org

Page 6: 20140425 ruby conftaiwan2014

Rails Girls in Japan

Page 7: 20140425 ruby conftaiwan2014

asakusa.rb

Page 8: 20140425 ruby conftaiwan2014
Page 9: 20140425 ruby conftaiwan2014

ミドルウェアのアップグレード

社内開発基盤の構築

統計基盤の構築JSOXの運用整備

github

セキュリティ監査コードレビューテスト基盤の構築

アクセス解析基盤の構築

開発プロセス

新人教育原稿執筆

カンファレンス発表

OSS開発 サーバー構成管理の刷新

リーンスタートアップ

Jenkins

Ruby/Rails

RDBMS

技術基盤チーム

Page 10: 20140425 ruby conftaiwan2014

http://30d.jp

Page 11: 20140425 ruby conftaiwan2014

from 2008/4

Page 12: 20140425 ruby conftaiwan2014

380,000 users

230,000,000 photos

Page 13: 20140425 ruby conftaiwan2014

Our Rails app

46 models

5000 lines in controllers

400 lines in routes.rb

1:1.3 code to test ratio

Page 14: 20140425 ruby conftaiwan2014

system architecture

Page 15: 20140425 ruby conftaiwan2014

application server

Page 16: 20140425 ruby conftaiwan2014

storage server

Page 17: 20140425 ruby conftaiwan2014

job server

Page 18: 20140425 ruby conftaiwan2014

transaction server

Page 19: 20140425 ruby conftaiwan2014

storage is over 450 TB

Page 20: 20140425 ruby conftaiwan2014

database size is over 250 GB

Page 21: 20140425 ruby conftaiwan2014

Development Culture

Page 22: 20140425 ruby conftaiwan2014

github workflow

Page 23: 20140425 ruby conftaiwan2014

IRC

github issue

costomer’s contact

nagios

Page 24: 20140425 ruby conftaiwan2014

DevOps

Page 25: 20140425 ruby conftaiwan2014

4 deploy/day

Page 26: 20140425 ruby conftaiwan2014
Page 27: 20140425 ruby conftaiwan2014

How to migrate edge rails

from legacy rails?

Page 28: 20140425 ruby conftaiwan2014

Ruby 1.8.6

Rails 2.0.2

Page 29: 20140425 ruby conftaiwan2014

Ruby 1.8.6Rails 2.0.2

Ruby 2.1.1Rails 4.1.0 new!

Page 30: 20140425 ruby conftaiwan2014

Why?

Page 31: 20140425 ruby conftaiwan2014
Page 32: 20140425 ruby conftaiwan2014

Ruby on Rails

Page 33: 20140425 ruby conftaiwan2014

Ruby1.8.6 1.8.7 1.9.3 2.0.0 2.1

Rails

2.0/2.1

2.3

3.0

3.2

4.0

Page 34: 20140425 ruby conftaiwan2014

Ruby1.8.6 1.8.7 1.9.3 2.0.0 2.1

Rails

2.0/2.1

2.3

3.0

3.2

4.0Slow

Fast

Page 35: 20140425 ruby conftaiwan2014

Ruby1.8.6 1.8.7 1.9.3 2.0.0 2.1

Rails

2.0/2.1

2.3

3.0

3.2

4.0

Page 36: 20140425 ruby conftaiwan2014

Ruby1.8.6 1.8.7 1.9.3 2.0.0 2.1

Rails

2.0/2.1

2.3

3.0

3.2

4.0

Page 37: 20140425 ruby conftaiwan2014

Ruby1.8.6 1.8.7 1.9.3 2.0.0 2.1

Rails

2.0/2.1

2.3

3.0

3.2

4.0

Page 38: 20140425 ruby conftaiwan2014

Rails 2.0

Rails 2.3

Page 39: 20140425 ruby conftaiwan2014

Rails 2.0

Rails 2.3

hotfix A

migration A

Page 40: 20140425 ruby conftaiwan2014

Rails 2.0

Rails 2.3

hotfix A

migration A

Page 41: 20140425 ruby conftaiwan2014

Rails 2.0

Rails 2.3

hotfix A

migration A

Page 42: 20140425 ruby conftaiwan2014
Page 43: 20140425 ruby conftaiwan2014

Zero Downtime

Deploy

Page 44: 20140425 ruby conftaiwan2014

cookpad/kage

Page 45: 20140425 ruby conftaiwan2014

Kage (kah-geh) is an HTTP shadow proxy server that sits between clients and your server(s) to enable "shadow requests".

Page 46: 20140425 ruby conftaiwan2014

the basic of kage

real request

Page 47: 20140425 ruby conftaiwan2014
Page 48: 20140425 ruby conftaiwan2014

Ruby1.8.6 1.8.7 1.9.3 2.0.0 2.1

Rails

2.0/2.1

2.3

3.0

3.2

4.0

Page 49: 20140425 ruby conftaiwan2014

rails 2.3 with bundler

Page 50: 20140425 ruby conftaiwan2014

source 'https://rubygems.org'!!gem 'rails', '~> 2.3.18'!gem 'rake', '~> 0.9.2'!gem 'rdoc'!gem 'rake-confirm'!!gem 'mysql'!gem "mysql_retry_lost_connection"!gem 'acts_as_paranoid', :github => 'paperboy-30days/acts_as_paranoid'!gem 'passenger', '~> 3.0'!gem 'memcache-client', :require => 'memcache'!gem 'system_timer'!gem 'yajl-ruby', :require => 'yajl'!gem 'will_paginate', '~> 2.3'!gem 'mail'!!gem 'sass'!gem 'compass-rails'!!gem 'osaipo_client', :git => '[email protected]:paperboy-all/osaipo_client.git', :branch => 'legacy'!gem 'jugem_client', :git => '[email protected]:paperboy-all/jugem_client.git'!gem 'ppb_footer', :github => 'paperboy-all/ppb_footer'!

Page 51: 20140425 ruby conftaiwan2014

require "./config/environment"!!use Rails::Rack::LogTailer!use Rails::Rack::Static!run ActionController::Dispatcher.new

rack with rails 2.3

Page 52: 20140425 ruby conftaiwan2014

30days-frontcan’t use hyphen

can’t use number

can’t convert !application.rb...

Page 53: 20140425 ruby conftaiwan2014

Reduce customer frustration.

Page 54: 20140425 ruby conftaiwan2014

app1

app2

backgroundrb to dj

Page 55: 20140425 ruby conftaiwan2014
Page 56: 20140425 ruby conftaiwan2014

Ruby1.8.6 1.8.7 1.9.3 2.0.0 2.1

Rails

2.0/2.1

2.3

3.0

3.2

4.0

Page 57: 20140425 ruby conftaiwan2014

Use trunk everyday.

Page 58: 20140425 ruby conftaiwan2014
Page 59: 20140425 ruby conftaiwan2014
Page 60: 20140425 ruby conftaiwan2014

1.8 to 2.0

Page 61: 20140425 ruby conftaiwan2014
Page 62: 20140425 ruby conftaiwan2014

2.0 to 2.1

Page 63: 20140425 ruby conftaiwan2014

CPU

Usa

ge(%

)

0

25

50

75

100

49

69

2.0 2.1

Page 64: 20140425 ruby conftaiwan2014

Resp

. tim

e(m

s)

0

50

100

150

200

250

189

221

2.0 2.1

Page 65: 20140425 ruby conftaiwan2014

mem

ory

usag

e(gi

ga b

yte)

0

1

2

3

4

3.8

3.2

2.0 2.1

Page 66: 20140425 ruby conftaiwan2014

https://www.ruby-lang.org/en/news/2014/03/10/regression-of-hash-reject-in-ruby-2-1-1/

Page 67: 20140425 ruby conftaiwan2014

Ruby1.8.6 1.8.7 1.9.3 2.0.0 2.1

Rails

2.0/2.1

2.3

3.0

3.2

4.0

Page 68: 20140425 ruby conftaiwan2014
Page 69: 20140425 ruby conftaiwan2014

Use modern architecture

Page 70: 20140425 ruby conftaiwan2014

app1

app2

Page 71: 20140425 ruby conftaiwan2014

kyoto tycoon is slower than mysql…

Page 72: 20140425 ruby conftaiwan2014
Page 73: 20140425 ruby conftaiwan2014

Resp

. tim

e(m

s)

0

60

120

180

240

300

287

189

3.2 4.0

Page 74: 20140425 ruby conftaiwan2014

Ruby

1.9.3 2.0.0 2.1 2.2

Rails

3.0

3.2 ?4.0 ?4.1 ?

Page 75: 20140425 ruby conftaiwan2014

Ruby

1.9.3 2.0.0 2.1 2.2

Rails

3.0

3.2 ?4.0 ?4.1 ?

New!!

Page 76: 20140425 ruby conftaiwan2014
Page 77: 20140425 ruby conftaiwan2014

1. Flash structure changes

2. Mutator methods called on Relation

Page 78: 20140425 ruby conftaiwan2014
Page 79: 20140425 ruby conftaiwan2014

Resp

. tim

e(m

s)

0

60

120

180

240

300

266287

4.0 4.1

Page 80: 20140425 ruby conftaiwan2014

Ruby

1.9.3 2.0.0 2.1 2.2

Rails

3.0

3.2 ?4.0 ?4.1 ?

Page 81: 20140425 ruby conftaiwan2014

class Bar! def bar(foo = foo())! foo! end!! def buzz(foo = foo)! foo! end!! def foo! :buzz! end!end!!p Bar.new.bar!p Bar.new.buzz

Page 82: 20140425 ruby conftaiwan2014

% ruby -v r45272.rb!ruby 2.2.0dev (2014-04-13 trunk 45580) [x86_64-darwin13]!:buzz!nil!!% ruby -v r45272.rb!ruby 2.1.2p80 (2014-03-01 revision 45231) [x86_64-darwin13.0]!:buzz!:buzz

Page 83: 20140425 ruby conftaiwan2014
Page 84: 20140425 ruby conftaiwan2014

conclusion

Page 85: 20140425 ruby conftaiwan2014

2. fix gem

4. fix Ruby3. fix Rails

1. fix your code