我们有一些超级繁重的 API,比如/api/heavy
,它会在高峰时段减慢我们的系统速度,我们做了一些基准测试,如果同时请求数大于 200,系统就会变慢,如果大于 600,我们的系统就会变得不可用。
我们现在无法添加redis
或memcached
分层,因为它需要更新源代码,而由于某些合同问题,目前无法实现。
因此,我们考虑在 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 添加到堆栈中。