如何解決API請求頻率限制問題?使用Hyperf/token-bucket可以!

可以通過以下地址學習composer學習地址

在開發api服務時,如何有效地限制請求頻率是一個關鍵問題。如果處理不當,可能會導致服務器過載,甚至被惡意攻擊者利用。為了解決這個問題,我嘗試了幾種方法,最終找到了hyperf/Token-bucket這個庫。

Hyperf/token-bucket是一個基于令牌桶算法php庫,它提供了線程安全的實現,可以有效地限制資源的使用率。這個庫的核心思想是通過模擬令牌桶來控制資源的消耗速度,無論是限制API的使用頻率,還是控制帶寬,都非常適用。

使用Composer安裝這個庫非常簡單:

composer require hyperf/token-bucket

讓我們來看一個簡單的例子,展示如何使用這個庫來限制API的請求頻率:

use HyperfTokenBucketRate; use HyperfTokenBucketTokenBucket; use HyperfTokenBucketstorageFileStorage;  $storage = new FileStorage(__DIR__ . "/api.bucket"); $rate    = new Rate(10, Rate::SECOND); $bucket  = new TokenBucket(10, $rate, $storage); $bucket->bootstrap(10);  if (!$bucket->consume(1, $seconds)) {     http_response_code(429);     header(sprintf("Retry-After: %d", floor($seconds)));     exit(); }  echo "API response";

在這個例子中,我們設置了一個每秒鐘最多處理10個請求的令牌桶。如果請求超過了這個限制,服務器會返回429狀態碼,并通過Retry-After頭告知客戶端在多少秒后可以重試。

Hyperf/token-bucket還提供了不同的存儲范圍選項,允許你根據需要限制資源的使用范圍:

  • RequestScope:限制單個請求內的速率,例如限制下載帶寬。
  • SessionScope:限制會話內的速率,例如限制每個用戶的API使用頻率。
  • GlobalScope:限制所有進程(即所有請求)的速率,例如限制資源的總體下載帶寬。

此外,如果你希望請求在達到限制時不立即失敗,而是等待,直到有足夠的令牌可用,你可以使用BlockingConsumer:

use HyperfTokenBucketRate; use HyperfTokenBucketTokenBucket; use HyperfTokenBucketBlockingConsumer; use HyperfTokenBucketstorageFileStorage;  $storage  = new FileStorage(__DIR__ . "/api.bucket"); $rate     = new Rate(10, Rate::SECOND); $bucket   = new TokenBucket(10, $rate, $storage); $consumer = new BlockingConsumer($bucket); $bucket->bootstrap(10);  // 這將阻塞,直到有一個令牌可用。 $consumer->consume(1);  echo "API response";

使用Hyperf/token-bucket庫,我成功地解決了API請求頻率限制的問題。它不僅有效地保護了服務器資源,還提高了系統的整體穩定性和安全性。如果你也面臨類似的需求,這個庫將是一個非常有力的工具

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享