架构师日记——Varnish的Grace模式和Saint模式

GRACE模式

当几个客户端请求同一个页面的时候,varnish只发送一个请求的后端服务器,然后让那个其他几个请求挂起等待返回结果,返回结果后,复制请求结果发送给客户端。
如果你的服务器每秒有数千万的点击率,那么这个队列是庞大的,没有用户喜欢等待服务器响应,为了解决这个问题,可以指示varnish去保持缓存的对象超过他们的TTL(就是该过期的,先别删除),而且去提供旧内容给正在等待的请求。
为了提供旧的内容,首先我们必须有内容去提供。使用以下VCL,以使varnish保持所有对象超出了他们的TTL30分钟。

sub vcl_fetch{
    set bersp.grace = 30m;//grace缓存30分钟
    if ($req.request == "GET" && req.uri ~ "\.(jpg|png|ico)$"){
        set bersp.ttl = 1d;//ttl缓存1天,一天之后再使用grace
    }
}

这样,varnish还不会提供旧对象。为了启用varnish去提供旧对象,我们必须在请求上开启它。下面表示,我们接收15s的旧对象:

sub val_recv{
    set req.grace = 15s;
}

可以配合健康情况动态调节旧内容的时间,如果不健康则提供旧一点的旧内容

if(! req.backend.healthy){
    set req.grace = 5m;
}else{
    set req.grace =15s;
}

Saint模式

神圣模式可以让你抛弃一个后端服务器的某个页面,并尝试从其他服务器获取,或提供缓存中的旧内容。让我们看看如何在VCL中开启:

sub vcl_fetch{
    if(bersp.status = 500){
        set bersp.saintmode = 10s;
        return(restart);
    }
    set bersp.grace = 5m;
}

设置bersp.saintmode为10秒时,varnish会不请求该服务器10秒。或多或少可以算是一个黑名单。restart被执行时,如果我们有其他后端可以提供该内容,varnish会请求它们。当没有其他后端可用,varnish就会提供缓存中的旧内容

你可能感兴趣的:(架构师,架构师,后端服务,缓存)