在lagom中:随着并发http调用的增加,线程数(akka.actor.default-dispatcher)也在增加,如何控制这种行为?

ss2ws0br  于 2022-11-06  发布在  Go
关注(0)|答案(1)|浏览(128)

我们观察到,在增加对我们服务的并发http调用时,线程计数(akka.actor.default-dispatcher)保持增加(见visualVM的屏幕截图)。同样,在请求停止后,线程计数不会下降。而且大多数线程保持在PARK状态。线程的这种成比例增加是预期行为吗?我们如何控制这种情况,并在请求得到服务后重用相同的参与者或杀死参与者。
我正在运行lagom-samples中的购物车示例。

akka.actor.default-dispatcher {
  executor = "fork-join-executor"
  fork-join-executor {
       parallelism-min = 2
       parallelism-factor = 1.0
       parallelism-max = 6
    }
    throughput = 1

}
VisualVM SS of thread analysis for lagom application
编辑:使用线程池执行器作为akka.actor.default-dispatcher在多个(20-30)并发请求后停止服务任何请求。甚至控制台也没有响应。

default-dispatcher  {
 type = Dispatcher
 executor = default-executor
 throughput = 1
 default-executor = { fallback = thread-pool-executor }
 thread-pool-executor = {
     keep-alive-time = 60s
     core-pool-size-min = 8
     core-pool-size-factor = 3.0
     core-pool-size-max = 64
     max-pool-size-min = 8
     max-pool-size-factor = 3.0
     max-pool-size-max = 64
     task-queue-size = -1
     task-queue-type = linked
     allow-core-timeout = on
    }
 }

在akka文档的介绍中,它强调了“数百万的参与者可以被有效地调度到十几个线程上”。

unguejic

unguejic1#

您是否阻塞了您的调用?例如,您是否调用了Thread.sleep?或者使用了一些同步IO?如果是,那么您所看到的完全是意料之中的。
Lagom是一个异步框架。它提供的所有IO和服务间通信机制都是非阻塞的。它的线程池被调整为非阻塞的。如果你只使用非阻塞调用,你会看到线程池以非常低的线程数运行,你不会发现事情没有响应。
但是当你开始阻塞的时候,所有的赌注都泡汤了。阻塞需要每个请求一个线程。
Akka使用的默认调度器是一个fork join池。它是为异步使用而设计的。如果你阻塞了池中的一个线程,它将启动另一个线程以确保其他任务可以继续。所以,这就是为什么你会看到线程池增长。不要阻塞,这种情况就不会发生。
另一方面,线程池执行器使用固定数量的线程。如果阻塞,则可能导致整个应用程序死锁。如果不阻塞,则不会发生这种情况。

相关问题