Nginx

如何根據請求率記憶體一些請求?

  • May 10, 2018

我們有一些超重的API,比如/api/heavy高峰期會拖慢我們的系統,我們做了一些基準測試,如果同時請求數大於200,系統就會變慢,如果大於600,我們的系統就會變得不可用。

我們現在無法添加redismemcached分層,因為它需要更新原始碼,這對於某些合約問題目前是不可能的。

所以我們正在考慮在我們的 API 伺服器前面放置一些記憶體伺服器,當請求率 > 500 時記憶體這些 API 10 秒,當速率 > 150 時記憶體 3 秒。

我們如何使用Nginxor來做到這一點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. 否則hashvcl_backend_response. 如果需要多個限制,這可以很容易地概括。

vsthrottle比 Redis 方法簡單得多,但顯然對於每個 Varnish 實例都是本地的。通常這對於節流場景來說是可以的,因此在大多數情況下不需要將 Redis 添加到您的堆棧中。

引用自:https://serverfault.com/questions/911374