限制清漆客户端等待时间,而不是后端时间

时间:2011-03-03 23:09:10

标签: java reverse-proxy varnish

我正在寻找一种解决方案来保证客户端使用清漆的响应时间,而不会限制后端响应时间。

我有大约100种不同的资源(http://host/resource.js?id = 1等),这些资源平均在一秒钟内计算在后端。资源由varnish缓存,因此每个资源可以同时提供给许多客户端。资源包括为同步(页面阻止)javascript,因此响应应该快速提供(例如3秒)。因为我想保证客户端响应时间,所以我想不出比在这3秒内配置后端超时更好的解决方案。 vcl的示例如下:

backend mybackend {
  .host = "127.0.0.1";
  .port = "8080";
  .connect_timeout = 100ms;
  .first_byte_timeout = 3s;
  .between_bytes_timeout = 3s;
  .probe = {
     .url = "/resource?id=1";
     .timeout = 3s;
     .window = 4;
     .threshold = 4;
     .interval = 15s;
   }
}

sub vcl_recv {
  set req.backend = mybackend;
  set req.grace = 5d;
  return (lookup);
}

sub vcl_fetch {
  set obj.ttl = 2m;
  set obj.grace = 5d;
  return (deliver);  
}

我的问题如下。在我停止后端5分钟并重新启动它之后(当清漆在宽限期内提供陈旧数据时),在后端同时获取许多不同的资源(超出TTL但在宽限期内)。这会严重打击数据库,并且3秒内不会传递任何资源,也不会缓存任何内容。

如何避免此问题?我想保证客户端响应时间,但不限制后端响应时间。失败(虚拟javascript)暂时是可以接受的。有什么方法可以随着时间的推移传播请求吗? (过时数据优先于错误)。

谢谢, 艾弗

1 个答案:

答案 0 :(得分:0)

最简单的解决方案之一就是在缓存部分资源之前不要公开后端(在服务器重启后设置一些超时时间,例如10分钟)。