Multithreading akka http的不同执行上下文和线程分配
不确定这个问题是否正确 我有一个akka http应用程序,它充当一些繁重计算的前端。它处理的请求在处理它们所需的时间上有所不同。有些在一秒钟内完成,有些则需要更多时间。计算完全是异步的,在任何时候都没有等待,我用未来完成请求,即:Multithreading akka http的不同执行上下文和线程分配,multithreading,scala,akka,akka-http,Multithreading,Scala,Akka,Akka Http,不确定这个问题是否正确 我有一个akka http应用程序,它充当一些繁重计算的前端。它处理的请求在处理它们所需的时间上有所不同。有些在一秒钟内完成,有些则需要更多时间。计算完全是异步的,在任何时候都没有等待,我用未来完成请求,即: val spotsJsonF: Future[String] = spotsF.map(spots => DebugFormatter.produceJson(text, spots._1, spots._2, env)) complete(spotsJso
val spotsJsonF: Future[String] = spotsF.map(spots => DebugFormatter.produceJson(text, spots._1, spots._2, env))
complete(spotsJsonF.map { t => HttpEntity(ContentTypes.`application/json`, t) })
我的要求/假设:
- 我需要最大限度地提高并行性,即在重载情况下不应拒绝连接
- 如果服务忙的话,我可以忍受一些(甚至是小的)需要更长时间的请求
- 我可以在重载下处理一些非常长的请求,只要它们在HTTP请求超时后不会对并行性造成太大影响
ExecutionContext.global
),即它在与Akka http dispatcher使用的线程池不同的线程池上生成和修改Future
s。我认为这将停止Akka线程上的计算,这样它就可以接受更多的连接。目前它是Akka的默认调度程序(myreference.conf
为空):
但是,由于超时,Akka取消了请求后,长时间运行的计算会继续执行很长时间。在内核数量有限的情况下,这意味着拒绝请求的数量开始增加,即使不再需要启动此重载的计算
显然,我不知道如何正确管理这个应用程序中的线程
满足我的要求的最佳方式是什么?几个线程池-好/坏主意?我需要明确取消吗?在这一点上,使用Scala的未来可能不是最好的选择?对我来说,这听起来并不是关于管理线程,将繁重的工作隔离到一个单独的调度程序,而是关于管理实际的处理 为了能够在工作中期停止一个长时间运行的流程,可以说,您需要将它分成更小的块,这样,如果不再需要它,您可以在中途中止它 actors的一种常见模式是让处理actor存储“到目前为止”的结果或将其作为消息发送给自己,这样它就可以对中间的“停止工作”消息做出反应,或者可能检查它是否处理了很长时间以至于应该中止。例如,触发工作负载的消息可以包含这样一个超时值,以允许“客户端”指定它
(这与处理
InterruptedException
和线程基本上是一样的。在手动线程和阻塞应用程序中,isInterrupted
正确)对我来说,这听起来并不是真正的管理线程,而是将繁重的工作隔离到一个单独的调度程序上,但是关于管理实际的处理
为了能够在工作中期停止一个长时间运行的流程,可以说,您需要将它分成更小的块,这样,如果不再需要它,您可以在中途中止它
actors的一种常见模式是让处理actor存储“到目前为止”的结果或将其作为消息发送给自己,这样它就可以对中间的“停止工作”消息做出反应,或者可能检查它是否处理了很长时间以至于应该中止。例如,触发工作负载的消息可以包含这样一个超时值,以允许“客户端”指定它
(这与处理
InterruptedException
和线程基本相同。在手动线程和阻塞应用程序中正确地中断了)您是否考虑过为每个资源创建单独的参与者?它应该很容易扩展,将繁重的计算代理给其他节点,在这种情况下,主节点将仅用作路由器。我们不将其用作分布式应用程序,因为它必须在内存中保留非常繁重的(13G)结构,所以我们只将其部署在大型EC2实例上。您是否考虑过创建单独的参与者,每个资源一个?它应该很容易扩展,将繁重的计算代理给其他节点,在这种情况下,主节点将仅用作路由器。我们不将其用作分布式应用程序,因为它必须在内存中保留非常繁重的(13G)结构,所以我们只将其部署在大型EC2实例上
"default-dispatcher": {
"attempt-teamwork": "on",
"default-executor": {
"fallback": "fork-join-executor"
},
"executor": "default-executor",
"fork-join-executor": {
"parallelism-factor": 3,
"parallelism-max": 64,
"parallelism-min": 8,
"task-peeking-mode": "FIFO"
},
"mailbox-requirement": "",
"shutdown-timeout": "1s",
"thread-pool-executor": {
"allow-core-timeout": "on",
"core-pool-size-factor": 3,
"core-pool-size-max": 64,
"core-pool-size-min": 8,
"fixed-pool-size": "off",
"keep-alive-time": "60s",
"max-pool-size-factor": 3,
"max-pool-size-max": 64,
"max-pool-size-min": 8,
"task-queue-size": -1,
"task-queue-type": "linked"
},
"throughput": 5,
"throughput-deadline-time": "0ms",
"type": "Dispatcher"
},