首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据请求率来缓存一些请求?

如何根据请求率来缓存一些请求?
EN

Server Fault用户
提问于 2018-05-09 01:45:08
回答 2查看 235关注 0票数 0

我们有一些超量的API,比如/api/heavy,它会在高峰时间减缓我们的系统,我们做了一些基准测试,如果同时请求计数大于200,系统会变慢,如果大于600,我们的系统就变得不可用了。

我们现在无法添加redismemcached层,因为它需要更新源代码,这对于某些契约问题来说现在是不可能的。

所以我们想把一些缓存服务器放在API服务器前面,当请求速率> 500时缓存这些API 10秒,当请求速率> 150时缓存3秒。

我们如何使用NginxVarnish来做到这一点?或者其他解决方案?CDN?

EN

回答 2

Server Fault用户

回答已采纳

发布于 2018-05-10 01:02:54

您可以通过nuster高速缓存服务器来实现这一点。

代码语言:javascript
复制
# 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

代码语言:javascript
复制
nuster rule heavy key method.scheme.host.uri.cookie_sessionID ttl 100 if heavypage tooFast

希望这能有所帮助

票数 1
EN

Server Fault用户

发布于 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。

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/911374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档