Estratégias de Caching - Escalando sua aplicação para milhões de visitas

799efab30a6db8436e6941dfd372c66f?s=47 Zizaco
June 07, 2016

Estratégias de Caching - Escalando sua aplicação para milhões de visitas

Escalando sua aplicação para milhões de visitas: Estratégias de Caching

Vídeo da Apresentação (2016/06/07): https://youtu.be/z8qkUITz5rU

Source-code de exemplo: https://gist.github.com/Zizaco/1777fe7566f334dc04d83b17f7832007

O que é Cache?
Guardar algo temporáriamente para uso posterior.

Por que usar Cache?
Encurtar o tempo de acesso, reduzir a latência e melhorar o input/output.

Caching é usado para melhorar a performance de uma aplicação.

Laravel Request Lifecycle
- HTTP
- WebServer
- HTTP Kernel
- Middlewares
- index.php
- autoload
- Routes
- Controller
- External Services
- File System
- Databases
- Models / Services
- View

autoload:

APC & Zend OpCache (OpCode Cache)
Até 3x mais rápido

Routes:

Laravel's Route Caching
"Using the route cache will drastically decrease the amount of time it takes to register all of your application's routes. In some cases, your route registration may even be up to 100x faster"
php artisan route:cache
Até 3x mais rápido

Middleware (action caching):

public function handle($request, Closure $next)
{
$path = $request->path();

if ($this->cacheManager->isCached($path) && $this->canBeCached($request)) {
return $this->cacheManager->get($path);
}

return $next($request);
}

...

public function terminate($request, $response)
{
$path = $request->path();

if ($this->cacheManager->isCached($path) || !$this->canBeCached($request)) {
return;
}

$this->cleanCookies($response);
$this->cacheManager->cache($path, $response);
}

View:

@include
@cached_include

function cached_include($view, $vars = null, $time = 60)
{
$cacheKey = $view . md5(serialize($vars));

return Cache::remember(
$cacheKey,
$time,
function () use ($view) {
return view(
$view,
is_array($vars) ? $vars : array_except(get_defined_vars(), ['__data', '__path'])
)->render();
}
);
}

Blade::extend(
function ($view) {
$pattern = '/@cached_include\((.*)\)/';

return preg_replace($pattern, "", $view);
}
);

Model / Services:

General Caching

Reverse Proxy:

Reverse Proxy (ou CDN)
"A reverse proxy can reduce load on its origin servers by caching content [...] also known as web acceleration. Proxy caches of this sort can often satisfy a considerable number of website requests, greatly reducing the load on the origin server(s)."

Varnish Cache
Akamai
Nginx

Standard HTTP Caching:

Lições Aprendidas para tirar o máximo do Caching:

- Feature flipping ("switch" central para desativar cache)
- Criar serviços "CacheManager" para cachear e invalidar quando necessário.
- Comece o quanto antes
- Compactar antes de cachear pode ser uma boa ideia.
- Cache local VS Cache compartilhado
- CDN

Fontes:

Speed up PHP with APC - Jacob Nicholson
http://www.inmotionhosting.com/support/website/what-is/speed-up-php-with-apc
PHP Performance I: Everything You Need To Know About OpCode Caches - Davey Shafik
https://support.cloud.engineyard.com/hc/en-us/articles/205411888-PHP-Performance-I-Everything-You-Need-to-Know-About-OpCode-Caches
Laravel Documentation: Route Caching
https://laravel.com/docs/master/controllers#route-caching
Caching Routes Using Filters - Mark van Eijk
http://markvaneijk.com/caching-routes-using-filters-in-laravel-4
Google Developers: HTTP Caching
https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching
Varnish Cache
https://varnish-cache.org/
Nginx: Reverse Proxy with Caching
https://www.nginx.com/resources/wiki/start/topics/examples/reverseproxycachingexample/

799efab30a6db8436e6941dfd372c66f?s=128

Zizaco

June 07, 2016
Tweet

