2013-02-28 69 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