有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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