Play Framework 在向服务器添加更多资源时是否会扩展线程池

Play Framework does it threadpool scale when adding more resources to server

我是新手,正在使用它进行同步数据库调用,有一些我不清楚或有误解的地方;首先,在我的 application.conf 中,我输入了以下代码

play {
  akka {
    akka.loggers = ["akka.event.slf4j.Slf4jLogger"]
    loglevel = WARNING
    actor {
      default-dispatcher = {
        fork-join-executor {
          parallelism-min = 300
          parallelism-max = 300
        }
      }
    }
  }
}

这是我从 https://www.playframework.com/documentation/2.3.x/ThreadPools and also have read 得到的。这意味着您始终有 300 个线程可用于阻止数据库操作?或者最多每秒 300 个请求?另外,如果我有更多的服务器资源,比如更多的 Ram、CPU 或内核,这会增加可用线程的数量吗?例如,如果我购买了一台有 4 个内核或等等的服务器。可用线程会跳到 1,200 个吗?如前所述,我的所有操作都阻止了用户注册和用户聊天,所以现在我想在错误变得更昂贵之前消除它们。

我也想知道整个 Akka 和线程的东西有一段时间了,所以我做了一些研究,这就是我想出的。希望对你有帮助。

Play 使用 Akka 进行线程管理和并发。好处是在你的应用程序编程中再也不用担心并发的麻烦了。

Akka 使用 dispatchers 来管理它的 actor 的处理器时间(actors 是 Akka 中实际计算发生的地方)。

Dispatchers are one of the most important parts of Akka.NET, as they control the throughput and time share for each of the actors, giving each one a fair share of resources.

Akka 允许使用不同的调度程序,但默认调度程序是 'fork-join-executor',这也是 Play 默认使用的调度程序。

在您的配置中,您将最小和最大线程数设置为 300。这样您可以将线程数固定为 300,因为您希望线程池大小非常大,因为您有许多同步数据库调用。您有 300 个独立于处理器数量的线程。如果您购买一台处理器更多的新服务器,它仍然是 300。

否则,如果不设置最小和最大线程数,调度程序将根据公式available processors * parallelism-factor进行一些计算。当然你也可以设置这个parallelism-factor来适应不同服务器的不同处理器数量。因此,如果您将此并行度因子设置为 75,它将导致在具有 4 个处理器的服务器上最多有 300 个线程,而在具有 8 个处理器的服务器上最多有 600 个线程。

在 Akka 的源代码中,它记录在案:

The parallelism factor is used to determine thread pool size using the following formula: ceil(available processors * factor). Resulting size is then bounded by the parallelism-min and parallelism-max values.

如果您想了解更多关于 Akka 和调度程序的信息,我推荐 akka-concurrency-test 的文档,它本身就有很好的资源列表。