2

在我的应用程序中,它是一个 HTTP 服务,它公开了可以被其他服务使用的几个 API,我有一种情况,我必须调用 2 个不同的外部服务,它们是一个消息传递服务和另一个 REST 服务。

我了解对于这些 I/O 绑定操作,使用单独的线程池或 ExecutionContext 是一个好习惯。我正在使用以下内容在我的 application.conf 中为自定义 ExecutionContext 创建配置:

execution-context {
  fork-join-executor {
    parallelism-max = 10
  }
}

我有一些问题:

  1. 这会创建 10 个专用线程吗?
  2. 我如何知道最大并行度的大小?
  3. 假设我要使用这个执行上下文来进行 REST API 调用,我应该如何调整它的大小?
4

1 回答 1

1
  1. 这会创建 10 个专用线程吗?

    关闭,但不完全正确。正如您从 Akka 文档中看到的那样,三个属性parallelism-min用于parallelism-factor计算parallelism-max参数parallelism,然后提供给底层ForkJoinPool。公式是parallelism = clamp(parallelism-min, ceil(available processors * factor), parallelism-max)

    现在关于并行性。正如您从文档中看到的那样,它大致对应于“热”线程的数量,但在某些情况下可能会产生额外的线程。即,当某些线程在 ManagedBlocking 中被阻塞时。阅读该答案以获取更多详细信息。

  2. 我如何知道并行度-max 的大小

    这取决于您的用例。如果每个任务阻塞一个线程,您期望同时执行多少个任务?

  3. 假设我要使用这个执行上下文来进行 REST API 调用,我应该如何调整它的大小?

    同样,您要同时发出多少个请求?如果你要阻塞你的线程,并且你希望有大量的同时 http 调用,并且你希望它们被尽快处理,你需要大线程池。

    但是,如果您的应用程序发出那么多 http 请求,为什么不使用现有的库。像ApacheHttpClient这样的库允许您根据 http 连接或每个主机的连接来配置并行性。

    同样为了从actor进行http调用,使用非阻塞http客户端是很自然的,比如基于netty的 AsyncHttpClient。它内部也有线程池(显然),但它是固定的,并且任何数量的同时连接都由这个固定数量的线程以非阻塞方式处理。

于 2016-04-17T09:01:11.117 回答