如何在 tornado python 应用程序上添加速率限制

how to add rate limiting on tornado python app

是否可以在我的 tornado 应用程序上实施速率限制功能?比如限制来自特定客户端的 HTTP 请求数量,如果它们被识别为每秒发送太多请求(将它们标记为机器人)。

我想我可以通过将请求存储在数据库中并分析每个 IP 地址的请求来手动完成,但我只是在检查是否已经有针对此功能的现有解决方案。

我试过查看tornado的github页面,我和这个post有同样的问题,但没有提供明确的答案。也检查了龙卷风的维基链接,但我认为速率限制尚未处理。

与其将它们存储在数据库中,不如将它们存储在内存中的字典中以便于使用。 您还可以分享详细信息 api 是否有负载平衡器以及使用哪个网络服务器。

您的问题的企业级解决方案是 ambassador。 您可以使用大使的解决方案,例如 envoy 代理和边缘堆栈,并对其进行设置以完成需要的工作。

除了撕裂数据外,您还可以使用任何流行的缓存数据库,或存储为 key:value 对的数据库,例如 redis。

如果您为非常小的项目执行此操作,可以使用一些 npm/pip 包。

阅读文档:https://www.getambassador.io/products/edge-stack/api-gateway/

您应该在请求到达 Tornado 之前执行此操作。

但如果它是一个应用程序级别的功能(根据订阅级别限制请求),那么您可以在 Tornado 中以多种方式执行此操作,具体取决于您希望速率限制的复杂程度。

可能最简单的方法是在 tornado.web.Application 上使用 dict,它使用 ip 作为键,最后一个请求的时间戳作为值,并检查 prepare 中的每个请求。 - 如果自上次请求以来没有经过足够的时间,则提出 tornado.web.HTTPError(429)(最好是 Retry-After header)。如果你这样做,你仍然需要不时地清理这个 dict,然后删除最近没有发出请求的条目,否则它会增长(你可以在每个请求上这样做 finish)。

如果您附加了另一个 fast/in-memory 存储(memcache、redis、sqlite),您应该使用它,但您绝对不应该使用 RDBMS,因为所有这些写入对它的性能。