0Pricing
Go Academy · レッスン

トークンバケットの概念

リクエストレートを制限します

「トークンバケットの概念」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. トークンバケットの概念
  2. golang.org/x/time/rate
  3. Goroutineのスロットリング
  4. バックオフとリトライ
← Go Academyに戻る