萌えハッカーニュースリーダー

2025/07/22 19:48 Designing a Composable Rate Limiter

出典: https://clipperhouse.com/composable-rate-limiter/
hakase
博士

やっほー、ロボ子!今日はレートリミッターの設計について話すのじゃ。

roboko
ロボ子

博士、こんにちは。レートリミッターですか、最近よく耳にしますね。どのような設計にするのが良いのでしょうか?

hakase
博士

既存のレートリミッターは複雑になりがちだから、コンポーザビリティ(組み合わせやすさ)を重視するのじゃ!

roboko
ロボ子

コンポーザビリティ、ですか。具体的にはどのような要素が必要になるのでしょう?

hakase
博士

`Limit`(期間あたりのカウント数)、`Bucket`(トークンをカウントする)、`Limiter`(主要API)、`Keyer`(バケットのキーを定義する関数)、`LimitFunc`(動的な`Limit`を指定する関数)が必要になるのじゃ。

roboko
ロボ子

なるほど、それぞれの役割が明確に分かれているんですね。

hakase
博士

`Limit`は任意のリクエスト数と期間を定義できるようにするのじゃ。例えば、「1秒あたり10リクエスト」や「1分あたり100リクエスト」に対応できるようにするのじゃ。

roboko
ロボ子

短いスパイクと持続的な負荷の両方に対応できるのは便利ですね。

hakase
博士

そうじゃ!そして`Bucket`はトークンバケットアルゴリズムを実装するのじゃ。リクエストごとにトークンを消費して、時間が経つとリフィルされるのじゃ。

roboko
ロボ子

トークンが足りない場合はリクエストが拒否される、と。

hakase
博士

その通り!`Limiter`はリクエストを動的に許可または拒否する主要APIで、多数のバケットと制限を追跡するのじゃ。

roboko
ロボ子

`Limiter`はキーとバケットのマップを管理し、`sync.Map`を使用して並行処理を実現するんですね。

hakase
博士

さすがロボ子、理解が早い!複数の制限を1つのバケットに適用することもできるのじゃ。いずれかの制限を超えたらリクエストを拒否するのじゃ。

roboko
ロボ子

トランザクション的なアカウンティングを実装することで、整合性を保つんですね。

hakase
博士

その通り!さらに、制限を動的に決定するために、複数の`LimitFunc`をサポートするのじゃ。

roboko
ロボ子

条件付きで制限を変えることができるんですね。柔軟性が高いです。

hakase
博士

そして、複数の`Limiter`を組み合わせて`LimiterStack`を作成するアイデアもあるのじゃ!

roboko
ロボ子

`LimiterStack`を使うと、より複雑な制限を表現できそうですね。

hakase
博士

そうじゃ!すべてのリミッターに対して「オール・オア・ナッシング」のトランザクション的なセマンティクスを適用するのじゃ。

roboko
ロボ子

各プリミティブを簡単に表現できるようにし、それらを組み合わせて高度なロジックを構築する。コンポーザビリティの概念、奥が深いですね。

hakase
博士

動的な要素には名前付き関数を使って任意の計算を許可するのじゃ。そして、各プリミティブの任意の組み合わせを許可して、難しい部分を処理するのじゃ。

roboko
ロボ子

現在、GitHubで意見を募集しているとのことですので、私も貢献できればと思います。

hakase
博士

ロボ子、今日は真面目じゃったの。褒めてつかわす!

roboko
ロボ子

ありがとうございます、博士。ところで、レートリミッターがうまく機能しないと、どうなるんでしょうか?

hakase
博士

リクエストが洪水のように押し寄せて、システムが溺れてしまうのじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search