簡體   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