有哪些基于演员模型的Scala Web框架可用?

7
我需要构建一个非常并发的Web服务,它将为JavaScript(前端)和Rails(后端)提供基于REST的API。Web服务将适用于MongoDB的数据访问API。
我已经使用NodeJS编写了一个初始实现,并想尝试基于Scala的解决方案。我还在考虑Erlang,因为每个Web框架都是基于Actor的。
因此,我正在寻找明确使用Actor构建的Web框架,以支持大量请求负载。我对Scala很陌生,不太理解如果几乎所有Scala框架都基于Java servlets,那么Actor如何工作,而这会在我的场景中耗尽所有资源。

这是一个老问题,但你应该看看Play 2.0,它将在netty上运行并使用akka。 - Adam Gent
4个回答

3
  1. 如果您真的需要同时拥有10k+长时间活动连接,那么任何标准的Java应用服务器/框架(除了Netty)都不适合您 - 即使使用任何智能NIO,它们都会消耗大量内存。您最好选择基于集群事件循环的解决方案(例如已经尝试过的node.js,由zeroMQ支持的mongrel,nginx与写入由Scala Actors轮询的MQ模式等)。

  2. 在Scala / Java框架中,Lift对REST具有良好的异步支持(虽然它与actors没有直接联系)。另一方面,LinkedIn在Signal后面使用Scalatra + stdlib actors来支持其REST服务,并且感觉非常好。


谢谢,连接不会很长,但它们将非常容易达到10k。我试图理解Lift的工作原理,但我不喜欢他们在各个地方都有会话的想法。Sinatra/ExpressJS/Scalatra对我来说更可取,因为它们更简单。你提到了LinkedIn如何使用Scalatra - 但他们表示'Scalatra不使用任何actors',这是遗憾的。 - sha1dy
  1. 提升CometActors和异步REST与会话无关(两者都倾向于无状态)。
  2. Scalatra不像Lift一样使用actors(例如像CometActor那样),但这并不妨碍任何人在使用actors时结合使用。据我所知,Scalatra开发人员现在正在研究COMET支持。
- Vasil Remeniuk
感谢您解释Lift的工作原理。关于Scalatra和actors - 由于其默认实现扩展了标准Java类(似乎在世界上的某些地方github.com没有响应,因此我无法查看Scalatra具体扩展了哪个类),它会为每个请求创建新线程,那么在重负载下,Scalatra会死掉吗? - sha1dy
1
ScalatraServlet 扩展了标准的 HttpServlet,因此,处理 10k 连接将会占用大约 2GB 的内存。如果内存对你来说是个问题,但你仍想坚持使用 Java 生态系统,那么你应该暂时忘记与 actors 的紧密集成(并选择 NettyMina 或更高级别的 Atmosphere)。 - Vasil Remeniuk
1
你可能会觉得这很有趣:http://www.jboss.org/netty/performance/20090607-asalihefendic.html - Vasil Remeniuk

1

就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 服务器。” 虽然不够成熟,但看起来相当有趣。使用续体需要编译器插件。

1

另一个选择是 Play框架。最新的1.1版本支持Scala。它也支持作为模块的akka。


我相信Play的新版本2.0将通过akka提供actor支持,并使用netty。 - Adam Gent

0

http://liftweb.net/ 实际上,请求最初是作为一个servlet启动的,但是Lift使用了许多servlet容器中发现的comet支持来脱离线程,保留请求上下文(容器随后不会销毁),然后可以在actors中用于输出数据。

http://akkasource.org 也支持rest,但它将阻塞线程,直到actor完成其工作。


有没有比Lift更轻量级的Scala框架?我喜欢Sinatra(或ExpressJS),很高兴知道Scala也有Sinatra的移植版(Scalatra),但似乎它不使用Actors。 - sha1dy
好的,正如提到的,Akka具有REST和Actors。通过集成atmosphere库,它正在进行comet支持。对于我的用例,atmosphere并不好用(我只能想到如何使用它进行类似聊天服务的操作,而无法实现“开始” - >“生成actor” - >“完成”循环)。 - IttayD
1
Akka正在进行一个名为akka-mist的Comet模块,它可能会做你需要的事情 -> 接受传入请求,将其分派给一个actor,让该actor异步地完成请求。 - Viktor Klang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接