varnish 4.0 官方文档翻译17-Misbehaving servers

Misbehaving servers

varnish有个关键特性,为misbehaving(行为不端,诡异的)web服务器或者应用服务器提供保护的能力。html

Grace mode

当几个客户端请求同一个页面的时候,varnish只发送一个请求到后端服务器,而后让其余几个请求挂起并等待返回结果;得到结果后,其它请求再复制后端的结果发送给客户端。有些产品中须要调用其余来将请求合并,而varnish自动作这些。web

但若是同时有数以千计的请求,那么这个等待队列将变得庞大,这将致使2类潜在问题:后端

  • 惊群问题(thundering herd problem),即忽然释放大量的线程去复制后端返回的结果,将致使负载急速上升;缓存

  • 没有用户喜欢等待;服务器

为了解决这类问题,能够配置varnish在缓存对象因超时失效后再保留一段时间,以给那些等待的请求返回过时的内容(stale content)。app

为了提供给用户过时的内容,咱们必须先有这些内容。所以咱们在VCL中配置以下,使得varnish能在内容过时事后依然保持2分钟:异步

sub vcl_backend_response {
    set beresp.grace = 2m;
}

如今Varnish容许在对象过时后2分钟内提供给客户端。同时varnish也将刷新这个对象。刷新动做是异步发生的,发生在新的对象将替换老对象的同时。ide

咱们能够在vcl_hit中增长代码来影响这个逻辑的工做。默认VCL是这样:fetch

sub vcl_hit {
    if (obj.ttl >= 0s) {
        // A pure unadultered hit, deliver it
        return (deliver);
    }
    if (obj.ttl + obj.grace > 0s) {
        // Object is in grace, deliver it
        // Automatically triggers a background fetch
        return (deliver);
    }
    // fetch & deliver once we get the result
    return (fetch);
}

若是你开启了健康检测,要是后端有问题只能提供给客户端过时的对象时,你就能检测到。用以下的if语句替换掉上面的第二个if语句块:spa

if (!std.healthy(req.backend_hint) && (obj.ttl + obj.grace > 0s)) {
    return (deliver);
} else {
    return (fetch);
}

总之,优雅模式解决下面2个问题:

  • 提供过时内容给客户端以免请求堆积。

  • 若是你容许varnish能够提供过时的内容。


Using inline C to extend Varnish

你可使用inline C来扩展Varnish。注意,这种方式您可能严重损毁varnish。C代码运行在Varnish缓存进程中,若是你的C代码有错误,缓存进程将crash。

一个使用inline C的功能是记录日志到syslog:

# The include statements must be outside the subroutines.
C{
        #include <syslog.h>
}C

sub vcl_something {
        C{
                syslog(LOG_INFO, "Something happened at VCL line XX.");
        }C
}

要使用inline C你须要经过vcc_allow_inline_c参数开启此功能。

相关文章
相关标签/搜索