我有一个应用程序使用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
?
答案 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池来防止来自的大量请求来自瓶颈缩小的单身过度劳累的演员。或者我可能忽略了它。