我们有一些超量的API,比如/api/heavy,它会在高峰时间减缓我们的系统,我们做了一些基准测试,如果同时请求计数大于200,系统会变慢,如果大于600,我们的系统就变得不可用了。
我们现在无法添加redis或memcached层,因为它需要更新源代码,这对于某些契约问题来说现在是不可能的。
所以我们想把一些缓存服务器放在API服务器前面,当请求速率> 500时缓存这些API 10秒,当请求速率> 150时缓存3秒。
我们如何使用Nginx或Varnish来做到这一点?或者其他解决方案?CDN?
发布于 2018-05-10 01:02:54
您可以通过nuster高速缓存服务器来实现这一点。
# cache /heavy for 100 seconds if be_conn greater than 10
acl heavypage path /heavy
acl tooFast be_conn ge 100
nuster rule heavy ttl 100 if heavypage tooFast我不知道API是私有的还是共享的?如果它是私有的,这意味着每个用户的API结果不同,您还可以按以下方式缓存每个用户的/api/heavy:
nuster rule heavy key method.scheme.host.uri.cookie_sessionID ttl 100 if heavypage tooFast希望这能有所帮助
发布于 2018-05-09 10:11:39
使用清漆的可能方法:在vcl_recv期间使用Redis VMOD (免责声明:我是作者)或一些节流的VMOD (例如https://github.com/varnish/varnish-modules中包含的vsthrottle )来检查/更新到API端点的请求率。如果没有超出限制,则跳过缓存,只需执行pass。否则,在hash期间按首选的方式执行vcl_backend_response和缓存。如果需要一个以上的限制,则可以很容易地将其推广。
vsthrottle比Redis方法简单得多,但显然是每个Varnish实例的本地特性。通常,这对于节流场景来说是可以的,所以在大多数情况下不需要向堆栈中添加Redis。
https://serverfault.com/questions/911374
复制相似问题