AmazonのAPIでは呼び出し制限にリーキーバケットアルゴリズムを採用しています。今回、クライアント側で呼び出し回数が超過しないようチェックするため、リーキーバケットのアルゴリズムを実装を実装したクラスを作成しました。
内部で、BackGroundWorkerオブジェクトを生成し、指定された周期で、現在の値を再計算しています。
使い方は以下のような感じです。
オブジェクトの生成
LeakyBucket quota = new LeakyBucket(); |
値の初期化。
下記の例では、現在値が0、最大値が10で2000mSec(2秒)ごとに現在値を減算します。
// 初期値のセット quota.Value = 0; quota.MaxQuota = 10; quota.RestoreRate = 2000; |
値の加算。
AmazonのAPI呼び出しを行うたびにインクリメントします。
加算したquota.Valueの値は、RestoreRateの周期で勝手に1づつ減算されていきます。
private boolean CallRequest() { if ( quota.MaxQuota <= quota.Value ) { return false;; } quota.Value++; // ここでリクエストの呼び出し処理を行う return true; } |
ちゃんとしたライブラリとして、Leaky Bucketアルゴリズムを実装するなら、本当はBackgroundWorkerなんか使わずに各プロパティをセット・参照したタイミングでquota値を再計算した方が良いです。
理由は、大量にオブジェクトを生成したとき、周期的なチェック処理の負荷が無視できなくなるのと、Sleepのタイミングによっては厳密には正しい値が取れず、実際のquotaより1つ大きい値を取得してしまうリスクがあるからです。
だけど今回は1つだけしたカウンタが不要で、かつ概算値が取れれば十分なので、これで良しということにしておきます。
呼び出し側のサンプル用プログラム(exeとソースの両方あります)。
LeakyBucketTest.zip
ダウンロード
LeakyBucket.zip
関連記事
コメントを残す