【问题标题】:Scala ExecutionContext for REST API Calls用于 REST API 调用的 Scala ExecutionContext
【发布时间】:2016-04-17 07:13:19
【问题描述】:

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

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

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

我有几个问题:

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

【问题讨论】:

    标签: scala akka executioncontext


    【解决方案1】:
    1. 这会创建 10 个专用线程吗?

      关闭,但不完全正确。 正如您在 Akka 文档中的 can read 一样,三个属性 parallelism-minparallelism-factorparallelism-max 用于计算 parallelism 参数,然后将其提供给底层 ForkJoinPool。公式为parallelism = clamp(parallelism-min, ceil(available processors * factor), parallelism-max)

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

    2. 我怎么知道parallelism-max的大小

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

    3. 假设我要使用这个执行上下文来进行 REST API 调用,我应该如何调整它的大小?

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

      但是,如果您的应用程序发出如此多的 http 请求,为什么不使用现有的库。 ApacheHttpClient 之类的库允许您在 http 连接或每个主机的连接方面使用 configure parallelism

      同样为了从actor进行http调用,使用非阻塞http客户端是很自然的,比如netty-based AsyncHttpClient。它内部也有线程池(显然),但它是固定的,并且任何数量的同时连接都由这个固定数量的线程以非阻塞方式处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 2016-11-06
      相关资源
      最近更新 更多