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

时间:2015-08-22 03:07:42

标签: akka spray

我有一个应用程序使用spray-servlet通过spray.servlet.Initializer引导我的自定义Spray路由Actor。然后请求通过spray.servlet.Servlet30ConnectorServlet传递给我的演员。

从我可以收集到的内容,Servlet30ConnectorServlet只是从应用程序启动时Initializer设置的ServletContext中检索我的Actor,并将HttpServletRequest交给我的Actor&#39接收方法。这让我相信只有一个我的Actor实例才能处理所有请求。如果我的Actor在其receive方法中阻塞,则后续请求将排队等待它完成。

现在我意识到我可以编写我的路由Actor以使用detach()或返回Future的complete,但是大多数文档从未暗示必须这样做。

如果我的上述假设为真(单个Actor实例处理所有请求),是否有办法配置Servlet30ConnectorServlet可能在我的路由Actor的多个实例之间加载平衡传入请求而不仅仅是一个?或者这是我必须通过继承Servlet30ConnectorServlet

来推动自己

1 个答案:

答案 0 :(得分:1)

我做了一些研究,现在我更了解spray-servlet的工作原理。它不是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")

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