Web システムは、短期間に多数のクライアント要求に直面することがよくあります。 これによりサーバーに負荷がかかり、速度の低下や障害が発生する可能性があります。 レート リミッター は、各クライアントからのリクエスト頻度を制御することで、この問題をエレガントに解決します。 ゲートキーパーとして機能し、指定された時間枠内の API またはサービス呼び出しを制限します。
レート制限には、いくつかの重要な利点があります。
悪用防止: サービス拒否 (DoS) 攻撃などの過剰または悪意のあるリクエストを軽減し、システムの過負荷を防ぎます。
リソース管理: 効率的なリソース割り当てを確保し、1 つのクライアントがサーバー リソースを独占して他のクライアントに影響を与えることを防ぎます。
パフォーマンスの強化: リクエストのフラッディングを防止することで、トラフィック負荷が高くてもアプリケーションの応答性を維持します。
ユーザー エクスペリエンスの向上: 過剰なリクエストによるユーザーのロックアウトやパフォーマンスの低下を防ぎます。
セキュリティの強化: リクエスト レートを制限することで、ブルート フォース攻撃や悪用の試みを阻止します。
人気のある Chi ルーティング パッケージと golang.org/x/time/rate
パッケージ (トークン バケット アルゴリズムを採用) を使用した Go 実装を調べてみましょう。 この例では、http.Handler
を使用してクライアントのリクエスト レートを制御します。
<code class="language-go">package main import ( "encoding/json" "net/http" "strings" "time" "github.com/go-chi/chi" "golang.org/x/time/rate" ) func main() { r := chi.NewRouter() // Globally limits to 5 requests per second with a burst of 10 r.Use(RateLimiter(rate.Limit(5), 10, 1*time.Second)) // Test route r.Get("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Request successful")) }) http.ListenAndServe(":3000", r) } // RateLimiter middleware func RateLimiter(limit rate.Limit, burst int, waitTime time.Duration) func(next http.Handler) http.Handler { limiterMap := make(map[string]*rate.Limiter) lastRequestMap := make(map[string]time.Time) return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ip := strings.Split(r.RemoteAddr, ":")[0] limiter, exists := limiterMap[ip] if !exists { limiter = rate.NewLimiter(limit, burst) limiterMap[ip] = limiter } lastRequestTime, lastRequestExists := lastRequestMap[ip] if lastRequestExists && time.Since(lastRequestTime) < waitTime { //Handle exceeding rate limit http.Error(w, http.StatusText(http.StatusTooManyRequests), http.StatusTooManyRequests) return } if !limiter.Allow() { http.Error(w, http.StatusText(http.StatusTooManyRequests), http.StatusTooManyRequests) return } lastRequestMap[ip] = time.Now() next.ServeHTTP(w, r) }) } }</code>
レート制限を超えると、429 (Too Many Requests)
エラーが発生します。
クライアントの使用を識別して制限するための方法がいくつかあります。
IP ベース: 特定の IP アドレスからのリクエストを制限します。 シンプルですが、共有ネットワーク (NAT) では効果がありません。
認証トークンベース: 認証トークン (JWT、OAuth) に基づいてリクエストを追跡します。 より詳細ですが、認証が必要です。
クライアント ID ベース: 一意のクライアント ID (API キー) を使用します。サービス統合には効果的ですが、キーが侵害されると脆弱になります。
ユーザーごとのセッション: 一意のセッション ID に基づいてリクエストを制限します。 個々のユーザー エクスペリエンスに重点を置いています。
ルート/エンドポイントベース: リクエストを特定の高トラフィックのエンドポイントに制限します。 他の方法とうまく組み合わせます。
この例では、簡略化するために IP アドレスを使用しており、トークンベースの認証を使用しないパブリック API またはアプリケーションに適しています。
レート制限は、アプリケーションのセキュリティ、安定性、ユーザー エクスペリエンスにとって不可欠です。 この例では、Go と Chi を使用した実用的で効率的な実装を示します。 これは、悪用を防止し、公平なリソース配分を確保するための重要な手法です。
以上がレート リミッターとは何ですか?なぜ使用するのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。