レートリミット (Rate limiting) は、リソースの使用量を制御し、サービスの品質を維持するための、 とても重要な仕組みです。 Go は、ゴルーチンとチャネル、ティッカー により、 レートリミットをエレガントにサポートします。 |
|
|
|
|
|
|
|
まず最初に、基本的なレートリミットを見ていきます。
リクエストに対する処理を制限したいとしましょう。
これらのリクエストに同じ名前の |
|
|
|
各リクエストを処理する前に |
|
あるいは、全体としてはレートリミットを担保しつつ、
一時的なバーストリクエストは許容したいと思うかもしれません。
その場合、 |
|
許容されているバースト量を表すため、 チャネルに値を満たしておきます。 |
|
200 ミリ秒ごとに、 |
|
それでは、5 リクエストきた場合をシミュレートします。
これらのうち最初の 3 リクエストは、 |
|
プログラムを実行すると、リクエストの前半部分は、期待通り 200 ミリ秒に 1 回処理されていることが分かります。 |
|
リクエストの後半部分は、最初の 3 つはすぐに処理され、 残り 2 つはその後 200 ミリ秒ずつ遅れて実行されていることが 分かります。3 つまではバーストを許容しているからです。 |
|
Next example: Atomic Counters.