我正在尝试使用akka-http测试我的应用程序,它接收POST发送的一些json并用它们做一些事情。我正在尝试提高我的http路由可以处理的最大线程数。为了测试这个,我把Thread.sleep放在一个基本路线中。我期待的是路由最多处理“parallelism-max”POST请求,直到它因为缺少线程而阻塞。
让我用以下例子解释:
当我的程序启动时,我使用以下代码创建ActorSystem:
system = ActorSystem("foo", ConfigFactory.load())
我定义了隐式材质化器(类型为ActorMaterializer):
implicit lazy val materializer: ActorMaterializer = ActorMaterializer(ActorMaterializer().settings.withDispatcher("akka.actor.dispatcher-fork"))
我创建自己的调度程序以便以这种方式控制线程数:
akka {
actor {
dispatcher-fork {
type = "Dispatcher"
executor = "default-executor"
default-executor {
fallback = "fork-join-executor"
}
fork-join-executor {
parallelism-min = 2
parallelism-factor = 3.0
parallelism-max = 20
task-peeking-mode = "FIFO"
}
}
}
}
我处理我的数据:
val basicRoute =
post{
complete {
logger.info("hey: " + Thread.currentThread().getId)
Thread sleep 60000 //Let the threads sleep to see how many of them I can have
StatusCodes.Accepted -> None // Body none
}
}
这是日志的状态:
Starting Akka...
Running Akka 2.4.1
INFO c.t.b.app.App$ Listening on 0.0.0.0:2554
Successfully started Akka
INFO c.t.b.app.App$ hey: 70
INFO c.t.b.app.App$ hey: 73
INFO c.t.b.app.App$ hey: 75
INFO c.t.b.app.App$ hey: 72
INFO c.t.b.app.App$ hey: 77
INFO c.t.b.app.App$ hey: 74
如果我发送更多POST请求,直到我的某些线程唤醒并完成其处理,则没有任何反应。
我试图更改此参数:
parallelism-min = 2
parallelism-max = 20
到这些:
parallelism-min = 1
parallelism-max = 2
它按预期工作(在块之前只接收2条消息)。
为什么第一种情况不起作用?
提前感谢您的帮助。
PS:这些是我正在使用的版本:
Akka Version = 2.4.1
Akka Stream And Http Version = 2.0.2
我已经检查过的资源:
http://doc.akka.io/docs/akka/current/scala/dispatchers.html http://doc.akka.io/docs/akka/current/general/configuration.html
编辑: 使用的CPU是英特尔®酷睿™i7-4790S CPU @ 3.20GHz×8,因此使用超线程的4个物理内核(8个逻辑内核)。