我已经使用NodeJS编写了一个初始实现,并想尝试基于Scala的解决方案。我还在考虑Erlang,因为每个Web框架都是基于Actor的。
因此,我正在寻找明确使用Actor构建的Web框架,以支持大量请求负载。我对Scala很陌生,不太理解如果几乎所有Scala框架都基于Java servlets,那么Actor如何工作,而这会在我的场景中耗尽所有资源。
如果您真的需要同时拥有10k+长时间活动连接,那么任何标准的Java应用服务器/框架(除了Netty)都不适合您 - 即使使用任何智能NIO,它们都会消耗大量内存。您最好选择基于集群事件循环的解决方案(例如已经尝试过的node.js,由zeroMQ支持的mongrel,nginx与写入由Scala Actors轮询的MQ模式等)。
在Scala / Java框架中,Lift对REST具有良好的异步支持(虽然它与actors没有直接联系)。另一方面,LinkedIn在Signal后面使用Scalatra + stdlib actors来支持其REST服务,并且感觉非常好。
ScalatraServlet
扩展了标准的 HttpServlet
,因此,处理 10k 连接将会占用大约 2GB 的内存。如果内存对你来说是个问题,但你仍想坚持使用 Java 生态系统,那么你应该暂时忘记与 actors 的紧密集成(并选择 Netty
、Mina
或更高级别的 Atmosphere
)。 - Vasil Remeniuk就Scalatra本身而言,他们一直在开发一个名为SSGI的新请求抽象(类似于Servlet/Rack/WSGI/WAI层),他们说这应该使他们能够摆脱仅作为Servlet运行并在Netty构建的某些东西之上运行。请参见此处的线程。 http://github.com/scalatra/ssgi
在Scalatra简单级别上还有一些其他有趣的框架,因为它们从头开始设计以支持异步Web服务(不会每个请求占用一个线程):
https://github.com/jdegoes/blueeyes - 不是servlet;建立在Netty之上。 (“受... Scalatra启发”)
http://spray.cc/ - 建立在Akka actors、Akka Mist之上。Servlet 3.0或Jetty continuations (“spray受BlueEyes和Scalatra的启发。”)
而在更低的层面上: https://github.com/rschildmeijer/loft - “基于续体的非阻塞、异步、单线程 Web 服务器。” 虽然不够成熟,但看起来相当有趣。使用续体需要编译器插件。另一个选择是 Play框架。最新的1.1版本支持Scala。它也支持作为模块的akka。
http://liftweb.net/ 实际上,请求最初是作为一个servlet启动的,但是Lift使用了许多servlet容器中发现的comet支持来脱离线程,保留请求上下文(容器随后不会销毁),然后可以在actors中用于输出数据。
http://akkasource.org 也支持rest,但它将阻塞线程,直到actor完成其工作。