2013-02-28 54 views
6

我想在我們的REST API上實現一些限制。 A typical approach在阻止請求的某個閾值之後(使用403429響應)。但是,我已經看到one api,它會將延遲添加到響應耽誤http api調用延遲

當您打電話給API時,我們會查看過去五分鐘內您每秒的平均通話量(c/s)。下面是會發生什麼:

  • 在3C /秒,我們可以添加2秒延遲

  • 爲超過5C /秒,我們增加4秒延遲

  • 在7C/s和我們加5秒延遲

從客戶端的角度來看,我認爲這比又回到一個錯誤要好。可能發生的最糟糕的是你會放慢速度。

我想知道如何實現而不會對應用服務器產生負面影響。即爲了增加這些延遲,服務器需要保持請求開放,使其保持越來越多的請求處理器繁忙,這意味着它具有較少的新請求進入的能力。

什麼是最好的方式來實現這一點?(即是這樣的東西,可以在Web服務器/負載均衡器來完成,這樣應用程序服務器不會受到消極影響?是否有某種可爲此目的而添加節流層?)

我們」重新使用Django/Tastypie,但問題更多的是架構/概念層面。

回答

3

如果您使用的同步應用程序服務器是Django應用程序最常用的設置(例如默認爲--worker-class sync的gunicorn),那麼在應用程序中添加這樣的延遲確實會對性能造成非常不利的影響。處理延遲請求的工作人員將在延遲期間被阻止。

但是,您可以使用異步應用程序服務器(例如gunicorn with'--worker-class gevent`),然後開銷應該可以忽略不計。處理延遲請求的工作人員能夠在延遲進行時處理其他請求。

在反向代理服務器中這樣做可能是一個更好的選擇,因爲它允許輕鬆靈活地調整策略。有an external nginx module for exactly such thing

+0

謝謝!看起來像我一直在尋找的東西(不知道是哪一個,但或者可能會這樣做)。 – gingerlime 2013-05-01 15:30:42

+0

這個'nginx-delay-module'能夠以任何方式從Django獲取指令嗎?例如,如果通過Django視圖識別濫用,我可以指示該插件延遲nginx方面的響應嗎?理想情況下,我想用這個來爲DRF編寫一個自定義的Throttle類。 – dtgq 2016-12-18 11:53:45