6

我正在尝试在我们的 REST API 上实现一些限制。一种典型的做法是在某个阈值之后阻止请求(带有403429响应)。但是,我看到一个 api反而增加了响应的延迟。

当您调用 API 时,我们将查看您在前五分钟期间每秒的平均调用次数 (c/s)。以下是将会发生的事情:

  • 超过 3c/s,我们增加了 2 秒的延迟

  • 超过 5c/s,我们增加了 4 秒的延迟

  • 超过 7c/s,我们增加了 5 秒的延迟

从客户的角度来看,我认为这比返回错误要好。可能发生的最糟糕的情况是你会放慢速度。

我想知道如何在不对应用服务器产生负面影响的情况下实现这一点。即为了增加这些延迟,服务器需要保持请求打开,导致它让越来越多的请求处理器保持忙碌,这意味着它对新请求的容量越来越小。

实现这一目标的最佳方法是什么?(即,这是否可以在 Web 服务器/负载均衡器上完成,以免对应用程序服务器产生负面影响?是否可以为此添加某种节流层?)

我们使用的是 Django/Tastypie,但问题更多是在架构/概念层面。

4

1 回答 1

3

如果您使用的是同步应用服务器,这是 Django 应用程序最常见的设置(例如带有 default 的 gunicorn --worker-class sync),那么在应用程序中添加这样的延迟确实会对性能产生非常糟糕的影响。处理延迟请求的工作人员将在延迟期间被阻止。

但是您可以使用异步应用程序服务器(例如带有“--worker-class gevent”的gunicorn),然后开销应该可以忽略不计。处理延迟请求的工作人员能够在延迟进行时处理其他请求。

在反向代理服务器中执行此操作可能是更好的选择,因为它允许轻松灵活地调整策略。正是这样的事情有一个外部 nginx 模块

于 2013-04-30T18:26:36.243 回答