为大量并发图配置Akka调度程序

时间:2019-06-18 18:38:19

标签: java akka akka-stream java.util.concurrent

我当前的系统大约有10万个运行图形,每个图形都是这样构建的:

Amqp源〜>处理阶段〜>接收器

每个amqp源以每秒1的速率接收消息。大约只有一万个图同时接收消息,因此,我认为并发运行的线程不必超过一万。

这些是我目前正在使用的设置:

my-dispatcher {
  type = Dispatcher
  executor = "fork-join-executor"
  fork-join-executor {
    parallelism-min = 16
    parallelism-factor = 2.0
    parallelism-max = 32
  }
  throughput = 20
}

显然,这些设置没有为想要的表演定义足够的资源,所以我想知道:

  1. 我是否可以假设一万个线程足够?
  2. 是否可以为该数量的线程配置调度程序(通过编辑application.conf)?配置如何?我应该选择“ fork-join-executor”还是“ thread-pool-executor”作为执行器?

谢谢。

1 个答案:

答案 0 :(得分:2)

Akka和Akka Streams基于异步,actor或流仅使用线程进行大量处理,然后将线程交还给线程池,这很不错,因为您可以根据内核数来调整线程池的大小必须实际执行线程,而不是要执行的事情。在调度/切换以及JVM为每个线程分配大约0.5-1Mb的空间方面,拥有许多线程会产生开销。

因此,一万个actor或正在运行的流仍可以在一个小的线程池上正常执行。线程数量的增加可能会减慢处理速度,而不是加快速度,因为要花更多的时间在线程之间进行切换。即使是默认设置也可能很好,您应该在调整时始终进行基准测试,以查看更改是否达到了预期的效果。

通常,fork联接池为actor和stream提供了良好的性能。基于线程池的线程池非常适合无法避免阻塞的用例(请参阅文档的这一部分:https://doc.akka.io/docs/akka/current/dispatchers.html#blocking-needs-careful-management