Scala 都有哪些基于 actor 的 Web 框架?
Posted
技术标签:
【中文标题】Scala 都有哪些基于 actor 的 Web 框架?【英文标题】:What actor based web frameworks are available for Scala?Scala 有哪些基于 actor 的 Web 框架? 【发布时间】:2011-05-11 16:13:40 【问题描述】:我需要构建非常并发的 Web 服务,它将为 javascript(前端)和 Rails(后端)公开基于 REST 的 API。 Web 服务将适合 MongoDB 的数据访问 API。
我已经使用 NodeJS 编写了一个初始实现,并想尝试基于 Scala 的解决方案。我也在考虑 Erlang,每个 Web 框架都是基于 Actor 的。
所以我正在寻找使用 Actors 显式构建的 Web 框架以支持大量请求我对 Scala 非常陌生,如果几乎所有 Scala 框架都基于Java servlet 在每个请求上创建一个线程,这将耗尽我场景中的所有资源。
【问题讨论】:
这是一个老问题,但你应该看看 Play 2.0,它将在 netty 上运行并使用 akka。 【参考方案1】:http://liftweb.net/确实,一个请求以 servlet 开始,但随后 lift 使用许多 servlet 容器中的彗星支持来脱离线程,保留请求上下文(容器不会破坏),然后可用于在actors中输出数据。
http://akkasource.org 也支持休息,但它会阻塞线程,直到演员完成其工作
【讨论】:
Scala 有什么更轻的提升吗?我喜欢 Sinatra(或 ExpressJS),我很高兴知道 Sinatra 的端口(Scalatra)也适用于 Scala,但似乎它不使用 Actors 好吧,如前所述,Akka 有 REST 和 Actors。通过集成大气库,它具有正在进行的彗星支持。对于我的用例,气氛不好(我所能想到的只是如何使用它进行类似聊天的服务,而不是“开始”->“生成演员”->“完成”循环) Akka 正在开发一个代号为 akka-mist 的 Comet 模块,它可能会满足您的需求 -> 接受传入请求,将其分派给参与者,让参与者异步完成请求。【参考方案2】:另一个选项是Play framework。最新的 1.1 版本支持 Scala。它还支持 akka 作为一个模块。
【讨论】:
相信Play的新2.0会通过akka有actor支持,会使用netty。【参考方案3】:如果您真的要一次有 10k+ 长的活动连接,那么任何标准的 Java 应用程序服务器/框架(可能,除了 Netty)都不会为您工作 - 它们都消耗大量内存(即使使用了任何类型的智能 NIO)。您最好坚持使用基于集群事件循环的解决方案(例如您已经尝试过的 node.js)、使用 zeroMQ 支持的 mongrel、使用 Scala Actors 轮询的写入 MQ 模式的 nginx 等。
在 Scala/Java 框架中,Lift 对 REST 有很好的异步支持(尽管它不直接与参与者绑定)。 OTOH,LinkedIn 在 Signal 背后使用 Scalatra + stdlib 演员作为他们的 REST 服务,感觉还不错。
【讨论】:
谢谢,连接不会很长,但它们会很容易达到 10k 左右。我试图了解 Lift 的工作原理,但我不喜欢他们在其他地方开会的想法。 Sinatra/ExpressJS/Scalatra 对我来说是更可取的解决方案,因为它们很简单。您提到 LinkedIn 如何使用 Scalatra - 但他们说“Scalatra 不使用任何演员”,这很遗憾。 1. Lift CometActors 和异步 REST 与会话无关(两者都倾向于无状态)。 2. Scalatra 不像 Lift 那样使用 Actor(例如 CometActor)这一事实并不能阻止任何人将 Actor 与 + 结合使用,据我所知,Scalatra 开发人员现在正在致力于 COMET 支持 感谢您解释 Lift 的工作原理。关于 Scalatra 和演员 - Scalatra 会在重负载下死掉,因为它将为每个请求创建新线程,因为它的默认实现扩展了标准 java 类(似乎 github.com 在世界的这个地区没有响应,所以我可以看看什么类Scalatra 完全扩展)?ScalatraServlet
扩展了标准 HttpServlet
,因此,粗略地,处理 10k 连接将消耗 ~2gb RAM。如果内存对您来说是个问题,而您想坚持 Java 生态系统,您至少现在应该忘记与演员的紧密集成(并选择Netty
、Mina
或更高级的Atmosphere
)。
你可能会觉得这很有趣:jboss.org/netty/performance/20090607-asalihefendic.html【参考方案4】:
就 Scalatra 本身而言,他们一直在处理新的请求 称为 SSGI 的抽象(类似于 Servlet/Rack/WSGI/WAI 层), 他们说应该使他们能够摆脱仅仅作为一个 Servlet 也运行在用 Netty 构建的东西之上。见线程here。 http://github.com/scalatra/ssgi
还有其他一些在 Scalatra 简单级别上有趣的框架,因为它从头开始设计以支持异步 Web 服务(不会为每个请求占用一个线程):
https://github.com/jdegoes/blueeyes - 不是 servlet;建立在 Netty 上。 (“灵感来自... Scalatra”)
http://spray.cc/ - 建立在 Akka 演员、Akka Mist 之上。 Servlet 3.0 或 Jetty 延续 (“spray 深受 BlueEyes 和 Scalatra 的启发。”)
在较低级别: https://github.com/rschildmeijer/loft - “基于连续的非阻塞、异步、单线程 Web 服务器。” 没有准备好生产,但看起来很有趣。继续需要编译器插件。
【讨论】:
以上是关于Scala 都有哪些基于 actor 的 Web 框架?的主要内容,如果未能解决你的问题,请参考以下文章