当前位置: 首页 > 知识库问答 >
问题:

如何在Spray.routing中安全地同时处理路由请求?

米裕
2023-03-14

Spray HTTP服务器的示例使用似乎使服务器按顺序而不是并发地处理请求变得非常容易。这是正确的,因为示例显示了作为一次处理一个请求的执行元实现的路由对象(FacePalm?**)。这似乎是一个普遍的问题。

有没有一种方法使用Spray.Routing在到达路由之前分叉执行?

import akka.actor.ActorSystem
import spray.http.{MediaTypes, HttpEntity}
import spray.routing.SimpleRoutingApp
import scala.concurrent.Future

class MySimpleServer(val system: ActorSystem, val HOST: String, val PORT: Int) extends SimpleRoutingApp {

  implicit val _system: ActorSystem = system
  import _system.dispatcher

  def main(args: Array[String]): Unit = {
    startServer(interface = HOST, port = PORT) {
      get {
        path("work1") {
          complete {
            // Asynchronously process some work
            Future.apply {
              Thread.sleep(1000)
              HttpEntity(
                MediaTypes.`text/html`,
                "OK"
              )
            }
          }
        } ~
          path("work2") {
            complete {
              // Synchronously process some work and block all routing for this Actor.
              // Oh sh*t!
              Thread.sleep(1000)
              HttpEntity(
                MediaTypes.`text/html`,
                "OK"
              )
            }
          } 
      }
    }
  }
}

**由于路由通常是一个无状态的操作,所以让路由器和参与者看起来并没有什么好处,对吗?

对于我使用过的每一个其他webserver,几乎在接受TCP连接后立即对处理程序进程或线程的连接进行分叉控制(more Sensitionly(IMO))。(我认为)这样可以最大限度地提高接收连接的速率,并最大限度地降低无意阻塞的风险--至少,完全避免了路由中的无意阻塞。

  detach() {
    get {...} ..
 }
 val responses = (0 until 10)
    .map { _ => (IO(Http) ? HttpRequest(GET, s"${TEST_BASE_URL}work1")).mapTo[HttpResponse] }
    .map { response => Await.result(response, 5 seconds) }

共有1个答案

王云
2023-03-14

实际上,即使您的work2路由也有可能使HTTP执行器处于饥饿状态,因为future.apply中使用的executioncontextsystem.dispatcher,即喷雾HttpServiceActor的上下文。我们可以为长期运行的期货提供一个不同的执行上下文,这样我们就不会冒着饿死Spray的风险。

不过,为了回答您的问题,有一个名为detach的指令,它将在某些ExecutionContext中运行路由的其余部分,从而可能将更多的资源留给传入的请求...但由于它是一个指令,分叉只在路由命中后发生。

 类似资料:
  • 问题内容: 我正在使用Angular2开发NodeJS应用程序。在我的应用程序中,我有一个主页和搜索页面。对于主页,我有一个将为 localhost:3000 /* 呈现的HTML页面,并且从主页用户导航到 搜索, 即 我由 angular2路由 处理的 localhost:3000 / search 页面。 * 我没有搜索页面的页面,其视图由angular2呈现。但是当我直接点击 localho

  • 我正在编写一个程序,该程序需要处理具有许多包装数字变量的对象,例如Long,Double,Integer等。如何安全地对这些操作执行数值运算,而不必到处放置空检查? 我认为这是几乎每个Java程序员迟早都必须处理的事情,所以我很惊讶没有数百篇关于这个主题的博客帖子和问题。 我目前的解决方案是通过以下方法过滤所有数字:

  • 由于在 StackOverflow 上已经有很多关于这个问题的问题,我首先要确保这不是重复和区分。 这是关于 在 2 个不同的身份验证 管理器中具有 2(或更多)不同的身份验证提供程序,以用于不同的路由。 使用 Spring Security 5.5 而不是 3.x 中的方法 使用基于非 XML 配置的方法 所以问题不在于: 如何在身份验证管理器中包含多个身份验证以提供“替代身份验证”(大多数问题

  • 在我的应用程序中,我使用Moya和Alamofire(还有Moya/rxswift和Moya-ObjectMapper)库来处理所有的网络请求和响应。 null 例如,对于任何请求,我可以得到响应“无效版本”,我希望避免签入每个响应,如果这个错误到达。 有没有用 处理这个用例的优雅方法?

  • 注意:“”表示我要在两个地址上侦听客户端。 server.py client.py

  • 问题内容: 我正在构建一个基于Netty的小型应用程序,该应用程序通过套接字连接(即telnet / ssh)执行I / O操作。我正在用Netty的类启动我的套接字服务器,给它: 类型的事件循环(即不应接受阻塞操作的共享线程池)。 一个类型的通道(我相信这必须与上面的#1相对应)。 一个非常简单的管道,带有可扩展的通道处理程序。 每当从客户端套接字连接接收到命令字符串时,都会调用我的处理程序的方