我当前的系统大约有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
}
显然,这些设置没有为想要的表演定义足够的资源,所以我想知道:
谢谢。
答案 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)