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