トークンバケットの概念
リクエストレートを制限します
「トークンバケットの概念」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
レート制限が必要な理由
レート制限は、単位時間あたりに実行できる操作の数を制限します。API を悪用から守り、サードパーティーのクォータを尊重し、負荷が高い状況でもシステムを安定させます。
- 過負荷を防ぎます
- 公平な利用を徹底します
- 上流の制限を守ります
トークンバケットモデル
トークンを保持するバケットを想像してください。各リクエストは、処理を進めるためにトークンを1つ取得する必要があります。トークンは一定の速度で補充されます。バケットが空の場合、リクエストは待機するか拒否されます。
レートとバースト
トークンバケットは、レート(1秒あたりに追加されるトークン数)とバースト(バケット容量)の2つのパラメーターで定義されます。バーストによって、一定のレートを短時間だけ上回る急増を許容できます。
時間経過による補充
レートが毎秒5トークンの場合、約200ミリ秒ごとに1トークンが追加されます。バケットが保持できるトークン数はバースト容量を超えないため、未使用の容量がいつまでも蓄積することはありません。
バーストの許容
バーストが10の場合、バケットが満杯なら最大10件のリクエストを即座に処理できます。その後のリクエストは一定のレートで間隔を空けて処理されます。これにより、応答性と制御のバランスを取れます。
単純な時間ベースのチェック
一定間隔で許可を解放する ticker を使って、レート制限を近似できます。各リクエストは次の tick まで待機します。
ticker := time.NewTicker(200 * time.Millisecond)
defer ticker.Stop()
for i := 0; i < 3; i++ {
<-ticker.C
fmt.Println("request", i)
}トークンバケットとリーキーバケット
リーキーバケットは一定のレートで排出し、バーストを禁止して出力を完全に平滑化します。一方、トークンバケットは容量までのバーストを許容します。API の制限にはトークンバケットのほうが一般的です。
最小限のバケットシミュレーション
この実行可能な例では、100ミリ秒ごとに補充される容量3のトークンバケットをシミュレートし、どのリクエストが許可されるかを示します。
package main
import (
"fmt"
"time"
)
func main() {
tokens := 3
last := time.Now()
rate := 100 * time.Millisecond
for i := 0; i < 6; i++ {
elapsed := time.Since(last)
refill := int(elapsed / rate)
if refill > 0 {
tokens += refill
if tokens > 3 {
tokens = 3
}
last = time.Now()
}
if tokens > 0 {
tokens--
fmt.Println("request", i, "allowed")
} else {
fmt.Println("request", i, "rejected")
}
time.Sleep(40 * time.Millisecond)
}
}Allow、Wait、Reserve の違い
リミッターは通常、3つの動作を提供します。Allow はすぐに true または false を返し、Wait はトークンが空くまでブロックし、Reserve は待機時間を返します。ブロックできるかどうかに応じて選択してください。
制限を適用する単位
レート制限は、クライアント単位、エンドポイント単位、またはグローバルに設定できます。クライアント IP をキーにしたリミッターのマップではクライアントごとのクォータを適用でき、共有リミッターを1つ使うと全体のスループットを制限できます。
パラメーターの選択
レートを下流のクォータに合わせます。API が1分あたり600リクエストを許可している場合は、レートを毎秒10に設定します。平均レートを超えない範囲で、予想される急増を吸収できるようにバーストを設定します。
クイックチェック
トークンバケットについての理解度を確認しましょう。
まとめ
トークンバケットの概念について学びました。
- リクエストごとにトークンを消費し、一定のレートで補充します
- バーストは急増に対応するためのバケット容量です
- トークンバケットはバーストを許容しますが、リーキーバケットは許容しません
- Allow、Wait、Reserve が一般的な API です
よくある質問
「トークンバケットの概念」レッスンは無料ですか?
はい。「トークンバケットの概念」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「トークンバケットの概念」で何を学びますか?
リクエストレートを制限します ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「トークンバケットの概念」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。