Upgrade to Pro — share decks privately, control downloads, hide ads and more …

From 'Legacy' to 'Edge' 2014 edition

From 'Legacy' to 'Edge' 2014 edition

SHIBATA Hiroshi

April 19, 2014
Tweet

More Decks by SHIBATA Hiroshi

Other Decks in Technology

Transcript

  1. !
    From ‘Legacy' to ‘Edge'
    2014 edition
    !
    Hiroshi SHIBATA
    @hsbt
    OedoRubyKaigi04

    View Slide

  2. SHIBATA Hiroshi(@hsbt)

    View Slide

  3. asakusa.rb

    View Slide

  4. ruby-lang.org

    View Slide

  5. Rails Girls in Japan

    View Slide

  6. Ruby Committer

    View Slide

  7. View Slide

  8. ϛυϧ΢ΣΞͷΞοϓάϨʔυ
    ࣾ಺։ൃج൫ͷߏங
    ౷ܭج൫ͷߏங
    +409ͷӡ༻੔උ
    HJUIVC
    ηΩϡϦςΟ؂ࠪ
    ίʔυϨϏϡʔ
    ςετج൫ͷߏங
    ΞΫηεղੳج൫ͷߏங
    ։ൃϓϩηε
    ৽ਓڭҭ
    ݪߘࣥච
    ΧϯϑΝϨϯεൃද
    044։ൃ αʔόʔߏ੒؅ཧͷ࡮৽
    ϦʔϯελʔτΞοϓ
    +FOLJOT
    3VCZ3BJMT
    3%#.4
    ٕज़ج൫νʔϜ

    View Slide

  9. http://30d.jp

    View Slide

  10. from 2007/5

    View Slide

  11. 380,000 users
    230,000,000 photos

    View Slide

  12. Our Rails app
    46 models
    5000 lines in controllers
    400 lines in routes.rb
    1:1.3 code to test ratio

    View Slide

  13. system architecture

    View Slide

  14. application server

    View Slide

  15. storage server

    View Slide

  16. job server

    View Slide

  17. transaction server

    View Slide

  18. storage is over
    450 TB

    View Slide

  19. database size
    is over
    250 GB

    View Slide

  20. Development
    Culture

    View Slide

  21. จࣈ
    github workflow

    View Slide

  22. IRC
    github issue
    costomer’s
    contact
    nagios

    View Slide

  23. DevOps

    View Slide

  24. 4 deploy/day

    View Slide

  25. View Slide

  26. How to migrate
    edge rails
    from
    legacy rails?

    View Slide

  27. Ruby 1.8.6
    Rails 2.0.2

    View Slide

  28. Ruby 1.8.6
    Rails 2.0.2
    Ruby 2.1.1
    Rails 4.1.0 new!

    View Slide

  29. Why?

    View Slide

  30. View Slide

  31. Ruby on Rails

    View Slide

  32. Ruby
    1.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

    View Slide

  33. Ruby
    1.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
    Slow
    Fast

    View Slide

  34. Ruby
    1.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

    View Slide

  35. Ruby
    1.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

    View Slide

  36. Ruby
    1.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

    View Slide

  37. Rails 2.0
    Rails 2.3

    View Slide

  38. Rails 2.0
    Rails 2.3
    hotfix A
    migration A

    View Slide

  39. Rails 2.0
    Rails 2.3
    hotfix A
    migration A

    View Slide

  40. Rails 2.0
    Rails 2.3
    hotfix A
    migration A

    View Slide

  41. จࣈ

    View Slide

  42. Zero
    Downtime
    Deploy

    View Slide

  43. cookpad/kage

    View Slide

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

    View Slide

  45. the basic of kage
    real request

    View Slide

  46. View Slide

  47. _ਓਓ ਓਓ__ਓਓ ਓਓ_!
    > ಥવͷαʔόʔ࠶ىಈ ʉY^Y^Y^YY^Y^Y^YY^Y

    View Slide

  48. Ruby
    1.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

    View Slide

  49. rails 2.3 with bundler

    View Slide

  50. 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'!

    View Slide

  51. require "./config/environment"!
    !
    use Rails::Rack::LogTailer!
    use Rails::Rack::Static!
    run ActionController::Dispatcher.new
    rack with rails 2.3

    View Slide

  52. 30days-front
    can’t use
    hyphen
    can’t use
    number
    can’t convert
    !
    application.rb...

    View Slide

  53. Reduce
    customer frustration.

    View Slide

  54. app1
    app2
    backgroundrb to dj

    View Slide

  55. จࣈ

    View Slide

  56. Ruby
    1.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

    View Slide

  57. Use trunk everyday.

    View Slide

  58. จࣈ

    View Slide

  59. จࣈ

    View Slide

  60. Use modern architecture

    View Slide

  61. app1
    app2

    View Slide

  62. kyoto tycoon is slower
    than mysql…

    View Slide

  63. View Slide

  64. 1.8 to 2.0

    View Slide

  65. จࣈ

    View Slide

  66. 2.0 to 2.1

    View Slide

  67. CPU Usage(%)
    0
    25
    50
    75
    100
    49
    69
    2.0 2.1

    View Slide

  68. Resp. time(ms)
    0
    50
    100
    150
    200
    250
    189
    221
    2.0 2.1

    View Slide

  69. memory usage(giga byte)
    0
    1
    2
    3
    4
    3.8
    3.2
    2.0 2.1

    View Slide

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

    View Slide

  71. Ruby
    1.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

    View Slide

  72. จࣈ

    View Slide

  73. Resp. time(ms)
    0
    60
    120
    180
    240
    300
    287
    189
    3.2 4.0

    View Slide

  74. Ruby
    1.9.3 2.0.0 2.1 2.2
    Rails
    3.0
    3.2 ?
    4.0 ?
    4.1 ?

    View Slide

  75. Ruby
    1.9.3 2.0.0 2.1 2.2
    Rails
    3.0
    3.2 ?
    4.0 ?
    4.1 ?
    New!!

    View Slide

  76. จࣈ

    View Slide

  77. 1. Flash structure changes
    2. Mutator methods called on Relation

    View Slide

  78. จࣈ

    View Slide

  79. Resp. time(ms)
    0
    60
    120
    180
    240
    300
    266
    287
    4.0 4.1

    View Slide

  80. Ruby
    1.9.3 2.0.0 2.1 2.2
    Rails
    3.0
    3.2 ?
    4.0 ?
    4.1 ?

    View Slide

  81. 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

    View Slide

  82. % 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

    View Slide

  83. จࣈ

    View Slide

  84. conclusion

    View Slide

  85. 2. fix gem
    4. fix Ruby
    3. fix Rails
    1. fix your code

    View Slide