文档章节

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

wild-life
 wild-life
发布于 2015/06/19 16:54
字数 730
阅读 80
收藏 0

Misbehaving servers

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

Grace mode

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

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

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

  • 没有用户喜欢等待;

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

为了提供给用户过期的内容,我们必须先有这些内容。因此我们在VCL中配置如下,使得varnish能在内容过期过后依然保持2分钟:

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

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

我们可以在vcl_hit中增加代码来影响这个逻辑的工作。默认VCL是这样:

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语句块:

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参数开启此功能。


© 著作权归作者所有

wild-life
粉丝 17
博文 94
码字总数 56147
作品 0
成都
技术主管
私信 提问
varnish 4.0 官方文档翻译4-varnish用户手册概况

The Varnish Users Guide varnish用户手册 varnish 文档包含三个主要的文档: The Varnish Tutorial 解释一些基本的东西让你开始使用varnish The Varnish Users Guide 说明varnish怎样工作以...

wild-life
2015/05/09
0
0
varnish 4.0 官方文档翻译16-Backend servers/M/B/D/H

Backend servers varnish有"后端"或者"源"服务器的概念。backend server提供给varnish加速的内容。 第一步设置是告诉varnish从哪儿找到backend server。使用你喜欢的编辑器打开varnishd引入的......

wild-life
2015/06/18
0
0
varnish 4.0 官方文档翻译3-简要教程

varnish 4.0简要教程 这部分教程包含了varnish基本原理。囊括了什么是varnish、它怎样工作,同时也包含了开始使用和运行varnish。这部分过后你可能想继续了解用户向导(varnish用户引导)。 如...

wild-life
2015/05/08
0
0
Varnish3.0中文入门教程-应用篇3

十六、Directors Director(不知道怎么翻译合适,所以就保留了) 你也可以将几个后端分组为一组后端。这些组称为directors。这可以提高性能和灵活度。你可以定义几个后端,并把它们归到一个d...

enjoyer18
2013/09/23
0
0
varnish 4.0 官方文档翻译1-管理员文档

varnish 管理员文档 varnish缓存是web应用加速器,同时也作为http反向缓存代理被人熟知。你可以安装varnish在任何http的前端,同时配置它缓存内容。varnish真的很快,单个代理的分发速度可以...

wild-life
2015/05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springmvc集成cas,并解决前后端分离情况

1.最近项目需要集成已经存在的cas系统。 但是目前已集成的系统都是jsp。而我们项目是前后端分离开发(伪),没有分开部署。 2.cas原理就不介绍了 网上例子很多。基本都是使用302重定向实现的...

起名字什么的太麻烦了
31分钟前
3
0
HDFS-原理

1. 写操作

叶枫啦啦
今天
2
0
聊聊elasticsearch的MembershipAction

序 本文主要研究一下elasticsearch的MembershipAction MembershipAction elasticsearch-6.7.1/server/src/main/java/org/elasticsearch/discovery/zen/MembershipAction.java public class M......

go4it
今天
3
0
Redis集群

Redis cluster tutorial Redis集群提供一种方式自动将数据分布在多个Redis节点上。 Redis Cluster provides a way to run a Redis installation where data is automatically sharded acros......

OSC首席混子
今天
3
0
AWS codecommit 触发jenkins工作

在gitlab和github上面都有直接发送webhook的配置,但是在AWS上面是没有的直接配置webhook触发jenkins构建的设置的。 通过查看AWS多个service的官方文档,找到了解决方案,方案如下: (1)在c...

守护-创造
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部