2つの別々のAPIへのHTTPコールを行うプロジェクトがあります。これらの両方のAPIへの呼び出しは、速度を別々に制限する必要があります。私はAPIのいずれかの呼び出しを開始し、これを実現するためにカスタムのExecutionContextを使用しようとしています。ここに私のapplication.confです:特定のExecutionContextでScala WSコールを実行しようとしています
play.modules.enabled += "playtest.PlayTestModule"
my-context {
fork-join-executor {
parallelism-min = 10
parallelism-max = 10
}
}
これは、私はそれが動作するかどうかをテストするために使用していScalaのクラスです:
@Singleton
class MyWsClient @Inject() (client: WSClient, akkaSystem: ActorSystem) {
val myExecutionContext: ExecutionContext = akkaSystem.dispatchers.lookup("my-context")
val i = new AtomicInteger(0)
def doThing: Future[Int] = {
Future {
println(i.incrementAndGet)
println("Awaiting")
Await.result(client.url("http://localhost:9000/test").get, Duration.Inf)
println("Done")
i.decrementAndGet
1
}(myExecutionContext)
}
}
しかし、関係なく、私がしようとするもの、並列コール数は超えません私がapplication.confに設定した制限値。私は
Thread.sleep(1000)
限界が尊重され、レートが適切に制限されているとライン
Await.result(client.url("http://localhost:9000/test").get, Duration.Inf)
を交換する場合ので、しかし、それは、見知らぬ人にもなります。
私は間違っていますが、どうすれば修正できますか? scala-wsライブラリでレート制限の別の方法がある場合、私はそれを聞いてみたいと思います。
**並列**コールの数が制限を超えていますか? –
@SergeyKovalevはい正しいです。質問内のテキストを変更しました –
ノンブロッキングのことです:要求ごとにスレッドは必要ありません。しかし制限非同期HTTPクライアントの支持率のようなライブラリ:https://github.com/AsyncHttpClient/async-http-client/blob/3e78a04d58ab904fe668d0cf4c09b31ba7437500/extras/guava/src/main/java/org/asynchttpclient/extras/guava /RateLimitedThrottleRequestFilter.java – rethab