[英]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.