Transcript

  1. 3.

    Por que usar Cache? Encurtar o tempo de acesso, reduzir

    a latência e melhorar o input/output. Caching é usado para melhorar a performance de uma aplicação.
  2. 4.

    Laravel Request Lifecycle HTTP:// WebServer HTTP Kernel Middlewares index.php autoload

    Routes Controller External Services File System Databases Models / Services View
  3. 5.

    Laravel Request Lifecycle HTTP:// WebServer HTTP Kernel Middlewares index.php autoload

    Routes Controller External Services File System Databases Models / Services Cache View
  4. 7.

    Laravel Request Lifecycle HTTP:// WebServer HTTP Kernel Middlewares index.php autoload

    Routes Controller External Services File System Databases Models / Services Cache View Cache
  5. 8.

    Laravel's Route Caching "Using the route cache will drastically decrease

    the amount of time it takes to register all of your application's routes. In some cases, your route registration may even be up to 100x faster" php artisan route:cache
  6. 9.

    Laravel Request Lifecycle HTTP:// WebServer HTTP Kernel Middlewares index.php autoload

    Routes Controller External Services File System Databases Models / Services Cache View Cache Cache
  7. 11.
  8. 12.

    Caching Middleware (actionCaching) HTTP Kernel Middlewares Routes Controller Database View

    HTTP Kernel Middlewares Routes Controller Database View Hard work
  9. 15.

    Laravel Request Lifecycle HTTP:// WebServer HTTP Kernel Middlewares index.php autoload

    Routes Controller External Services File System Databases Models / Services Cache View Cache Cache Cache
  10. 16.
  11. 17.

    View Caching (fragment Caching) View Object View Object Render Render

    View Object Render ... @include @include View Object View Object Render Render View Object @cached_include @include Render ...
  12. 18.

    View Caching (fragment Caching) View Object View Object Render Render

    View Object Render ... @include @include View Object View Object Render Render View Object @include Render ... @cached_include
  13. 21.

    Laravel Request Lifecycle HTTP:// WebServer HTTP Kernel Middlewares index.php autoload

    Routes Controller External Services File System Databases Models / Services Cache View Cache Cache Cache Cache
  14. 24.

    HTTP:// WebServer Cache Laravel Request Lifecycle HTTP Kernel Middlewares index.php

    autoload Routes Controller External Services File System Databases Models / Services Cache View Cache Cache Cache Cache
  15. 26.

    Reverse Proxy "A reverse proxy can reduce load on its

    origin servers by caching content [...] also known as web acceleration. Proxy caches of this sort can often satisfy a considerable number of website requests, greatly reducing the load on the origin server(s)."
  16. 28.

    HTTP:// WebServer Cache Laravel Request Lifecycle HTTP Kernel Middlewares index.php

    autoload Routes Controller External Services File System Databases Models / Services Cache View Cache Cache Cache Cache Cache
  17. 30.

    Laravel Request Lifecycle HTTP:// WebServer HTTP Kernel Middlewares index.php autoload

    Routes Controller External Services File System Databases Models / Services View
  18. 31.

    Laravel Request Lifecycle HTTP:// WebServer HTTP Kernel Middlewares index.php autoload

    Routes Controller External Services File System Databases Models / Services Cache Cache Cache Cache View Cache Cache Cache
  19. 34.

    Lições Aprendidas • Feature flipping ("switch" central para desativar cache)

    • Criar serviços "CacheManager" para cachear e invalidar quando necessário.
  20. 35.

    Lições Aprendidas • Feature flipping ("switch" central para desativar cache)

    • Criar serviços "CacheManager" para cachear e invalidar quando necessário. • Comece o quanto antes
  21. 37.

    Lições Aprendidas • Compactar antes de cachear pode ser uma

    boa ideia. • Cache local VS Cache compartilhado.
  22. 38.

    Fontes Speed up PHP with APC - Jacob Nicholson http://www.inmotionhosting.com/support/website/what-is/speed-up-php-with-apc

    PHP Performance I: Everything You Need To Know About OpCode Caches - Davey Shafik https://support.cloud.engineyard.com/hc/en-us/articles/205411888-PHP-Performance-I-Everything-You-Need-to- Know-About-OpCode-Caches Laravel Documentation: Route Caching https://laravel.com/docs/master/controllers#route-caching Caching Routes Using Filters - Mark van Eijk http://markvaneijk.com/caching-routes-using-filters-in-laravel-4 Google Developers: HTTP Caching https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching Varnish Cache https://varnish-cache.org/ Nginx: Reverse Proxy with Caching https://www.nginx.com/resources/wiki/start/topics/examples/reverseproxycachingexample/