Cache em aplicações web

Cache em aplicações web

Há uma famosa frase que dita ser invalidação de cache uma das mais difícil tarefas da Ciências da Computação. Esta palestra traz diferentes abordagens para armazenar dados em cache para aplicações Web. Tecnologias como HTTP, NGINX, Redis, cache em memória entre outras serão analisadas juntamente com algumas práticas para endereçar cache em diferentes lev

C5df370a883b65279af5a7ca94a5eed7?s=128

Jean Carlo Emer

September 24, 2016
Tweet

Transcript

  1. em aplicações web cache @jcemer

  2. jcemer.com twitter.com/jcemer

  3. globo.com talentos.globo.com

  4. Cache is a hardware or software component that stores data

    so future requests for that data can be served faster - Wikipedia
  5. There are only two 
 hard things in computer science:

    cache invalidation and naming things. - Phil Karlton
  6. Caching and RAM is the answer to everything - about

    Flickr Architecture
  7. Cache é um dos segredos da escalabilidade e boa performance

  8. esta palestra é sobre algumas práticas utilizadas na globo.com e

    em especial no Globo Play
  9. Onde pode haver cache? • navegador do usuário • rede

    mundial de computadores • servidor da sua aplicação
  10. navegador cache no

  11. Caching would be useless if it did not significantly improve

    performance - HTTP/1.1 specification
  12. Recursos necessários para exibir uma página podem ser reutilizados durante

    a navegação
  13. • documentos • imagens • scripts e folhas de estilo

    • requisições assíncronas O que pode ser cacheado? por alguns minutos por alguns meses por alguns meses por alguns minutos
  14. Os cabeçalhos de resposta do HTTP estabelecem como e se

    o cache pode ser feito
  15. GET /main.css HTTP/1.1 Host: jcemer.com

  16. GET /main.css HTTP/1.1 Host: jcemer.com HTTP/1.1 200 Date: Tue, 13

    Sep 2016 13:32:50 GMT Cache-Control: max-age=604800 guarde por 7 dias!
  17. permite que a resposta da requisição seja armazenada no cache

    Cache-Control: max-age=604800 Cabeçalho de resposta
  18. folha de estilo é requisitada uma única vez durante a

    navegação
  19. Novas requisições são disparadas quando o recurso está expirado ou

    o usuário força a atualização da página
  20. permitem adicionar mais informações sobre o recurso Last-Modified: Mon, 12

    Sep 2016 22:06:39 GMT
 Etag: W/"337e7-8HrLmYe6UGIUDolQeGLoyw" Cabeçalhos de resposta
  21. GET /main.css HTTP/1.1 Host: jcemer.com HTTP/1.1 200 OK Date: Tue,

    13 Sep 2016 13:32:50 GMT Last-Modified: Mon, 12 Sep 2016 15:23:17 GMT Cache-Control: max-age=604800 informação nova
  22. permitem reaproveitar o recurso caso a cópia em cache ainda

    seja válida If-Modified-Since: Mon, 12 Sep 2016 15:23:17 GMT If-Match: W/"337e7-8HrLmYe6UGIUDolQeGLoyw" Cabeçalhos de requisição
  23. GET /main.css HTTP/1.1 Host: jcemer.com If-Modified-Since: Mon, 12 Sep 2016

    15:23:17 GMT
  24. GET /main.css HTTP/1.1 Host: jcemer.com If-Modified-Since: Mon, 12 Sep 2016

    15:23:17 GMT HTTP/1.1 304 Not Modified Date: Tue, 13 Sep 2016 13:32:50 GMT Last-Modified: Mon, 12 Sep 2016 15:23:17 GMT Cache-Control: max-age=604800 <EOF>
  25. Práticas como esta modificam completamente a experiência do usuário

  26. rede cache na

  27. Content delivery network (CDN) is a globally distributed network 


    of proxy servers - Wikipedia
  28. permite dar liberdade para servidores de cache intermediários Cache-control: public

  29. Documentação de como fazer cache dos vídeos da globo.com https://github.com/globocom/Globo-Live-Cache

  30. Documentação de como fazer cache dos vídeos da globo.com TL;DR

    
 respeite os cabeçalhos das respostas https://github.com/globocom/Globo-Live-Cache
  31. servidor cache no

  32. cache server

  33. O servidor de cache intermedia a comunicação com a aplicação

    ou demais servidores
  34. • imagens • scripts e folhas de estilo • documentos

    comuns a todos os usuários O que pode ser cacheado? por alguns meses por alguns meses por alguns minutos
  35. • Varnish • Squid • nginx Quais ferramentas existem? https://varnish-cache.org

    http://www.squid-cache.org https://www.nginx.com
  36. nginx pode operar como um proxy reverso e como cache

  37. location / { proxy_pass http://otherserver; } todas as requisições são

    repassadas para outro servidor
  38. None
  39. proxy_cache_path /path/to/cache; 
 location / { proxy_pass http://otherserver; proxy_cache cache;

    } caching ativado!
  40. None
  41. Os cabeçalhos das respostas definem os tempos de cache assim

    como em um navegador
  42. t1 t2 t1 requisições em tempos diferentes

  43. t1 t1 requisições em um mesmo instante!

  44. proxy_cache_lock on; proxy_cache_lock_timeout 180; apenas a primeira request por determinado

    recurso é encaminhada
  45. t1 t1 t1

  46. Requisições subsequentes a um recurso ficarão aguardando que o cache

    seja atualizado
  47. e caso minha rede interna falhe?

  48. proxy_cache_use_stale timeout error http_500; permite entregar conteúdo antigo caso algum

    erro aconteça
  49. None
  50. e caso minha aplicação falhe?

  51. proxy_cache_use_stale http_500; permite entregar conteúdo antigo caso a aplicação retorne

    erro
  52. None
  53. Esta prática pode garantir que seu produto não caia

  54. Cache é também uma excelente estratégia de tolerância a falhas

  55. proxy_cache_use_stale updating; permite entregar conteúdo antigo para requisições subsequentes

  56. Varnish e Squid possuem estratégias melhores para revalidar o cache

    sem penalizar o usuário http://serverfault.com/questions/576402/nginx-serving-stale-cache- response-while-updating
  57. aplicação cache na

  58. Cache na aplicação é utilizado para diminuir o tempo de

    resposta de determinadas operações
  59. • computações complexas • dados comuns a certas requisições O

    que pode ser cacheado?
  60. def program @program ||= Program.find(@program_id) end Video class

  61. Memoization é a prática de armazenar o resultado de operações

    para evitar futuras execuções
  62. def program @program = Program.find(program_id) unless 
 defined? @program end

    https://github.com/rails/rails/commit/ 36253916b0b788d6ded56669d37c96ed05c92c5c Video class
  63. Memoization é ideal para operações de objetos instanciados durante uma

    requisição
  64. Memoization em objetos instanciados durante uma requisição possibilita 
 pouco

    reuso
  65. $program = Program.find(program_id)

  66. Objetos instanciados uma única vez no ciclo de vida da

    aplicação servem como 
 in-memory cache
  67. cache.fetch(program_id) do Program.find(program_id) end http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html ActiveSupport::Cache::Store

  68. Resultados armazenados em objetos vitalícios necessitam de um 
 tempo

    de expiração
  69. cache.write(key, value, expires_in: 1.minute) http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html ActiveSupport::Cache::Store

  70. node-cache https://github.com/ptarjan/node-cache cache.put(key, value, 6000)

  71. Toda aplicação possui um limite prático de memória

  72. https://github.com/ptarjan/node-cache/issues/77 node-cache: projeto com 540 stars

  73. None
  74. when the cache exceeds the allotted size, a cleanup will

    occur which tries to prune the cache down ActiveSupport::Cache:: MemoryStore
  75. A moda agora é escalar horizontalmente as aplicações em diversos

    containers
  76. None
  77. None
  78. https://tsuru.io

  79. Never assumes that anything cached in memory or on disk

    will be available on 
 a future request https://12factor.net/processes
  80. Uma storage cache-valor pode servir como cache para seus containers

  81. • Redis • Memcached Quais storages chave +valor existem? http://redis.io

    http://memcached.org
  82. http://redis.io
 gem redis-store

  83. Redis suporta diferentes políticas para gerir o máximo espaço consumido

  84. noeviction allkeys-lru 
 evict keys trying to remove the less

    recently used keys first volatile-lru 
 equals allkeys-lru but only among keys that have an expire set http://redis.io/topics/lru-cache
  85. O uso de um serviço para cache introduz um ponto

    único de falha
  86. redis ativado * gráfico do API gateway do Globo Play

  87. Redis suporta tolerância a falhas através de persistência em disco,

    replicação e sentinel http://redis.io/topics/persistence
 http://redis.io/topics/replication
 http://redis.io/topics/sentinel
  88. None
  89. Sharding pode escalar o cache horizontalmente e melhorar a tolerância

    a falhas https://github.com/twitter/twemproxy
  90. http://www.slideshare.net/ShashiShekarMadappa/evcache-at-netflix
 https://github.com/Netflix/EVCache

  91. http://www.slideshare.net/ShashiShekarMadappa/evcache-at-netflix
 https://github.com/Netflix/EVCache

  92. http://www.slideshare.net/ShashiShekarMadappa/evcache-at-netflix
 https://github.com/Netflix/EVCache

  93. https://www.youtube.com/watch?v=Rzdxgx3RC0Q

  94. Diversas instâncias da aplicação poderão tentar revalidar o resultado 


    ao mesmo tempo
  95. dado expirado 
 no cache!

  96. cache.fetch(key, race_condition_ttl: 10.seconds) do
 heavy_db_computation
 end http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html ActiveSupport::Cache::Store

  97. race_condition_ttl revalida o cache editando o valor armazenado

  98. race_condition_ttl revalida o cache editando o valor armazenado mas a

    leitura e escrita não é transacional!
  99. None
  100. Solução #1 Utilizar algum artifício de query cache no próprio

    banco de dados
  101. Solução #2 Manter o cache sempre válido com a ajuda

    de um worker
  102. Solução #3 Reescrever toda sua aplicação em Elixir

  103. Solução #4 Criar um micro-serviço para esta operação crítica protegido

    por um servidor de cache
  104. None
  105. nginx pode ser um ótimo aliado para proteger serviços internos

  106. https://github.com/plataformatec/faraday-http-cache

  107. Respeite os cabeçalhos HTTP #1

  108. Cache é assunto sério #2

  109. Monitore hit/miss e outras métricas da sua estratégia de cache

    #3
  110. Pondere bem antes de escolher uma estratégia de cache #4

  111. foi um prazer obrigado @jcemer