配置 spray-servlet 以避免请求瓶颈

Configuring spray-servlet to avoid request bottleneck

我有一个应用程序,它通过 spray.servlet.Initializer 使用 spray-servlet 到 bootstrap 我的自定义喷雾路由 Actor。然后请求通过 spray.servlet.Servlet30ConnectorServlet.

传递给我的 Actor

据我所知,Servlet30ConnectorServlet 只是从应用程序启动时 Initializer 设置的 ServletContext 中检索我的 Actor,然后将 HttpServletRequest 交给我的 Actor接收方法。这让我相信只有我的 Actor 的 one 实例必须处理所有请求。如果我的 Actor 在其 receive 方法中阻塞,则后续请求将排队等待它完成。

现在我意识到我可以对我的路由 Actor 进行编码以使用 detach()complete 那个 returns 一个 Future,但是大多数文档从未暗示必须这样做.

如果我的上述假设是正确的(单个 Actor 实例处理所有请求),是否有一种方法可以配置 Servlet30ConnectorServlet 以可能在我的路由 Actor 的多个实例之间对传入请求进行负载平衡,而不仅仅是一?或者这是我必须通过子类化 Servlet30ConnectorServlet?

来解决的问题

我做了一些研究,现在我更了解 spray-servlet 的工作原理。决定创建多少请求处理程序 Actors 的策略不是 spray-servlet,而是 the example I based my application on 提供的管道代码。

我一直以来的假设是 spray-servlet 本质上会像传统的 Java EE 应用程序调度程序一样以处理程序每​​个请​​求的方式(或该概念的某些合理变体)工作。事实并非如此,因为它将请求路由到具有邮箱的 Actor,而不是某个单例 HttpServlet。

我现在将请求委托给参与者池,以减少系统负载时出现瓶颈的可能性。

val serviceActor = system.actorOf(RoundRobinPool(config.SomeReasonableSize).props(Props(Props[BootServiceActor])), "my-route-actors")

示例和文档假设每个人都会在喷雾下编写非阻塞请求处理程序 Actors,但我仍然感到有些困惑。他们所有的文档本质上都演示了非 Future 渲染 complete,但是在他们的文献中没有提到也许,只是也许,您可能想要创建一个合理大小的请求处理程序 Actors 池来防止大量请求来自瓶颈可怜的单身过度劳累的演员。或者我可能忽略了它。