Palestra na RuPy 2014
ESTRATÉGIASDE CACHEPARA TUNAR SUAAPLICAÇÃO RAILS
View Slide
CIRDES HENRIQUEENGENHEIRO DA COMPUTAÇÃO - UFPEORGANIZADOR DO ABRIL PRO RUBYC0-FUNDADOR E DEV DO EVENTICK
335 MIL TICKETS EMITIDOS3600 ORGANIZADORES1200 EVENTOS FUTUROS
RECIFE
O EVENTICK FICOUFORA DO AR POR 30 MINUTOS
ANTES DA SOLUÇÃO, UM PASSO ATRÁS: MONITORAR A APLICAÇÃONewRelicNazar.ioHoneyBadgerLogentriesInspectletThe Informant
SOA?
SINGLE RAILS APP LIKE SHOPIFY
70% DAS REQUISIÇÕESBATEM NA CACHE
O QUE É CACHE?
Cache é um componente que guardainformações de forma TRANSPARENTE para que futuras requisições sejam mais RÁPIDAS
QUAL A CARACTERÍSTICA DA CACHE?
O QUE USA CACHE?
DO QUE ÉCONSTITUÍDAUMA CACHE?
CACHE = CASH
ARQUITETURA DE MEMÓRIA
CACHE HIT / CACHE MISS / CACHE RATIO
COMO MAXIMIZARO CACHE HIT?
BÉLÁDY’S ALGORITHM
RANDOM REPLACEMENT (RR)
LEAST-FREQUENTLYUSED (LFU)
LEAST-RECENTLYUSED (LRU)
O QUE ÉWEBCACHING?
REQUISIÇÃORails AppReverseProxyCDN ProxyBrowser
CACHESERVER-SIDECACHECLIENT-SIDE
PAGE CACHEACTION CACHEFRAGMENT CACHERAILS CACHE
WRITE ON DISKBYPASS RAILS APPLICATION ENTIRESTATELESS PAGESNÃO FUNCIONA NO HEROKUPAGE CACHE
PAGE CACHEclass WeblogController < ActionController::Basecaches_page :show, :newdef updateexpire_page action: 'show', id: params[:list][:id]endend
SIMILAR TO PAGE CACHERUN FILTERSACTION CACHE
ACTION CACHEclass PostsController < ActionController::Basecaches_action :show, expires_in: 1.hourend
DEPRECATED
HTML CACHE AVAILABLE IN RAILS 4FRAGMENT CACHE
RAILS CACHEFRAGMENT AND ACTION CACHE BUILD ON RAILS.CACHECONFIG.ACTION_CONTROLLER.PERFORM_CACHING = TRUE
ActiveSupport::Cache::StoreFileStoreMemoryStoreNullStoreMemCacheStore
HOW TO USE ITRails.cache.write 'foo', 'bar'Rails.cache.fetch 'foo'Rails.cache.write :foo, {a: 'b'}
FRAGMENT CACHINGRais.cache.fetch 'key',expires_in: 5.minutes,race_condition_ttl: 10.seconds do#codeend
FRAGMENT CACHING<% cache "event-#{event.id}" do %><%= render event %><% end %>
FRAGMENT CACHING<% cache “event-#{event.id}”, expires_in: 1.year do %><%= render event %><% end %>
FRAGMENT CACHINGdef updateexpire_fragment("event-#{event.id}")end
FRAGMENT CACHING<% cache [:recent, event] do %><%= render event %><% end %>
FRAGMENT CACHINGACTIVESUPPORT::CACHE.EXPAND_CACHE_KEY [:RECENT, EVENT]=> "RECENT/EVENTS/12510-20141128131506743910000"
FRAGMENT CACHING<% cache :recent_attendees, expires_in: 5.minutes do %><%= render partial: 'recent',collection: Attendees.recent %><% end %>
FRAGMENT CACHING<% cache(cache_key_for_attendees) do %><%= render partial: 'recent', collection:Attendees.recent %><% end %>
FRAGMENT CACHINGmodule AttendeesHelperdef cache_key_for_attendeescount = Attendee.countmax_updated_at =Attendee.maximum(:updated_at).try(:utc).try(:to_s, :number)"attendees/all-#{count}-#{max_updated_at}"endend
PROBLEMACOM TEMPLATE
CACHE Digests<% cache ["v1", @event] do%>Team: <%= @event.title %><%= render @event.attendees %><% end %><% cache ["v1", attendee] do %><%= attendee.name %><%= attendee.email %><% end %>
CACHE Digests
RUSSIAN DOLL
Russian Doll
Russian Doll<% cache(cache_key_for_attendees) do %>All available attendees:<% Attendee.all.each do |a| %><% cache(a) do %><%= a.name %><% end %><% end %><% end %>
KNOWING IS NOT ENOUGHWE MUST APPLY
WILLING IS NOT ENOUGHWE MUST DO