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

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

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

我们现在无法添加redismemcached分层,因为它需要更新源代码,而由于某些合同问题,目前无法实现。

因此,我们考虑在 API 服务器前面放置一些缓存服务器,当请求率 > 500 时将这些 API 缓存 10 秒,当请求率 > 150 时将这些 API 缓存 3 秒。

我们如何使用Nginx或来实现这一点Varnish?或者其他解决方案?CDN?

答案1

您可以通过以下方式实现此目的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

希望这可以帮助

答案2

使用 Varnish 的可能方法:vcl_recv使用过程中Redis VMOD(免责声明:我是作者)或一些节流 VMOD(例如vsthrottle包含在https://github.com/varnish/varnish-modules) 检查/更新对 API 端点的请求率。如果不超过限制,则跳过缓存,只需执行pass。否则,执行hash并在 期间按偏好缓存vcl_backend_response。如果需要多个限制,这可以很容易地概括。

vsthrottle比 Redis 方法简单得多,但显然每个 Varnish 实例都只使用本地方法。通常对于节流场景来说,这没问题,因此在大多数情况下无需将 Redis 添加到堆栈中。

相关内容