在我的应用程序中,它是一个公开可以被其他服务使用的多个API的HTTP服务,我有一种情况,我必须调用2个不同的外部服务,这些服务将是一个消息传递服务和另一个REST服务。
我理解对于这些I / O绑定操作,使用单独的线程池或ExecutionContext是一个好习惯。我使用以下命令在application.conf中为自定义ExecutionContext创建配置:
execution-context {
fork-join-executor {
parallelism-max = 10
}
}
我有几个问题:
答案 0 :(得分:1)
这会创建10个专用线程吗?
关闭,但不完全是。
正如您在Akka文档中can read所述,我们使用了三个属性parallelism-min
,parallelism-factor
和parallelism-max
来计算parallelism
参数,然后将其提供给基础{{3} }}。公式为parallelism = clamp(parallelism-min, ceil(available processors * factor), parallelism-max)
。
现在关于并行性。正如您可以从文档中读取的那样,它大致对应于“热”线程的数量,但在某些情况下可能会生成其他线程。即,当一些线程在ManagedBlocking中被阻塞时。有关其他详细信息,请阅读ForkJoinPool。
我如何知道parallelism-max
的大小
这取决于您的使用案例。如果您为每个任务阻止一个线程,您期望同时执行多少个任务?
如果我要使用此执行上下文进行REST API调用,我应该如何调整大小?
同样,您想要同时发出多少个请求?如果您要阻止线程,并且您希望同时进行大量的http调用,并且希望尽快处理它们,则需要大型线程池。
但是,如果您的应用程序发出了很多http请求,为什么不使用现有的库。像that answer这样的库允许您在http连接或每个主机的连接方面ApacheHttpClient。
同样,对于来自actor的http调用,使用非阻塞的http客户端很自然,例如configure parallelism。它内部也有线程池(很明显),但是它是固定的,并且这个固定数量的线程以非阻塞方式处理任意数量的同时连接。