1

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

我有大约 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 分钟并重新启动它后(而 varnish 在宽限期内提供陈旧数据),许多不同的资源(在 TTL 之外但在宽限内)在后端同时获取。这对数据库造成了沉重的打击,并且在 3 秒内没有提供任何资源,也没有缓存任何资源。

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

谢谢,艾弗

4

1 回答 1

0

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

于 2011-03-13T22:22:01.337 回答