java限制客户端等待时间,而不是后端时间
我正在寻找一个解决方案,以保证客户端响应时间与清漆,而不限制后端响应时间
我有大约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)。有没有什么方法可以让请求随着时间的推移而分散?(过时数据优先于错误)
谢谢, 艾弗
# 1 楼答案
最简单的解决方案之一是,在缓存一些资源之前(服务器重启后设置一些超时时间,例如10分钟),不要让后端公开可用