在我的应用程序(它是一个HTTP服务)中公开了可以被其他服务使用的几个API的情况下,我不得不调用两个不同的外部服务,即消息服务和另一个REST服务。
我了解对于这些I / O绑定操作,最好使用单独的线程池或ExecutionContext。我正在使用以下内容为我的application.conf中的自定义ExecutionContext创建配置:
execution-context {
fork-join-executor {
parallelism-max = 10
}
}
我有一些问题:
这会创建10个专用线程吗?
关闭,但不完全是。正如你可以读取从阿卡文档,三个属性,parallelism-min
,parallelism-factor
和parallelism-max
用于计算parallelism
,然后将其供给到底层参数ForkJoinPool。公式是parallelism = clamp(parallelism-min, ceil(available processors * factor), parallelism-max)
。
现在介绍并行性。正如您从文档中看到的那样,它大致对应于“热”线程的数量,但是在某些情况下,可能会产生其他线程。即,当某些线程在ManagedBlocking内部被阻塞时。阅读该答案以获取更多详细信息。
我怎么知道最大并行度的大小
这取决于您的用例。如果您为每个任务阻塞一个线程,您期望同时执行多少个任务?
假设我要使用此执行上下文进行REST API调用,应该如何调整大小?
同样,您要同时发出几个请求?如果要阻塞线程,并且希望同时进行大量http调用,并且希望尽快对其进行处理,则需要较大的线程池。
但是,如果您的应用程序发出了许多http请求,为什么不使用现有的库。诸如ApacheHttpClient之类的库允许您根据http连接或每个主机的连接来配置并行性。
同样,为了从参与者发出http调用,很自然地使用非阻塞的http客户端,例如基于netty的AsyncHttpClient。它内部也有线程池(很明显),但是它是固定的,并且此固定数量的线程以非阻塞方式处理任意数量的同时连接。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句