たとえば、N台の物理マシンでいくつかのビジネスロジックを実行しているPプロセスがあるとします。これらのプロセスは、たとえば、いくつかのWebサービスSを呼び出します。すべてのPプロセスを組み合わせて、サービスSに対して1秒あたりX回以下の呼び出しが行われるようにしたい。
そのようなソリューションをどのように実装できますか?
Google Guavaのレートリミッターは、単一のボックスで実行されているプロセスではうまく機能しますが、分散セットアップでは機能しません。
JAVAで利用できる標準のすぐに使用できるソリューションはありますか? [飼育係に基づいている可能性があります]
ありがとう!
私はこの種の問題のオープンソースソリューションに取り組んできました。
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/jdwyah/ratelimit-Java これを行う必要がある分散レート制限を提供します。制限をS /秒/分などとして構成し、カバーの下にある漏出バケットのバーストサイズ/補充率を選択できます。