Posted on: June 25, 2020 12:53 AM
Posted by: Renato
Categories: OUTROS
Views: 90
Balaceamento de carga varnish
Para algo assim; balanceamento de carga. O aplicativo pode ser executado em vários servidores distribuindo a carga. Feito isso, é literalmente trivial (alguns cliques de botão) adicionar/remover servidores ou fazer com que a AWS faça isso automaticamente com dimensionamento automático. Como talvez a maior parte de sua carga seja durante o horário comercial dos EUA. Você pode ter 4 (ou qualquer outro) servidores de aplicativos em execução durante esses horários e ter apenas 1 ou 2 fora dos horários de pico.
Essa configuração também ajuda no failover, pois não há um único ponto de falha se você a configurar corretamente. Se um servidor de aplicativos ficar inativo, os outros servidores apenas pegarão a carga. Você destrói o servidor ruim e abre um novo sem tempo de inatividade para seu aplicativo. Isso também pode ser automatizado.
Este tipo de configuração é diferente de uma configuração típica. Você teria um servidor db separado que os outros servidores da web compartilham. Você usaria o S3 para armazenar todos os ativos em vez de um servidor individual, para que todos os servidores (agindo como um) tenham acesso aos mesmos dados. Se o usuário A fizer upload de um arquivo para o Servidor A, ele também precisa ser acessível pelos servidores B, C e D, para que não possa ser armazenado no servidor web individual.
O mesmo vale para as sessões. Um usuário pode fazer login no servidor A, mas a próxima solicitação é atendida pelo servidor B. Portanto, você precisa de um armazenamento de sessão comum que todos os servidores usem, como redis.
Agora você fica com webworkers burros, então você pode adicionar novos para aumentar a capacidade e a escala.
Aqui está um bom lugar para começar a aprender: https://serversforhackers.com/c/so-you-got-yourself-a-loadbalancer
Você também pode usar o serviço Laravel Forge para gerenciar tudo (e configurá-lo). Ele pode criar balanceadores de carga junto com servidores.
https://laracasts.com/discuss/channels/laravel/laravel-website-with-1500000-users-at-the-same-time
- https://github.com/spatie/laravel-varnish
- https://freek.dev/663-using-varnish-on-a-laravel-forge-provisioned-server
Você pode implementar o cashing usando um middleware no Laravel. Aqui está o código do middleware que estou usando.
- php artisan make:middleware CacheResponse
public function handle($request, Closure $next, $ttl=1440)
{
if(authenticate_user() != null || $request->isMethod('post') || session()->get('success'))
return $next($request);
$params = $request->query(); unset($params['_method']); ksort($params);
$key = md5(url()->current().'?'.http_build_query($params));
if($request->get('_method')=='purge')
Cache::forget($key);
if(Cache::has($key)){
$cache = Cache::get($key);
$response = response($cache['content']);
$response->header('X-Proxy-Cache', 'HIT');
}
else {
$response = $next($request);
if(!empty($response->content()))
Cache::put($key,['content' => $response->content(), 'headers' => array_map(function($element){ return implode(',', $element); }, $response->headers->all())],$ttl);
$response->header('X-Proxy-Cache', 'MISS');
}
return $response;
}
Aqui está a explicação do código acima. Melhore o desempenho do servidor armazenando em cache a resposta do servidor
<?php
namespace App\Http\Middleware;
use Closure;
use Cache;
class CacheResponse
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next, $ttl=1440)
{
if(auth()->user() != null || $request->isMethod('post'))
return $next($request);
$params = $request->query(); unset($params['_method']); ksort($params);
$key = md5(url()->current().'?'.http_build_query($params));
if($request->get('_method')=='purge')
Cache::forget($key);
if(Cache::has($key)){
$cache = Cache::get($key);
$response = response($cache['content']);
$response->header('X-Proxy-Cache', 'HIT');
}
else {
$response = $next($request);
if(!empty($response->content()))
Cache::put($key,['content' => $response->content()],$ttl);
$response->header('X-Proxy-Cache', 'MISS');
}
return $response;
}
}
Now register this middleware in “app/Http/Kernel.php” file under the $routeMiddleware array.
'cacheable'=>\App\Http\Middleware\CacheResponse::class,
Usage:
Route::get('/','HomeController@index')->middleware('cacheable:5');
laravel cache remember
public function index() {
$minutes = 1440; # 1 day
$posts = Cache::remember('posts', $minutes, function () {
return Post::get();
});
return $posts;
}
laravel cache
Cache::put('key', 'value', $seconds);
Cache::rememberForever('users', function () {
return DB::table('users')->get();
});
Cache::get('key');
Cache::has('key');
Cache::pull('key');
Donate to Site
Renato
Developer