用于 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
}
}
我有几个问题:
- 这是要创建 10 个专用线程吗?
- 我怎么知道最大并行度的大小?
- 假设我要使用此执行上下文进行 REST API 调用,我应该如何调整它的大小?
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 了解更多详细信息。
How do I know the size of the parallelism-max
这取决于您的用例。如果每个任务阻塞一个线程,您期望同时执行多少个任务?
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。它内部也有线程池(很明显),但它是固定的,任何数量的并发连接都由这个固定数量的线程以非阻塞方式处理。
在我的应用程序中,它是一个 HTTP 服务,公开了几个可以被其他服务使用的 API's,我有一种情况,我必须调用 2 个不同的外部服务,这将是一个消息传递服务和另一个 REST 服务。
我了解到,对于这些 I/O 绑定操作,使用单独的线程池或 ExecutionContext 是一种很好的做法。我正在使用以下内容为我的 application.conf:
中的自定义 ExecutionContext 创建配置execution-context {
fork-join-executor {
parallelism-max = 10
}
}
我有几个问题:
- 这是要创建 10 个专用线程吗?
- 我怎么知道最大并行度的大小?
- 假设我要使用此执行上下文进行 REST API 调用,我应该如何调整它的大小?
Is this going to create 10 dedicated threads?
接近,但不完全是。 正如你can read from Akka documentation, three properties,
parallelism-min
,parallelism-factor
andparallelism-max
are used to calculateparallelism
parameter that is then supplied to underlying ForkJoinPool。公式为parallelism = clamp(parallelism-min, ceil(available processors * factor), parallelism-max)
.现在谈谈并行性。正如您从文档中看到的那样,它大致对应于 "hot" 线程的数量,但在某些情况下可能会产生额外的线程。即,当某些线程在 ManagedBlocking 中被阻塞时。阅读 that answer 了解更多详细信息。
How do I know the size of the parallelism-max
这取决于您的用例。如果每个任务阻塞一个线程,您期望同时执行多少个任务?
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。它内部也有线程池(很明显),但它是固定的,任何数量的并发连接都由这个固定数量的线程以非阻塞方式处理。