gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:27:40 25 4
gpt4 key购买 nike

我当前的系统有大约 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com