我有一个fork join dispatcher,它配置的服务只使用akka http的客户端(通过主机连接池):
my-dispatcher {
type = Dispatcher
executor = "fork-join-executor"
fork-join-executor {
parallelism-min = 256
parallelism-factor = 128.0
parallelism-max = 2048
}
}
服务逻辑唯一要做的就是从外部源请求,使用jawn解组它,然后将jawn ast转换为case类:
def get(uri: Uri)[T]: Future[T] = {
for {
response <- request(uri)
json <- Unmarshal(response.entity).to[Try[JValue]]
} yield json.transformTo[T]
}
我想知道为这种工作负载使用固定线程池是否更有效。这项服务大约需要150 req / s,我想将CPU使用率保持在1 CPU以下(目前它的徘徊在1.25-1.5左右)。
答案 0 :(得分:6)
根据wisdom of the ancients,您的工作流是I / O绑定的,因此您应该选择由CachedThreadPool
支持的执行上下文,但是如果需要限制,则应该使用{{1 }}。
此外,根据部署环境,您可以通过setting CPU affinity将Java进程限制为操作系统级别的一个核心。