用于REST API调用的Scala ExecutionContext

时间:2016-04-17 07:13:20

标签: scala akka executioncontext

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

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

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

我有几个问题:

  1. 这会创建10个专用线程吗?
  2. 我如何知道parallelism-max的大小?
  3. 如果我打算使用此执行上下文进行REST API调用,我应该如何调整此大小?

1 个答案:

答案 0 :(得分:1)

  1.   

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

    关闭,但不完全是。 正如您在Akka文档中can read所述,我们使用了三个属性parallelism-minparallelism-factorparallelism-max来计算parallelism参数,然后将其提供给基础{{3} }}。公式为parallelism = clamp(parallelism-min, ceil(available processors * factor), parallelism-max)

    现在关于并行性。正如您可以从文档中读取的那样,它大致对应于“热”线程的数量,但在某些情况下可能会生成其他线程。即,当一些线程在ManagedBlocking中被阻塞时。有关其他详细信息,请阅读ForkJoinPool

  2.   

    我如何知道parallelism-max

    的大小

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

  3.   

    如果我要使用此执行上下文进行REST API调用,我应该如何调整大小?

    同样,您想要同时发出多少个请求?如果您要阻止线程,并且您希望同时进行大量的http调用,并且希望尽快处理它们,则需要大型线程池。

    但是,如果您的应用程序发出了很多http请求,为什么不使用现有的库。像that answer这样的库允许您在http连接或每个主机的连接方面ApacheHttpClient

    同样,对于来自actor的http调用,使用非阻塞的http客户端很自然,例如configure parallelism。它内部也有线程池(很明显),但是它是固定的,并且这个固定数量的线程以非阻塞方式处理任意数量的同时连接。