Nginx
如何根據請求率記憶體一些請求?
我們有一些超重的API,比如
/api/heavy
高峰期會拖慢我們的系統,我們做了一些基準測試,如果同時請求數大於200,系統就會變慢,如果大於600,我們的系統就會變得不可用。我們現在無法添加
redis
或memcached
分層,因為它需要更新原始碼,這對於某些合約問題目前是不可能的。所以我們正在考慮在我們的 API 伺服器前面放置一些記憶體伺服器,當請求率 > 500 時記憶體這些 API 10 秒,當速率 > 150 時記憶體 3 秒。
我們如何使用
Nginx
or來做到這一點Varnish
?還是其他解決方案?CDN?
您可以通過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
希望這可以幫助
使用 Varnish 的可能方法:在
vcl_recv
使用Redis VMOD(免責聲明:我是作者)或一些節流 VMOD(例如vsthrottle
包含在https://github.com/varnish/varnish-modules中)檢查/更新 API 端的請求率期間-觀點。如果沒有超過限制,則只需執行pass
. 否則hash
在vcl_backend_response
. 如果需要多個限制,這可以很容易地概括。
vsthrottle
比 Redis 方法簡單得多,但顯然對於每個 Varnish 實例都是本地的。通常這對於節流場景來說是可以的,因此在大多數情況下不需要將 Redis 添加到您的堆棧中。