2

以下のレート制限のユースケースを実装するための最良のメカニズムは何ですか? Token Bucket のような一般的なアルゴリズムを使用できますが、memcached のコンテキストで実装したいと考えています。これに関するヘルプに感謝します。

  • 顧客 ABC からの電話は 1 日に 100 件のみ許可します。
  • 顧客 ABC に対して 1 時間に 50 回の API 呼び出しのみを許可します。
  • 任意のユーザー ID について、顧客 ABC に対して 1 時間に 5 つの API 呼び出しのみを許可します。
4

2 に答える 2

0

これを正しく理解していれば、各APIリクエストにはuserIDとcustomerが付属しています。各顧客は複数のユーザーIDを持つことができます。顧客レベルとuserIDレベルの両方でレート制限が必要です。

これらのアクティビティが発生した回数をカウントするには、複数のキーABC_day、ABC_hour、ABC_userID1_hour、ABC_userID2_hourなどを使用する必要があります。このアプローチの問題は、これらのカウンターをいつリセットするかです。memcachedは数値のインクリメント演算子のみをサポートしているため、この情報をキー自体にエンコードする必要があります。日次レート制限のキーとしてABC_2012_02_28を使用できます。コードで、現在の日付を使用してキーを作成し、それをインクリメントするだけです。日が変わると、コードは存在しないABC_2012_02_29を探し、新しいキーを作成する機会を与えます。

代替手段はcacheismoです。これはmemcachedのようなキャッシュであり、memcachedプロトコルをサポートし、「キャッシュ内」スクリプトを提供します。非常に多くのキーを作成する代わりに、このすべての簿記を行う独自の「レート制限」オブジェクトを実装できます。レート制限の実装例については、 http://chakpak.blogspot.in/2011/09/rate-limitingquota-with-cacheismo.htmlを参照してください。ここから入手できます。https://github.com/iamrohit/cacheismo

于 2012-02-28T20:21:22.147 に答える
0

この制限に達したときにどうしたいですか? サービスを停止したり、明日のページにリダイレクトしたりすることはできますが、それはかなり見苦しいものです。

リクエストが処理される速度を遅くすることはできますが、これは 1 秒あたり数回の速度の場合により便利です。たとえば、顧客 ABC は 1 秒または 1 分あたり 100 に制限されています。あなたが話している非常に低いレートの場合、クライアントはタイムアウトし、サーバーが停止していると考えます。

于 2011-12-25T09:05:03.780 に答える