Ich habe ein Projekt, das HTTP-Aufrufe an zwei separate APIs ausführt. Die Aufrufe an diese beiden APIs müssen separat eingeschränkt werden. Ich habe mit den Aufrufen zu einem der APIs begonnen und versuche, einen benutzerdefinierten ExecutionContext zu verwenden, um dies zu erreichen. Hier ist mein application.conf:Scala WS-Aufrufe in einem bestimmten ExecutionContext versuchen
play.modules.enabled += "playtest.PlayTestModule"
my-context {
fork-join-executor {
parallelism-min = 10
parallelism-max = 10
}
}
Dies ist die scala Klasse verwende ich zu testen, ob es funktioniert:
@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)
}
}
Doch egal, was ich versuche, die Anzahl paralleler Anrufe übersteigt die Grenzen, die ich in der application.conf gesetzt habe. Aber es kommt noch Fremde, denn wenn ich die Linie
Await.result(client.url("http://localhost:9000/test").get, Duration.Inf)
mit
Thread.sleep(1000)
ersetzen die Grenzen respektiert werden und die Rate ist richtig begrenzt.
Was mache ich falsch und wie kann ich es beheben? Wenn es eine andere Möglichkeit der Ratenbegrenzung mit der scala-ws-Bibliothek gibt, würde ich es gerne hören.
Sie meinen, die Anzahl der ** parallelen ** Anrufe überschreitet die Grenzen? –
@SergeyKovalev ja das ist richtig. Änderte den Text in der Frage –
Das ist die Sache mit non-blocking: Es braucht keinen Thread pro Anfrage. Bibliotheken mögen die async-http-client-Unterstützungsrate jedoch begrenzen: https://github.com/AsyncHttpClient/async-http-client/blob/3e78a04d58ab904fe668d0cf4c09b31ba7437500/extras/guava/src/main/java/org/asynchttpclient/extras/guava /RateLimitedThrottleRequestFilter.java – rethab