我正在寻找一种解决方案来保证客户端使用清漆的响应时间,而不会限制后端响应时间。
我有大约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)暂时是可以接受的。有什么方法可以随着时间的推移传播请求吗? (过时数据优先于错误)。
谢谢, 艾弗
答案 0 :(得分:0)
最简单的解决方案之一就是在缓存部分资源之前不要公开后端(在服务器重启后设置一些超时时间,例如10分钟)。