【すらいでぃんぐうぃんどうれーとせいげん】

スライディングウィンドウレート制限 とは?

最終更新:
💡 直近の時間窓で、リクエスト数を制限する

現在時刻とともに動く時間窓を使って、リクエスト数を制限する方式。個別の時刻を記録するログ方式と、複数の固定窓の件数から近似するカウンター方式などがある。

📌 このページのポイント
動く時間窓で、直近の件数を制限する 上限:一分に50件(例) 固定窓:境界で別の窓になる 0分台 0:59 に50件許可 1分台 1:01 に50件許可 境界の近くに100件が集中し得る ログ方式:1:01の直近60秒 0:59 の50件が残る 許可済み:50件 1:01 の新しい要求 上限なので許可しない 時刻を保持するログ方式は厳密に数える カウンター方式は、窓の件数から近似する
上限50件の例。固定窓では境界前後に50件ずつ通り得る。厳密なログ方式では、直前の50件が窓内に残るため新しい要求を許可しない。窓内の50件自体は同時に来ることもある。
ひよこ ひよこ
何がスライディングなの?
ペンギン先生 ペンギン先生
たとえば現在から直近60秒という時間窓が、時刻とともに動くんだよ。ログ方式なら、その範囲に残る許可済みリクエストを数えて、新しい要求を通すかを決めるんだ。
ひよこ ひよこ
固定窓とどう違う?
ペンギン先生 ペンギン先生
一分の固定窓で上限50件なら、0分59秒に50件、次の窓の1分01秒に50件を通せる場合があるよ。どちらの窓も50件以内だけれど、短い間に100件が集中する。これが境界のバーストだね。
ひよこ ひよこ
ログ方式なら、次の50件はどうなる?
ペンギン先生 ペンギン先生
1分01秒でも直近60秒には、0分59秒に通した50件が残るよ。上限50件なら、新しい要求は許可しない。100件を通してから制限するという意味ではないんだ。
ひよこ ひよこ
必ず全リクエストの時刻を保存する?
ペンギン先生 ペンギン先生
ログ方式では窓内の許可済み要求の時刻を保持するけれど、古い記録は取り除くよ。カウンター方式では、現在と前の固定窓の件数を重み付けして近似し、個別の時刻を保存しない方法もあるんだ。
ひよこ ひよこ
近似版は完全に同じ判定になる?
ペンギン先生 ペンギン先生
窓の中でいつ要求が来たかを個別に扱わないので、厳密なログ方式と判定が違う場合があるよ。RedisのSorted Setを使うログ実装などを参考に、精度と記憶量、並行処理でも件数判定と追加を整合させる方法を選ぶんだ。
もっと詳しく知りたい人へ

スライディング方式なら、短時間の集中も全部なくなる?

直近60秒に50件という上限なら、その50件が一度に来ること自体は許容されます。固定窓の境界で制限がリセットされる問題と、窓内で許す集中は区別します。瞬間的な集中も抑える必要がある場合は、時間窓の長さや別の制限方法も含めて設計します。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「スライディングウィンドウレート制限」って出てきたら「直近の動く時間窓でリクエスト数を制限する方式」と思えばだいたいOK!
📖 おまけ:英語の意味
「Sliding Window Rate Limiting」 = 動く時間窓を使うレート制限
💬 Slidingは滑る・移動する、Windowは窓という意味だよ。たとえば直近60秒という対象期間が、現在時刻とともに動く考え方なんだ。

参考資料

← 用語集にもどる