レート制限アルゴリズム
固定、スライディング、トークン、同時実行数の制限を比較します。
「レート制限アルゴリズム」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
レート制限が必要な理由
レート制限は、一定期間内にクライアントが送信できるリクエスト数に上限を設けます。API を悪用、大量のリクエストを送るクライアント、偶発的なトラフィック急増から保護し、ユーザー間で容量を公平に分配できます。
// e.g. allow 100 requests per minute per API key組み込みのレート制限
.NET 7 以降、ASP.NET Core には Microsoft.AspNetCore.RateLimiting の正式なレート制限ミドルウェアが組み込まれており、4 つの組み込みアルゴリズムを利用できます。
// Algorithms: Fixed Window, Sliding Window,
// Token Bucket, Concurrency固定ウィンドウ
固定ウィンドウアルゴリズムでは、固定された時間区間ごとに N 件のリクエストを許可します。区間が終了すると、カウンターは 0 にリセットされます。
単純な方法ですが、ウィンドウの境界では短時間に実効レートが 2 倍になる可能性があります。
// 10 requests per 60s window
// All 10 used at 0:59, 10 more at 1:00 -> 20 in 2 secondsスライディングウィンドウ
スライディングウィンドウは、ウィンドウをセグメントに分割し、期限切れのセグメントを順に移動させることで境界の問題を緩和します。そのため、任意の連続したウィンドウに対して制限が適用されます。
// 10 requests per 60s, 6 segments of 10s each
// The count slides as each segment expiresトークンバケット
トークンバケットは、トークンを格納するバケットを保持します。リクエストごとに 1 つ消費し、トークンは一定のレートで補充されます。バケットサイズまでの短いバーストを許可しながら、長期的な平均レートを制限します。
// Bucket = 10 tokens, refill 5 tokens / 10s
// Burst of 10 allowed, then 5 every 10 seconds同時実行数リミッター
同時実行数リミッターは、時間単位あたりではなく、同時に処理されているリクエスト数に上限を設けます。負荷の高い処理を保護するのに適しています。
// At most 5 concurrent requests in flight
// The 6th waits in the queue or is rejectedキュー
各リミッターでは、制限を超えたリクエストをすぐに拒否せず、キューに入れることができます。QueueLimit でキューのサイズを設定し、QueueProcessingOrder で公平性(古いリクエストを先に処理するか、新しいリクエストを先に処理するか)を設定します。
// QueueLimit = 2, OldestFirst
// Over-limit requests wait if a slot exists, else get 503/429アルゴリズムの選択
目的に合ったアルゴリズムを選択します。
- 固定ウィンドウ: 最も単純で、多くのケースに十分です。
- スライディングウィンドウ: より滑らかで、境界でのバーストを回避します。
- トークンバケット: 制御されたバーストを許可します。
- 同時実行数: レートではなく、同時負荷を制限します。
// Bursty clients -> token bucket
// Expensive endpoint -> concurrencyパーティション分割
制限はパーティションキー(通常はユーザー、API キー、IP)ごとに適用されるため、1 つの大量利用クライアントが全員分のクォータを使い果たすことはありません。1 つの共有パーティションを使うと、すべてのトラフィックがまとめて制限されます。
// Partition by user id, IP, or API key
// Each partition gets its own independent counterクライアントから見える内容
拒否されたリクエストには HTTP 429 Too Many Requests が返されます。適切に動作する API では、クライアントが再試行するタイミングを示す Retry-After ヘッダーも返します。
// HTTP/1.1 429 Too Many Requests
// Retry-After: 30レート制限、スロットリング、クォータの違い
これらは関連する概念です。レート制限は短期間の頻度に上限を設け、クォータはより長い期間(1 日または 1 か月)の合計数に上限を設け、スロットリングは拒否するのではなく処理を遅くします。このミドルウェアが対象とするのはレート制限です。
// rate limit: 100/min quota: 10000/day確認問題
各アルゴリズムの理解度を確認します。
まとめ
レート制限の概念を学びました。
- 4 つのアルゴリズムは、固定ウィンドウ、スライディングウィンドウ、トークンバケット、同時実行数です。
- トークンバケットはバーストを許可し、同時実行数は同時負荷に上限を設けます。
- 制限はパーティションキーごとに適用され、キューによって超過分を平滑化します。
- 拒否されたリクエストには 429 と
Retry-Afterが返されます。
次は、ミドルウェアの構成です。
よくある質問
「レート制限アルゴリズム」レッスンは無料ですか?
はい。「レート制限アルゴリズム」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「レート制限アルゴリズム」で何を学びますか?
固定、スライディング、トークン、同時実行数の制限を比較します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「レート制限アルゴリズム」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- レート制限アルゴリズム
- レート制限ミドルウェアの設定
- 出力キャッシュの基本
- キャッシュポリシーと無効化