我正在尝试在REST API上实现一些限制。 typical approach在某个阈值之后阻止请求(403
或429
响应)。但是,我看到one api会在响应中添加延迟。
当您拨打API时,我们会查看您在过去五分钟内的平均每秒呼叫次数(c / s)。这是将要发生的事情:
超过3c / s,我们添加了2秒延迟
超过5c / s,我们添加了4秒延迟
超过7c / s,我们加上5秒延迟
从客户的角度来看,我认为这比回复错误要好。可能发生的最糟糕的事情是你会放慢速度。
我想知道如何在不对应用服务器产生负面影响的情况下实现 。即,要添加这些延迟,服务器需要保持请求处于打开状态,从而导致请求处理器越来越繁忙,这意味着新请求的容量越来越小。
实现这一目标的最佳方式是什么?(即这是否可以在Web服务器/负载均衡器上完成,以便应用程序服务器不会受到负面影响?是否存在某种形式?可以为此目的添加的限制层?)
我们正在使用Django / Tastypie,但问题更多的是建筑/概念层面。
答案 0 :(得分:3)
如果您使用的是同步应用程序服务器,这是Django应用程序最常见的设置(例如,默认为--worker-class sync
的gunicorn),那么在应用程序中添加这样的延迟确实会对性能产生非常不利的影响。处理延迟请求的工作人员将在延迟期间被阻止。
但是您可以使用异步应用程序服务器(例如带有'--worker-class gevent`的gunicorn),然后开销应该可以忽略不计。处理延迟请求的工作人员能够在延迟正在进行时处理其他请求。
在反向代理服务器中执行此操作可能是更好的选择,因为它允许轻松灵活地调整策略。有an external nginx module for exactly such thing。