繁体   English   中英

如何在龙卷风 python 应用程序上添加速率限制

[英]how to add rate limiting on tornado python app

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

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

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

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

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

除了撕裂数据外,您还可以使用任何流行的缓存数据库,或存储为键值对的数据库,例如 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标头)。 如果你这样做,你仍然需要不时地清理这个字典,然后删除最近没有提出请求的条目,否则它会增长(你可以在每次请求时finish它)。

如果您附加了另一个快速/内存存储(内存缓存、redis、sqlite),您应该使用它,但您绝对不应该使用 RDBMS,因为所有这些写入都不会提高其性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM