Ruby 的流行引领了 Ruby on Rails、Merb 和 Camping 等一批 Web 框架的诞生。最近一个新的 Web 框架 Waves 正式发布,它的一些特性吸引了 Ruby 开发者们去试上一试。
Waves 同 Ruby on Rails 一样是一个 MVC 框架,采用了被称为 Request Lambdas 的技术,即由规则和代码块来组成映射。当一个规则匹配了一个请求时,相应的代码块就会运行。这只是 Waves 独有的特性之一。
Waves 其他迷人的特性包括:
- 真实代码重载
- 热补丁
- 集群支持
- 线程安全
InfoQ 有幸和 Waves 的创始人 Dan Yoder 一起聊聊这个框架。
Robert Bazinet (RB): Waves 究竟是什么呢?
Dan Yoder (DY): Waves 是基于 MIT 证书发布的下一代 Web 应用框架。基本上说,它实现了 Rails 所没有做到的,这也是让它成为“下一代”的原因。这其中的一些很基 本,包括线程安全和更节省资源等等。有些特性利用 JITR(Just In Time Resources)这样的技术来将 DRY 带到了一个更高的层次,可以让你很轻松的实现跨应用的 MVC 代码重用,甚至重用整个应用(因为应用被封装在模块 之中)。Waves 更加开发,也更加易于扩展。例如,你可以很容易编写自己的视图类来改变视图选择和渲染的方法,或者为模型换用另一个数据库平台(默认的 Ruby 的 Sequel)。它的基本思路和 Rails 相同——用 Ruby 实现 MVC 的 Web 应用,但是它建立在我数年使用 Rails 的经验之上,这让我可 以创造出一个更加强大的框架。
RB: 你为什么要创建它?
DY: 简而言之,是 Camping。
说的再详细一些,主要是因为我在编写 Rails 应用的时候遇到了一些很难逾越的限制。Waves 实际上一开始只是一个扩展插件集合。然后,我都不知 道什么时候我才能够发布它们,因为实际上我发现我就是在 Rails 之上重新构建一个新的框架。比起普通的插件来说,它更加现代化。我同时也发现我在 Rails 代码上的修修补补,本质上是改变了框架预期的行为,所以这样就没必要再和其他的 Rails 部分搞在一起了。一个很明显的例子就是我最初实现的 Just In Time Resources:ActiveDependency 重写(override)了对象和模块中的 const_missing 方法来处理代码重载。我想要 修改这个行为,于是我不得不再重写 Rails 的做法。我并不喜欢这个解决方案,因为我完全可以不需要去碰对象或者模块,但是由于 Rails 这样做了我也只 能这样做。
直到有一天我发现了 Camping。原因我不记得了,我只记得我对其代码的简明大为惊奇。有一种醍醐灌顶的感觉,如果只是简单的创造一个新的框架, 有我要的那些特性,而不需要再围着 Rails 转。这是一个艰难的决定,因为我的原计划是为 Rails 编写插件,这比起写一个框架要容易多了。而且,我需要 重写很多代码。这让人很痛苦。但是最终我认为代码会变得更精益、更易于扩展和使用。来自 DuckTyped.com 的 Ben 向我推荐了 Rack,我当时正在锤炼代码,于是就采纳了。与此同时,DataMapper 和 Sequel 也逐渐成熟, 这些都可以让制作一个全特性的、能够完全专注于 Web 应用的 MVC 部分的框架成为可能。
RB: Waves 框架已经开发了多长时间?
DY: 我在 07 年的八月才开始开发 Waves。第一个 beta 发布版是在今年 2 月初。所以这是一个非常年轻的框架,一切才刚刚开始。我是个老学究:beta 对我来说就是“还不能实际投入应用”。
RB: 对于开发者来说,怎样才能更好地去尝试通过 Waves 来开发应用?
DY: 有个教学视频可能是最好的起点,你可以跟着这样一个指导来发挥你的想象力。当然 RDocs 也是一个好途径。也有一个支持论坛,我会尽量在几个小时、最多一 天以内回答任何问题。综上来说,你可以从教程开始玩转 Waves,关注 RDocs 和论坛,如果你有了麻烦可以去论坛问问题。
RB: Waves 和 Rails 一样是一个 MVC 框架,和 Rails 相比 Waves 有什么不同呢?
DY: 非常多的不同。正如我说的,它是“下一代”的,是 Rails 的进化版。它线程安全,而且更节省资源。它更关注与重用,包括应用程序和它们之间的:JITR 或者通过模块封装的应用等等。路由的等价是 Request Lambdas,是非常强大的,可以为 MVC 添彩不少。它们可以允许你在一个地方加固所有的控制器的安全性。模型可以绑定任何你想要的 ORM 框架,但是如 果你不需要的话,你也不比为非要使用一个而付出内存和性能的开销。例如,我有一个基于 Waves 的 CMS,采用的是文件存储,那就不需要 ORM。 Waves 拥有顶级试图,和 Waves 中的控制器基本上没有耦合。拿布局来说,是制定在试图本身内而不是在控制器中的。类似的,你可以在试图中绑定布局或 引入控制器方法。另一个很关键的不同是 Waves 支持真实代码重载。这就是说,代码可以在重载前自动卸载,这样上次加载的产出就不会留下来。这样的好处不 光是可以让 debug 更加容易,还可以使你可以通过 LiveConsole 对产品代码做热补丁。这是一个很好的例子来说明不同点。它确实是 Ruby 下的一 次 MVC 革新。
RB: 是那么类型的站点是基于 Waves 的?
DY: 我有一个已经发布的 CMS 为很多站点提供了支持,当然也包括 Ruby Waves 的站点 RubyWaves.com 本身。还有一个我通过 Waves 实现的主题建设的应用程序。它们最初都是运行在 Rails 上的,现在它们都运 行在 Waves 上。它们的内存占用只是以前的三分之一到四分之一,而且代码比起 Rails 来也更少了。它们稳定的运行了数周。对此我颇受鼓舞。我希望从别 人那里再看到一些数据相关的应用。希望可以很快很到。
RB: Waves 是开源的吗?如果是的话,开发者们如何参与?
DY: Waves 是基于 MIT 证书的,可以自由的得到。我也非常希望有核心参与者加入来帮助 Waves 前进。想要参与进来的第一步就是在支持论坛中找到我并让我 知道你希望做哪类工作。目前非常欢迎参与进来。目前有成堆的事情要做,而且我不认为 Waves 或者任何其他重要的框架是可以离开社区的开发还能取得成功 的。Waves 已经站在了 Rack、Sequel 和 Markaby 的肩头,从中取得了巨大的收益。很多工作已经被这些优秀的开源产品所简化了。这使得 Waves 可以非常非常专注于提供 MVC 接合。但是依然能有很多机会可以让它更好。
RB: Waves 是线程安全的,你可以解释一下吗?
DY: Waves 支持每请求一个线程的模型,在处理请求的时候引入信号量来做到不同的线程之间不会影响对方。因为 Waves 支持集群,并使用了 Rack。这并不 是被支持的唯一一个模型,但是我认为它很重要,给了开发者选择的机会,特别是当 Ruby 1.9 将会支持原生操作系统线程以后。目前,在 Ruby 社区中线程还不是很火,但是一旦原生线程支持了以后,我断定它们会因为运行更快而迎来回归。收益是 你可以通过增加你的应用运行的实例来提高性能,特别是在那些带有并行架构的、对线程支持良好的机器上。而 Waves 可以让这些变得简单。
RB: 鉴于 Ruby 1.9 已经支持“原生”线程,你是如何看待和 Ruby 1.9 一起工作的?
DY: 我很清楚目前 Waves 不支持 1.9。然而,这是 Waves 前进的一个主要的目标。并不只是因为 1.9 拥有太多迷人的特性可以让 Waves 享用,显然还因 为线程安全可以让 Waves 在 1.9 上做到性能的飞跃。这是我并不过分担心性能的原因之一,然而例如 Merb 社区就会。另外下一个发布版你将会可以让 Waves 精简运行以获得更好的性能。但是我认为当我们转向 1.9 将会越来越有趣。
RB: 你对 JRuby 支持的态度是什么?Waves 使用的 Sequel 并非 100% 支持 JRuby 吧?
DY: 这可能在路线图上排在 1.9 支持以后,但是我愿意接受建议。我要指出的是 Waves 并不支持 Sequel,它只是新应用的默 认而已。但是现在我相比性能来更注重的是特性,所以 JRuby 优先级并不高。我很喜欢 Sequel 中的特性,这个例子真不错。希望在 Waves 的关键库迁 移到 1.9 以后 JRuby 会排上日程。再重复一遍,Ruby 社区的反馈会改变这些,尤其是有人愿意贡献。(暗示,暗示!)
RB: 能说说一些你对 Waves 计划的细节吗?
DY: 好的。首先,我已经从社区中获得了很多建议,包括增加对 Tenjin、Haml 和 Sass 模板库的支持以及一个轻量级 Web 服务器,这些很快就会实现。另 外,还有一个对集群支持的 bug 修复。我还计划添加目前缺乏的对数据库后端会话的支持,还有增强 Request Lambdas 等等。
对于 Waves 需要做出很大努力在增强模式(Schema)反射能力上。目前这还是 Sequel 和 DataMapper 的弱点。我希望 Waves 可以拥有一些 ORM 独立模式的概念,因为我认为反射是扩展 JIT 到试图的关键。
我需要指出的是什么才是测试的默认方法。我使用过很多方法而且很喜欢 RSpec,但是我犹豫该不该将它加入默认 Waves 应用之中,因为在 Ruby 社区中目前关于测试有太多其他的选择。对 Sequel 的选择决定就简单多了,因为它支持迁移和 Ruby 表达式作为查询,我认为都是很酷的特性。但是我没有 信心把 RSpec 作为默认,所以在这个问题上也欢迎社区的反馈。
我也开始做性能方面的工作,最初做了些基准测试和性能测试来看看问题出在哪里。真的,这里有很多很多有趣的事情去做。我认为 Waves 已经很酷了,但是那些酷的部分恰恰有很多可做之处。这还只是冰山的一角而已。我维护着一个路线图的单元列表,目前还只是初期阶段,地址在 http://rubywaves.com/roadmap ,如果感兴趣的话可以在这里得到更多的细节。
RB: Dan,感谢你抽出时间和我们聊 Waves。
Waves 官方站点有一个创建blog 的多章节教程。我曾经试图安装Waves 并跟随教程来做,它就和所说的那样工作良好并创建了一个相当不错的应用。还有一个跟随教程的视频教学。其他关于Waves 的信息可以在 Waves 的站点上找到。
评论