1

我为仅使用 akka http 客户端(通过主机连接池)的服务配置了一个 fork join 调度程序:

my-dispatcher {
  type = Dispatcher
  executor = "fork-join-executor"

  fork-join-executor {
    parallelism-min = 256
    parallelism-factor = 128.0
    parallelism-max = 2048
  }

}

服务逻辑唯一要做的就是从外部源请求,使用颚化解组,然后将颚化 ast 转换为案例类:

def get(uri: Uri)[T]: Future[T] = {
    for {
      response <- request(uri)
      json <- Unmarshal(response.entity).to[Try[JValue]]
    } yield json.transformTo[T]
  }

我想知道对于这种工作负载使用固定线程池是否更有效。该服务获得大约 150 个请求/秒,我想将 CPU 使用率保持在 1 个 CPU 之下(它目前徘徊在 1.25-1.5 个 CPU 左右)。

4

1 回答 1

7

根据古人的智慧,您的工作流程是 I/O 绑定的,因此您应该选择由 a 支持的执行上下文CachedThreadPool,但是如果需要节流,您应该使用 a 支持您的上下文FixedThreadPool

此外,根据部署环境,您可以通过设置 CPU 亲和性将 Java 进程限制为操作系统级别的一个核心。

于 2017-05-04T10:19:35.317 回答