web-dev-qa-db-ja.com

分散レートリミッターを実装する方法は?

たとえば、N台の物理マシンでいくつかのビジネスロジックを実行しているPプロセスがあるとします。これらのプロセスは、たとえば、いくつかのWebサービスSを呼び出します。すべてのPプロセスを組み合わせて、サービスSに対して1秒あたりX回以下の呼び出しが行われるようにしたい。

そのようなソリューションをどのように実装できますか?

Google Guavaのレートリミッターは、単一のボックスで実行されているプロセスではうまく機能しますが、分散セットアップでは機能しません。

JAVAで利用できる標準のすぐに使用できるソリューションはありますか? [飼育係に基づいている可能性があります]

ありがとう!

14

Bucket4j is Java "token-bucket"レート制限アルゴリズムの実装。ローカルと分散(JCacheの上)の両方で機能します。分散ユースケースの場合は無料です。 HazelcastやApacheIgniteなどのJCache実装を選択します。クラスターでBucket4jを使用する この例 を参照してください。

私はこの種の問題のオープンソースソリューションに取り組んできました。

Limitedは、制限の「サーバー」です。制限は トークンバケットアルゴリズム を使用して実装されます。

基本的に、次のようにサービス構成で制限を定義します。

buckets:
  "request to service a":
     per_minute: 10
  "request to service b":
     per_minute: 5

このサービスは、TCP/IPポートをリッスンするデーモンとして実行されます。

次に、アプリケーションは次の行に沿って何かを実行します。

var limitd = new Limitd('limitd://my-limitd-address');

limitd.take('request to service a', 'app1' 1, function (err, result) {
  if (result.conformant) {
    console.log('everything is okay - this should be allowed');
  } else {
    console.error('too many calls to this thing');
  }
});

現在、これをレート制限と一部のアプリケーションイベントのデバウンスに使用しています。

サーバーはオンになっています:

https://github.com/auth0/limited

いくつかのSDKで作業することを計画していますが、現時点ではnode.jsしかなく、部分的に実装されています。

https://github.com/limited

3

https://github.com/jdwyah/ratelimit-Java これを行う必要がある分散レート制限を提供します。制限をS /秒/分などとして構成し、カバーの下にある漏出バケットのバーストサイズ/補充率を選択できます。

0
jdwyah