java - 为大量并发图配置 akka 调度程序

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

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

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

每个 amqp 源以每秒 1 条的速率接收消息。一次只有大约 10,000 个图接收消息,所以我认为没有必要同时运行超过 10,000 个线程。

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

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

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

  1. 我是否正确地假设 10000 个线程就足够了?
  2. 是否可以为该数量的线程配置调度程序(通过编辑 application.conf)?配置会是什么样子?我应该选择“fork-join-executor”还是“thread-pool-executor”作为执行器?

谢谢。

最佳答案

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

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

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

关于java - 为大量并发图配置 akka 调度程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56655154/

相关文章:

java - 通过引用其他存储库或项目或 jar 文件中的其他 protobuf 消息,分层组合 Protocol buffers (protobuf) 定义

scala - 测试依赖于 future 的 AKKA Actor

akka - 如何使用 akka 作为复制机制

Akka Streams Graph DSL 表示法

scala - Akka Streams 自定义合并

scala - Akka 流 : how to wait until several Flows are completed

java - 使用java打印html文件而不向用户显示打印对话框

java - Java等编程语言中的结构化分类器对应什么?

java - 强化 : vsprintf: prevented 33-byte write into 32-byte buffer

Scala Akka 使用 SLF4J MDC 进行日志记录