请求级API使用的超级池与主机级API创建的缓存池之间的池设置有什么关系?
提供更多上下文:我需要使用快速响应请求和更昂贵的请求来查询相同的主机/端点。我目前的策略是使用Http().singleRequest()
进行廉价查询,将缓存的主机池用于"隔离"更昂贵的查询。我想确保昂贵的查询不会耗尽超级池中的所有可用连接。
我是否正确地期望它们确实是2个独立的池,即使它们指向同一个主机?如果是这样,有没有办法为超级池和高速缓存池分别配置最大连接数?我只在reference.conf
文件中看到一个设置。
答案 0 :(得分:1)
我相信如果你没有指定不同的配置,Akka-HTTP将缓存底层池并共享它。这适用于Http().singleRequest(...)
和Http().cachedHostConnectionPool(...)
来电。
如果您需要不同的池,诀窍是提供不同的配置,如docs状态:
请注意,如果您请求具有不同配置的池 相同的目标主机,您将获得独立的池。
singleRequest
和cachedHostConnectionPool
次调用都会使用可选的settings: ConnectionPoolSettings
参数。您可以使用默认值来创建它,并调整要调整的参数,例如
Http().cachedHostConnectionPool("localhost", 80, ConnectionPoolSettings(system).withMaxConnections(2000))
答案 1 :(得分:1)
正如@Stefano Bonetti所说,对此的简单解决方法是强制akka-http通过配置使用不同的缓存池,例如,如果使用singleRequest()api,则可以更改用户代理,然后akka创建不同的池你,java中的代码示例可以是:
UserAgent userAgent = UserAgent.create(ProductVersion.create("akka-http", "1.0", actorPath));
ConnectionPoolSettings setting = ConnectionPoolSettings.create(context().system())
.withConnectionSettings(ClientConnectionSettings.create(context().system())
.withUserAgentHeader(Optional.of(userAgent)));
http.singleRequest(httpRequest, http.defaultClientHttpsContext(), setting, context().system().log(), materializer).... Here code to handle the response