Como construir uma Aplicação que consuma e produza updates no Twitter usando Python

Preview:

Citation preview

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

CIRDES HENRIQUEENGENHEIRO DA COMPUTAÇÃO - UFPE ORGANIZADOR DO ABRIL PRO RUBY C0-FUNDADOR E DEV DO EVENTICK

335 MIL TICKETS EMITIDOS 3600 ORGANIZADORES

1200 EVENTOS FUTUROS

RECIFE

RECIFE

O EVENTICK FICOU

FORA DO AR POR 30 MINUTOS

ANTES DA SOLUÇÃO, UM PASSO ATRÁS:MONITORAR A APLICAÇÃO

NewRelic Nazar.io

HoneyBadger Logentries Inspectlet

The Informant

SOA?

SINGLE RAILS APP LIKE SHOPIFY

70% DAS REQUISIÇÕES BATEM NA CACHE

O QUE É CACHE?

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

para que futuras requisições

sejam mais RÁPIDAS

QUAL ACARACTERÍSTICA

DA CACHE?

O QUE USA CACHE?

DO QUE É CONSTITUÍDA UMA CACHE?

CACHE = CASH

ARQUITETURA DE MEMÓRIA

CACHE HIT / CACHE MISS / CACHE RATIO

COMO MAXIMIZAR O CACHE HIT?

BÉLÁDY’S ALGORITHM

RANDOMREPLACEMENT

(RR)

LEAST-FREQUENTLY USED(LFU)

LEAST-RECENTLY USED(LRU)

O QUE É WEBCACHING?

REQUISIÇÃO

Rails App

Reverse Proxy

CDN Proxy

Browser

CACHE SERVER-SIDE

CACHE CLIENT-SIDE

PAGE CACHE

ACTIONCACHE

FRAGMENTCACHE

RAILSCACHE

WRITE ON DISK

BYPASS RAILS APPLICATION ENTIRE

STATELESS PAGES

NÃO FUNCIONA NO HEROKU

PAGE CACHE

PAGE CACHE

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

SIMILAR TO PAGE CACHE

RUN FILTERS

ACTION CACHE

ACTION CACHE

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

DEPRECATED

HTML CACHE AVAILABLE IN RAILS 4

FRAGMENT CACHE

RAILS CACHE

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

ActiveSupport::Cache::Store

FileStore MemoryStore

NullStore MemCacheStore

HOW TO USE IT

Rails.cache.write 'foo', 'bar' Rails.cache.fetch 'foo' Rails.cache.write :foo, {a: 'b'}

FRAGMENT CACHING

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

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 CACHING

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

FRAGMENT CACHING

<% cache [:recent, event] do %><%= render event %>

<% end %>

FRAGMENT CACHING

ACTIVESUPPORT::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 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

FRAGMENT CACHING

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

<% end %>

PROBLEMA COM TEMPLATE

CACHE Digests

<!-- app/views/events/show.html.erb --><% cache ["v1", @event] do%>

<h1>Team: <%= @event.title %></h1>

<%= render @event.attendees %><% end %>

<!-- app/views/attendees/_attendee.html.erb --><% cache ["v1", attendee] do %>

<span><%= attendee.name %></span><span><%= attendee.email %></span>

<% end %>

CACHE Digests

����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  VIEWS/V1/ATTENDEES/1-20121220141922����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  VIEWS/V1/ATTENDEES/2-20121220141922����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  VIEWS/V1/EVENTS/2-20121220141922����������� ������������������  

CACHE Digests

����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  VIEWS/ATTENDEES/1-20121220141922/74865FCB3E2752A0928FA4F89B3E4426����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  VIEWS/ATTENDEES/2-20121220141922/74865FCB3E2752A0928FA4F89B3E4426����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  VIEWS/EVENTS/2-20121220141922/4277F85C137009873C093088EF609E60����������� ������������������  

RUSSIAN DOLL

Russian Doll

Russian Doll

<% cache(cache_key_for_attendees) do %>All available attendees:<% Attendee.all.each do |a| %><% cache(a) do %><p><%= a.name %></p>

<% end %><% end %>

<% end %>

KNOWING ISNOT ENOUGH WE MUST APPLY

WILLING ISNOT ENOUGH WE MUST DO

Recommended