ホームページ > バックエンド開発 > Golang > レート リミッターとは何ですか?なぜ使用するのですか?

レート リミッターとは何ですか?なぜ使用するのですか?

Mary-Kate Olsen
リリース: 2025-01-08 06:36:40
オリジナル
874 人が閲覧しました

Web システムは、短期間に多数のクライアント要求に直面することがよくあります。 これによりサーバーに負荷がかかり、速度の低下や障害が発生する可能性があります。 レート リミッター は、各クライアントからのリクエスト頻度を制御することで、この問題をエレガントに解決します。 ゲートキーパーとして機能し、指定された時間枠内の API またはサービス呼び出しを制限します。

レート制限を実装する理由

レート制限には、いくつかの重要な利点があります。

  1. 悪用防止: サービス拒否 (DoS) 攻撃などの過剰または悪意のあるリクエストを軽減し、システムの過負荷を防ぎます。

  2. リソース管理: 効率的なリソース割り当てを確保し、1 つのクライアントがサーバー リソースを独占して他のクライアントに影響を与えることを防ぎます。

  3. パフォーマンスの強化: リクエストのフラッディングを防止することで、トラフィック負荷が高くてもアプリケーションの応答性を維持します。

  4. ユーザー エクスペリエンスの向上: 過剰なリクエストによるユーザーのロックアウトやパフォーマンスの低下を防ぎます。

  5. セキュリティの強化: リクエスト レートを制限することで、ブルート フォース攻撃や悪用の試みを阻止します。

Chi を使った実践的な Go 実装

人気のある 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) エラーが発生します。

What is Rate Limiter and Why Use It?

レート制限戦略

クライアントの使用を識別して制限するための方法がいくつかあります。

  1. IP ベース: 特定の IP アドレスからのリクエストを制限します。 シンプルですが、共有ネットワーク (NAT) では効果がありません。

  2. 認証トークンベース: 認証トークン (JWT、OAuth) に基づいてリクエストを追跡します。 より詳細ですが、認証が必要です。

  3. クライアント ID ベース: 一意のクライアント ID (API キー) を使用します。サービス統合には効果的ですが、キーが侵害されると脆弱になります。

  4. ユーザーごとのセッション: 一意のセッション ID に基づいてリクエストを制限します。 個々のユーザー エクスペリエンスに重点を置いています。

  5. ルート/エンドポイントベース: リクエストを特定の高トラフィックのエンドポイントに制限します。 他の方法とうまく組み合わせます。

この例では、簡略化するために IP アドレスを使用しており、トークンベースの認証を使用しないパブリック API またはアプリケーションに適しています。

結論

レート制限は、アプリケーションのセキュリティ、安定性、ユーザー エクスペリエンスにとって不可欠です。 この例では、Go と Chi を使用した実用的で効率的な実装を示します。 これは、悪用を防止し、公平なリソース配分を確保するための重要な手法です。

リンク

ブログ投稿

サンプルリポジトリ

以上がレート リミッターとは何ですか?なぜ使用するのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート