$30 off During Our Annual Pro Sale. View Details »

Estratégias para tunar sua aplicação rails

Cirdes
November 29, 2014

Estratégias para tunar sua aplicação rails

Palestra na RuPy 2014

Cirdes

November 29, 2014
Tweet

More Decks by Cirdes

Other Decks in Programming

Transcript

  1. ESTRATÉGIASDE CACHE
    PARA TUNAR SUA
    APLICAÇÃO RAILS

    View Slide

  2. CIRDES HENRIQUE
    ENGENHEIRO DA COMPUTAÇÃO - UFPE
    ORGANIZADOR DO ABRIL PRO RUBY
    C0-FUNDADOR E DEV DO EVENTICK

    View Slide

  3. View Slide

  4. 335 MIL TICKETS EMITIDOS
    3600 ORGANIZADORES
    1200 EVENTOS FUTUROS

    View Slide

  5. RECIFE

    View Slide

  6. RECIFE

    View Slide

  7. O EVENTICK FICOU
    FORA DO AR

    POR 30 MINUTOS

    View Slide

  8. ANTES DA SOLUÇÃO, UM PASSO ATRÁS:

    MONITORAR A APLICAÇÃO
    NewRelic
    Nazar.io
    HoneyBadger
    Logentries
    Inspectlet
    The Informant

    View Slide

  9. SOA?

    View Slide

  10. SINGLE RAILS APP 

    LIKE SHOPIFY

    View Slide

  11. 70% DAS REQUISIÇÕES
    BATEM NA CACHE

    View Slide

  12. O QUE É CACHE?

    View Slide

  13. Cache é um componente que guarda
    informações de forma TRANSPARENTE


    para que futuras requisições

    sejam mais RÁPIDAS

    View Slide

  14. QUAL A

    CARACTERÍSTICA

    DA CACHE?

    View Slide

  15. O QUE USA CACHE?

    View Slide

  16. DO QUE É
    CONSTITUÍDA
    UMA CACHE?

    View Slide

  17. CACHE = CASH

    View Slide

  18. ARQUITETURA DE MEMÓRIA

    View Slide

  19. CACHE HIT / CACHE MISS / CACHE RATIO

    View Slide

  20. COMO MAXIMIZAR
    O CACHE HIT?

    View Slide

  21. BÉLÁDY’S ALGORITHM

    View Slide

  22. RANDOM

    REPLACEMENT

    (RR)

    View Slide

  23. LEAST-FREQUENTLY
    USED

    (LFU)

    View Slide

  24. LEAST-RECENTLY
    USED

    (LRU)

    View Slide

  25. O QUE É
    WEBCACHING?

    View Slide

  26. REQUISIÇÃO
    Rails App
    Reverse
    Proxy
    CDN Proxy
    Browser

    View Slide

  27. CACHE
    SERVER-SIDE
    CACHE
    CLIENT-SIDE

    View Slide

  28. PAGE

    CACHE
    ACTION

    CACHE
    FRAGMENT

    CACHE
    RAILS

    CACHE

    View Slide

  29. WRITE ON DISK
    BYPASS RAILS APPLICATION ENTIRE
    STATELESS PAGES
    NÃO FUNCIONA NO HEROKU
    PAGE CACHE

    View Slide

  30. PAGE CACHE
    class WeblogController < ActionController::Base
    caches_page :show, :new
    def update
    expire_page action: 'show', id: params[:list][:id]
    end
    end

    View Slide

  31. SIMILAR TO PAGE CACHE
    RUN FILTERS
    ACTION CACHE

    View Slide

  32. ACTION CACHE
    class PostsController < ActionController::Base
    caches_action :show, expires_in: 1.hour
    end

    View Slide

  33. DEPRECATED

    View Slide

  34. HTML CACHE AVAILABLE IN RAILS 4
    FRAGMENT CACHE

    View Slide

  35. RAILS CACHE
    FRAGMENT AND ACTION CACHE BUILD ON RAILS.CACHE
    CONFIG.ACTION_CONTROLLER.PERFORM_CACHING = TRUE

    View Slide

  36. ActiveSupport::Cache::Store
    FileStore
    MemoryStore
    NullStore
    MemCacheStore

    View Slide

  37. HOW TO USE IT
    Rails.cache.write 'foo', 'bar'
    Rails.cache.fetch 'foo'
    Rails.cache.write :foo, {a: 'b'}

    View Slide

  38. FRAGMENT CACHING
    Rais.cache.fetch 'key',
    expires_in: 5.minutes,
    race_condition_ttl: 10.seconds do
    #code
    end

    View Slide

  39. FRAGMENT CACHING
    <% cache "event-#{event.id}" do %>
    <%= render event %>
    <% end %>

    View Slide

  40. FRAGMENT CACHING
    <% cache “event-#{event.id}”, expires_in: 1.year do %>
    <%= render event %>
    <% end %>

    View Slide

  41. FRAGMENT CACHING
    def update
    expire_fragment("event-#{event.id}")
    end

    View Slide

  42. FRAGMENT CACHING
    <% cache [:recent, event] do %>
    <%= render event %>
    <% end %>

    View Slide

  43. FRAGMENT CACHING
    ACTIVESUPPORT::CACHE.EXPAND_CACHE_KEY [:RECENT, EVENT]
    => "RECENT/EVENTS/12510-20141128131506743910000"

    View Slide

  44. FRAGMENT CACHING
    <% cache :recent_attendees, expires_in: 5.minutes do %>
    <%= render partial: 'recent',
    collection: Attendees.recent %>
    <% end %>

    View Slide

  45. FRAGMENT CACHING
    <% cache(cache_key_for_attendees) do %>
    <%= render partial: 'recent', collection:
    Attendees.recent %>
    <% end %>

    View Slide

  46. FRAGMENT CACHING
    module AttendeesHelper
    def cache_key_for_attendees
    count = Attendee.count
    max_updated_at =
    Attendee.maximum(:updated_at).try(:utc).try(:to_s, :number)
    "attendees/all-#{count}-#{max_updated_at}"
    end
    end

    View Slide

  47. FRAGMENT CACHING
    <% cache(cache_key_for_attendees) do %>
    <%= render partial: 'recent', collection:
    Attendees.recent %>
    <% end %>

    View Slide

  48. PROBLEMA
    COM TEMPLATE

    View Slide

  49. CACHE Digests

    <% cache ["v1", @event] do%>
    Team: <%= @event.title %>
    <%= render @event.attendees %>
    <% end %>

    <% cache ["v1", attendee] do %>
    <%= attendee.name %>
    <%= attendee.email %>
    <% end %>

    View Slide

  50. CACHE Digests

    View Slide

  51. CACHE Digests

    View Slide

  52. RUSSIAN

    DOLL

    View Slide

  53. Russian Doll

    View Slide

  54. Russian Doll
    <% cache(cache_key_for_attendees) do %>
    All available attendees:
    <% Attendee.all.each do |a| %>
    <% cache(a) do %>
    <%= a.name %>
    <% end %>
    <% end %>
    <% end %>

    View Slide

  55. KNOWING IS

    NOT ENOUGH
    WE MUST APPLY

    View Slide

  56. WILLING IS

    NOT ENOUGH
    WE MUST DO

    View Slide