Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Cache em aplicações web

860 views

Published on

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

Published in: Technology
  • Be the first to comment

Cache em aplicações web

  1. 1. em aplicações web cache @jcemer
  2. 2. jcemer.com twitter.com/jcemer
  3. 3. globo.com talentos.globo.com
  4. 4. Cache is a hardware or software component that stores data so future requests for that data can be served faster - Wikipedia
  5. 5. There are only two 
 hard things in computer science: cache invalidation and naming things. - Phil Karlton 😓
  6. 6. Caching and RAM is the answer to everything - about Flickr Architecture
  7. 7. Cache é um dos segredos da escalabilidade e boa performance
  8. 8. esta palestra é sobre algumas práticas utilizadas na globo.com e em especial no Globo Play 😊
  9. 9. Onde pode haver cache? • navegador do usuário • rede mundial de computadores • servidor da sua aplicação
  10. 10. navegador cache no
  11. 11. Caching would be useless if it did not significantly improve performance - HTTP/1.1 specification
  12. 12. Recursos necessários para exibir uma página podem ser reutilizados durante a navegação
  13. 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. 14. Os cabeçalhos de resposta do HTTP estabelecem como e se o cache pode ser feito
  15. 15. GET /main.css HTTP/1.1 Host: jcemer.com
  16. 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. 17. permite que a resposta da requisição seja armazenada no cache Cache-Control: max-age=604800 Cabeçalho de resposta
  18. 18. folha de estilo é requisitada uma única vez durante a navegação 😄 😄
  19. 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. 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. 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. 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. 23. GET /main.css HTTP/1.1 Host: jcemer.com If-Modified-Since: Mon, 12 Sep 2016 15:23:17 GMT
  24. 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. 25. Práticas como esta modificam completamente a experiência do usuário
  26. 26. rede cache na
  27. 27. Content delivery network (CDN) is a globally distributed network 
 of proxy servers - Wikipedia
  28. 28. permite dar liberdade para servidores de cache intermediários Cache-control: public
  29. 29. Documentação de como fazer cache dos vídeos da globo.com https://github.com/globocom/Globo-Live-Cache
  30. 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. 31. servidor cache no
  32. 32. cache server
  33. 33. O servidor de cache intermedia a comunicação com a aplicação ou demais servidores
  34. 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. 35. • Varnish • Squid • nginx Quais ferramentas existem? https://varnish-cache.org http://www.squid-cache.org https://www.nginx.com
  36. 36. nginx pode operar como um proxy reverso e como cache
  37. 37. location / { proxy_pass http://otherserver; } todas as requisições são repassadas para outro servidor
  38. 38. proxy_cache_path /path/to/cache; 
 location / { proxy_pass http://otherserver; proxy_cache cache; } caching ativado!
  39. 39. 😄
  40. 40. Os cabeçalhos das respostas definem os tempos de cache assim como em um navegador
  41. 41. t1 t2 t1 requisições em tempos diferentes
  42. 42. t1 t1 requisições em um mesmo instante! 😓
  43. 43. proxy_cache_lock on; proxy_cache_lock_timeout 180; apenas a primeira request por determinado recurso é encaminhada
  44. 44. t1 t1 t1 😄
  45. 45. Requisições subsequentes a um recurso ficarão aguardando que o cache seja atualizado
  46. 46. 😞 e caso minha rede interna falhe?
  47. 47. proxy_cache_use_stale timeout error http_500; permite entregar conteúdo antigo caso algum erro aconteça
  48. 48. 😄 😞
  49. 49. e caso minha aplicação falhe? 🤒
  50. 50. proxy_cache_use_stale http_500; permite entregar conteúdo antigo caso a aplicação retorne erro
  51. 51. 😄 🤒
  52. 52. Esta prática pode garantir que seu produto não caia
  53. 53. Cache é também uma excelente estratégia de tolerância a falhas
  54. 54. proxy_cache_use_stale updating; permite entregar conteúdo antigo para requisições subsequentes
  55. 55. 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
  56. 56. aplicação cache na
  57. 57. Cache na aplicação é utilizado para diminuir o tempo de resposta de determinadas operações
  58. 58. • computações complexas • dados comuns a certas requisições O que pode ser cacheado?
  59. 59. def program @program ||= Program.find(@program_id) end Video class
  60. 60. Memoization é a prática de armazenar o resultado de operações para evitar futuras execuções
  61. 61. def program @program = Program.find(program_id) unless 
 defined? @program end https://github.com/rails/rails/commit/ 36253916b0b788d6ded56669d37c96ed05c92c5c Video class
  62. 62. Memoization é ideal para operações de objetos instanciados durante uma requisição
  63. 63. Memoization em objetos instanciados durante uma requisição possibilita 
 pouco reuso 😓
  64. 64. $program = Program.find(program_id) 😓
  65. 65. Objetos instanciados uma única vez no ciclo de vida da aplicação servem como 
 in-memory cache
  66. 66. cache.fetch(program_id) do Program.find(program_id) end http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html ActiveSupport::Cache::Store
  67. 67. Resultados armazenados em objetos vitalícios necessitam de um 
 tempo de expiração 😓
  68. 68. cache.write(key, value, expires_in: 1.minute) http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html ActiveSupport::Cache::Store
  69. 69. node-cache https://github.com/ptarjan/node-cache cache.put(key, value, 6000)
  70. 70. Toda aplicação possui um limite prático de memória 😓
  71. 71. https://github.com/ptarjan/node-cache/issues/77 😓 node-cache: projeto com 540 stars
  72. 72. 🔥
  73. 73. when the cache exceeds the allotted size, a cleanup will occur which tries to prune the cache down ActiveSupport::Cache:: MemoryStore
  74. 74. A moda agora é escalar horizontalmente as aplicações em diversos containers 😓
  75. 75. https://tsuru.io
  76. 76. Never assumes that anything cached in memory or on disk will be available on 
 a future request https://12factor.net/processes
  77. 77. Uma storage cache-valor pode servir como cache para seus containers
  78. 78. • Redis • Memcached Quais storages chave +valor existem? http://redis.io http://memcached.org
  79. 79. http://redis.io
 gem redis-store
  80. 80. Redis suporta diferentes políticas para gerir o máximo espaço consumido
  81. 81. 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
  82. 82. O uso de um serviço para cache introduz um ponto único de falha 😓
  83. 83. redis ativado * gráfico do API gateway do Globo Play
  84. 84. 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
  85. 85. Sharding pode escalar o cache horizontalmente e melhorar a tolerância a falhas https://github.com/twitter/twemproxy
  86. 86. http://www.slideshare.net/ShashiShekarMadappa/evcache-at-netflix
 https://github.com/Netflix/EVCache
  87. 87. http://www.slideshare.net/ShashiShekarMadappa/evcache-at-netflix
 https://github.com/Netflix/EVCache
  88. 88. http://www.slideshare.net/ShashiShekarMadappa/evcache-at-netflix
 https://github.com/Netflix/EVCache
  89. 89. https://www.youtube.com/watch?v=Rzdxgx3RC0Q
  90. 90. Diversas instâncias da aplicação poderão tentar revalidar o resultado 
 ao mesmo tempo 😓
  91. 91. dado expirado 
 no cache! 😁
  92. 92. 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
  93. 93. race_condition_ttl revalida o cache editando o valor armazenado
  94. 94. race_condition_ttl revalida o cache editando o valor armazenado mas a leitura e escrita não é transacional!
  95. 95. 😁 😳
  96. 96. Solução #1 Utilizar algum artifício de query cache no próprio banco de dados 😒
  97. 97. Solução #2 Manter o cache sempre válido com a ajuda de um worker 🙂
  98. 98. Solução #3 Reescrever toda sua aplicação em Elixir 😎
  99. 99. Solução #4 Criar um micro-serviço para esta operação crítica protegido por um servidor de cache 😍
  100. 100. 😄
  101. 101. nginx pode ser um ótimo aliado para proteger serviços internos
  102. 102. https://github.com/plataformatec/faraday-http-cache
  103. 103. Respeite os cabeçalhos HTTP #1
  104. 104. Cache é assunto sério #2
  105. 105. Monitore hit/miss e outras métricas da sua estratégia de cache #3
  106. 106. Pondere bem antes de escolher uma estratégia de cache #4
  107. 107. foi um prazer obrigado @jcemer

×