2010-11-17 115 views
7

我需要构建非常并发的Web服务,它将为JavaScript(前端)和Rails(后端)公开基于REST的API。 Web服务将适用于MongoDB的数据访问API。基于演员的Web框架可用于Scala吗?

我已经写了一个使用NodeJS的初始实现,并且想尝试基于Scala的解决方案。我也在考虑Erlang,每个Web框架都是基于actor的。

所以我正在寻找使用Actors显式构建的Web框架以支持大量的请求我对Scala很陌生,我不太了解Actor如果几乎所有的Scala框架都基于在每个请求上创建一个线程的Java servlet,这些线程将耗尽我场景中的所有资源。

+0

这是一个老问题,但你应该看看播放2.0将在网状运行和阿卡使用。 – 2011-11-17 15:36:21

回答

3
  1. 如果你真的要具有10K +长活动连接的时间,那么任何标准的Java应用服务器/框架(也许,除了Netty中)将不会为你工作 - 所有这些都消耗大量的的内存(即使使用任何种类的智能NIO)。你最好坚持一个基于集群的基于事件循环的解决方案(比如你已经尝试过的node.js),用zeroMQ支持的杂种,用于写入由Scala Actors调查的MQ模式的nginx等。

  2. 在Scala/Java框架中,Lift对REST具有良好的异步支持(尽管它不直接与演员绑定)。 OTOH,LinkedIn将Scalatra + stdlib actors用于Signal背后的REST服务,感觉很好。

+0

谢谢,连接不会很长,但它们大概10k左右很容易。我试图理解Lift是如何工作的,我不喜欢他们想要让所有其他地方都有会话。由于其简单性,Sinatra/ExpressJS/Scalatra更适合我。你提到LinkedIn如何使用Scalatra - 但他们表示'Scalatra不使用任何演员',这很可惜。 – sha1dy 2010-11-18 12:39:00

+0

1. Lift CometActors和异步REST与会话无关(两者趋于无状态)。 2. Scalatra没有像Lift那样使用演员(例如CometActor)并没有阻止任何人使用演员与我认识的+一起使用,Scalatra开发人员正在致力于COMET的支持 – 2010-11-18 12:49:04

+0

感谢您解释如何电梯工程。关于Scalatra的和演员 - 将Scalatra的重负载下的死,因为它会创建新的线程为每一个请求,因为它默认实现扩展非标准的java类(似乎github.com不是在这个世界的一部分回应,所以我可以看一下班Scalatra延伸)? – sha1dy 2010-11-18 13:20:13

0

http://liftweb.net/事实上,一个请求从一个servlet开始,然后lift使用在许多servlet容器中发现的comet支持脱离线程,保持请求上下文(容器不会销毁),然后可以用于在演员中输出数据。

http://akkasource.org也有休息的支持,但直到演员与工作

+0

Scala有什么升降机?我喜欢西纳特拉(或ExpressJS)和我很退出知道西纳特拉(Scalatra的)的端口也存在斯卡拉,但似乎它并没有使用演员 – sha1dy 2010-11-17 21:00:54

+0

嗯,如前所述,阿卡具有REST和演员。它通过整合气氛图书馆来支持进行中的彗星支持。对于我的使用情况下,气氛不好(我能弄清楚是如何用它做聊天般的服务,而不是“开始” - >“重生演员” - >“完成”循环) – IttayD 2010-11-17 21:11:38

+1

阿卡有彗星模块正在进行代号akka-mist可能会做你需要的东西 - >接受传入的请求,将其派发给演员,让演员异步完成请求。 – 2010-11-19 18:53:33

1

另一种选择是Play framework完成它会阻塞线程。最新的1.1版本支持Scala。它也支持akka作为模块。

+0

我相信Play 2.0的新版本会通过AKK来支持演员,并且会使用netty。 – 2011-11-17 15:34:20

1

至于Scalatra的本身,他们一直在努力呼吁SSGI(类似于在Servlet /架/ WSGI/WAI层)的新要求0​​抽象, ,他们说应该ennable他们从单纯突破作为 Servlet运行,并且也运行在使用Netty构建的东西之上。见线程herehttp://github.com/scalatra/ssgi

有因为从底层设计为支持异步Web服务(不会占用每个请求的线程),在简单的Scalatra的级别其他一些有趣的框架:

https://github.com/jdegoes/blueeyes - 不是一个servlet;建在Netty上。 (“松散的灵感来自... Scalatra”)

http://spray.cc/ - 基于Akka演员,Akka Mist。的Servlet 3.0或码头延续 (“喷雾在很大程度上受到BlueEyes和Scalatra的启发。”)

而在较低的水平: https://github.com/rschildmeijer/loft - “继续基于无阻塞,异步,单线程网络 服务器”。 没有生产准备,但看起来很有趣。继续需要编译器插件。