用于 REST API 调用的 Scala ExecutionContext

Scala ExecutionContext for REST API Calls

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

我了解到,对于这些 I/O 绑定操作,使用单独的线程池或 ExecutionContext 是一种很好的做法。我正在使用以下内容为我的 application.conf:

中的自定义 ExecutionContext 创建配置
execution-context {
  fork-join-executor {
    parallelism-max = 10
  }
}

我有几个问题:

  1. 这是要创建 10 个专用线程吗?
  2. 我怎么知道最大并行度的大小?
  3. 假设我要使用此执行上下文进行 REST API 调用,我应该如何调整它的大小?
  1. Is this going to create 10 dedicated threads?

    接近,但不完全是。 正如你can read from Akka documentation, three properties, parallelism-min, parallelism-factor and parallelism-max are used to calculate parallelism parameter that is then supplied to underlying ForkJoinPool。公式为parallelism = clamp(parallelism-min, ceil(available processors * factor), parallelism-max).

    现在谈谈并行性。正如您从文档中看到的那样,它大致对应于 "hot" 线程的数量,但在某些情况下可能会产生额外的线程。即,当某些线程在 ManagedBlocking 中被阻塞时。阅读 that answer 了解更多详细信息。

  2. How do I know the size of the parallelism-max

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

  3. Say if I'm going to use this execution context to make REST API calls, how should I size this?

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

    但是,如果您的应用程序发出那么多 http 请求,为什么不使用现有的库。在 http 连接数或每个主机的连接数方面像 ApacheHttpClient allow you to configure parallelism 的库。

    此外,对于来自演员的 http 调用,使用非阻塞 http 客户端是很自然的,例如 netty-based AsyncHttpClient。它内部也有线程池(很明显),但它是固定的,任何数量的并发连接都由这个固定数量的线程以非阻塞方式处理。