我正在寻找一种解决方案来保证客户端响应时间与清漆,而不限制后端响应时间。
我有大约 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)。有没有办法随着时间的推移传播请求?(过时的数据优先于错误)。
谢谢,艾弗