我正在尝试对 REST API 实施一些限制。 A典型方法 http://django-tastypie.readthedocs.org/en/latest/throttling.html在某个阈值之后阻止请求(带有403
or 429
回复)。然而,我见过one api http://apidocs.mailchimp.com/api/faq/#faq6这增加了一个延迟响应反而。
当您调用 API 时,我们将查看您在前五分钟内每秒的平均调用次数 (c/s)。将会发生以下情况:
-
超过 3c/s,我们添加 2 秒延迟
-
超过 5c/s,我们添加 4 秒延迟
-
超过 7c/s,我们添加 5 秒延迟
从客户的角度来看,我认为这比返回错误更好。最糟糕的情况就是你会放慢速度。
我想知道如何实现这一点不会对应用服务器产生负面影响。也就是说,为了增加这些延迟,服务器需要保持请求打开,导致越来越多的请求处理器忙碌,这意味着它处理新请求的能力越来越小。
实现这一目标的最佳方法是什么?(也就是说,这是否可以在 Web 服务器/负载均衡器上完成,以便应用程序服务器不会受到负面影响?是否可以为此添加某种限制层?)
我们正在使用 Django/Tastypie,但问题更多是在架构/概念层面。
如果您使用的是同步应用程序服务器,这是 Django 应用程序最常见的设置(例如默认的 Gunicorn)--worker-class sync
),那么在应用程序中添加这样的延迟确实会对性能产生非常糟糕的影响。处理延迟请求的工作人员将在延迟期间被阻止。
但是您可以使用异步应用程序服务器(例如带有“--worker-class gevent”的gunicorn),然后开销应该可以忽略不计。处理延迟请求的工作人员能够在延迟进行时处理其他请求。
在反向代理服务器中执行此操作可能是更好的选择,因为它允许轻松灵活地调整策略。有一个外部 nginx 模块正是用于此类事情 https://github.com/perusio/nginx-delay-module.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)