【问题标题】:how to add rate limiting on tornado python app如何在龙卷风python应用程序上添加速率限制
【发布时间】:2021-08-04 04:55:03
【问题描述】:

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

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

我尝试检查 tornado 的 github 页面,我有与 post 相同的问题,但没有提供明确的答案。也检查了 tornado 的 wiki 链接,但我认为速率限制尚未处理。

【问题讨论】:

标签: python tornado


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您的问题的企业级解决方案是ambassador。 您可以使用大使的解决方案,例如特使代理和边缘堆栈,并设置它可以满足需要。

    除了破坏数据,您可以使用任何流行的缓存数据库,或存储为键值对的 d,例如 redis。

    如果你为一个非常小的项目这样做,可以使用一些 npm/pip 包。

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

    【讨论】:

    • 谢谢。现在我将检查 redis 或 memcached
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      相关资源
      最近更新 更多