BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Sails 0.8.9:深受Rails启发的实时Node MVC框架

| 作者 Tim Heckel 关注 0 他的粉丝 ,译者 赵震一 关注 0 他的粉丝 发布于 2013年6月9日. 估计阅读时间: 12 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

Sails是一个构建于Node.js之上的实时MVC框架。得克萨斯州奥斯汀的Balderdash团队在4月9日发布了Sails 0.8.9版。Balderdash团队长期并持续地致力于为现代web应用打造类Rails的开发平台。

Rails诞生已逾8年之际,Balderdash团队将基于MIT许可的Sails框架展望为向前进化过程中的重要一步:它汇集了Rails传承的在实时web新型能力方面丰富的开发者经验。

InfoQ联系到了Sails框架的作者 Mike McNeil,并对这个发展势头迅猛的框架进行了更深入地剖析。

INFOQ: Sails.js相比于其他的Node.js实时框架有何不同?(MeteorDerbySocketStream)

Mike: Sails.js从一开始就是为让我们的企业和初级用户能够更有效地创建强大、稳定的Node.js应用而生的。总的来说,我们采用了那些大伙曾经使用过并且值得大家信赖的工具,并以可复用的方式提炼出最佳实践。举个实际的例子,我们重度地依赖两个由LearnBoost公司成员开发的框架:Socket.io 用于服务器推送,而Express 则用于我们的web路由和模板。Express是最流行的Node.js框架(至少13,000%的流行,但是谁又在乎这些呢?)。我们在处理每件事的时候都避免重复发明轮子。

但这并不是说我们没有推动我们自己的组件发展——我已经完成了一个ORM组件的构建,这可能是Sails源代码中最大的一个组成部分,并且也拥有最多的测试代码。我们在WebSocket代码的处理上采用了截然不同的方式:在处理实时消息传递的时候我们并没有选择维护独立的代码基础,你可以使用同样的代码来处理你的常规API。这意味着,不论你的应用需要针对WebSocket还是HTTP进行构建,项目中都将充满你习以为常的良好的ole Express代码。

直到我开始Balderdash团队的项目,我才发现这个决定是多么的重要。我们能够在不到一个月的时间内构建一个旨在支持超过300,000用户的、 API驱动的、实时的后端。它借鉴了Box.net API,但是同样可以实现将所有的文件更新进行实时广播。

INFOQ: 鉴于Meteor目前在该领域风头正盛,你能特别针对它和Sails之间的异同做一些介绍吗?

Mike: 首先,我们可没有1200万美元(译者注:应用开发框架开发商Meteor宣布在A轮融资中获得了来自Andreessen Horowitz领衔投资的1120万美元)。但是说真的,我们解决的是不同的问题:Meteor专注于创建一个完全新型的实时web应用框架。而Sails.js则是一个通过使用开发者们耳熟能详的MVC范例,为各种类型的应用创建实时API的专注于解决方案的工具。

早在我们洽谈第一笔企业生意的时候,我就意识到要创造一个全栈框架(full stack framework)是非常艰巨的,更不用说市场上已经存在像Meteor这样被大众所接受的框架。Node.js是一种被证明了的技术,但是很难说服客户能够做出改变来实施全栈的Node.js,更不用说尝试着让他们在前端采用新的web框架。

最终,人们都会基于当前工作所属项目中的需求来选择适合他们的框架——毕竟,这是开源的。

INFOQ: Sails.js是如何处理负载均衡及其规模伸缩的?

Mike: 无论你的部署位于企业防火墙内的数据中心,还是处于虚拟化的环境,又或者是直接工作于像Joyent这样的云供应商,甚至是托管在 ModulusNodejitsu这些PaaS上,Sails的部署策略与其他类型的Node.js应用的方式是一样的。我知道有一些开发者,他们在网络交流中对Nodejitsu针对Sails应用的安装支持赞不绝口,这可能是一种非常好的方式。你会希望遵守那些相同的标准并继续遵守在Express或Socket.io应用中被测试过的那些最佳实践。我们固有地支持将Redis作为会话以及发布订阅或套接字的存储。这意味着你将可以根据你的需要创建多个Sails服务器的副本,而一切将可以继续正常工作。

Sails让你可以更容易地将会话和套接字存储到Redis之中。至于你的数据模型,你会希望相应地对数据库进行伸缩。你将可以复用在任何其他应用中你曾经面临过的伸缩性考虑。

INFOQ: angular.js 或ember.js 以及其他客户端企业框架有没有打算与Sails.js进行更好的协作?又或者Sails.js会不会强制应用采用自己的结构?Sails.js有没有打算与移动设备协同工作?

Mike: Sails背后的基本设计哲学之一就是设备不可知论( device agnosticism)。我们不想去预测或约束你如何构建你的前端。这意味着无论是向一个浏览器、还是向一个原生移动应用或是向一个腕表甚至是冰箱,我们都希望可以足够灵活地按你需要的方式来传递数据。

这是一种被普遍接受的方法,特别是在企业中,你可能会听到它被称为SOA(或者是面向服务架构)。大多数的公司都热衷于构建SOA。这是为什么呢?嗯,让我们这么说吧——访问互联网的设备的种类数量在以后只会有增无减。

Sails对于在如何构建你的前端方面给予了零控制,而与此不同的是它为你使用诸如编译 LESSCoffeeScript等提供了一些可选工具——如果你正在处理这些事情的话。我们在原生的PhoneGap应用和Chrome 扩展程序中使用Sails,其他的一些开发者正在使用Sails来为他们的BackboneEmberAngularExtJS、 原生iOS 和原生安卓应用提供强大的后端。我们有两个贡献者对Sails的使用有着更酷的方式:Dennis Bartlett 正在构建一个具有平视显示器(HUD)的自行车头盔,而Thom Simmons使用Sails为他的智能飞盘提供API服务。

INFOQ: “免费”在每个集合中使用JSON api能带来什么优势?

Mike: Sails blueprint是我们最初为原型设计添加的一项功能,但事实上这一功能最终在生产中为我们增添了丰富的价值。如果你拥有了可测试、可搜索、可排序、可查询这样看上去如此性感的API,那么你为什么不使用它呢?你可以通过混合使用blueprint API来做一些真正有趣的事情,尤其是当你在更换模型适配器的时候。它能够很整洁的在一个LDAP数据库(LDAPAdapter)上创建可查询的API,或者不编写任何代码就可以对tweet消息(TwitterAdapter)进行搜索。

对于“编写你自己的模型适配器”来说,我们是极其友好的(你将会注意到Sails项目实际上伴生了一个适配器目录,该目录中打包了应用特定的适配器)。这样做的目标是尽可能多的在ORM中保持API集成——它催生了更加整洁、规范的代码,当你们的开发人数在不止一个人的情况下这是非常赞的。还有一个非常不错的优势就是你可以在你的API中使用来自适配器的真实数据。

INFOQ: Sails.js有“迁移(migrations)”的概念吗?

Mike: Sails支持将模型挂钩(hooking)到无模式数据库和“模式”数据库。很明显。当使用像 Mongo CouchBase这样的数据库时,并不真正需要迁移,但是针对更加结构化的数据模型,Sails将会发挥起它的作用。在每个适配器基础之上,你可以控制在服务器启动时发生的一切。

我并非Java的狂热者,但是我必须承认Hibernate的自动迁移是相当了不起的。如果你是一个Java开发者,你可能会认出这个迁移装置,这是我们对Hibernate和 Grails的 “dbCreate”这一了不起的概念的实现版本。我原本就是Grails 背景的程序员,所以这源自于我的灵感。当我审视Rails的时候,我对手动进行数据迁移的必要性感到非常吃惊。我可以理解在数据处理上的进行如此的设计,但是在处理模式方面却无法理解。不过我揣摩着如果你这样想就会觉得这是理所当然的——Rails是差不多10年前首次登上竞技舞台的,而这些年已经发生了如此翻天覆地的变化。

我们在这方面尝试了很多不同的概念。程序员并没有什么技术理由需要去关注在基于模式数据库中的迁移。我们拥有足够的信息来实时处理好这些事情。无论如何,目前已经具备便利的配置装置来提升开发过程中的效率,比如在服务器重启时删除掉数据库表格。我们倾听来自社区的声音,并且在如何提升效率而不增添非必要任务的进行迁移方面紧跟时代的步伐。

INFOQ: Sails.js的下一步会怎么走?你对该项目在明年的发展是如何看待的?

Mike: 总之,社区的的力量真的非常惊人,而我将会致力于确保Sails项目继续存在,并且是一个能为实际应用案例的真实使用提供支持的项目。在我发布首个屏幕录像的两天之后,Ted KulpCarlo de Celico就为Sails构建好了Mongo和 Redis 适配器。根据目前我们所看到的,如果继续发展下去,我认为我们将会看到更加大量的社区贡献,这些社区贡献将会主要围绕在增加不同的模型适配器和模板视图引擎这两个方面。

到目前为止,我们的功能都是由那些为了真正赚取美金的真实应用所驱动的,并且我也认为这种方式在短期内不会发生变化。举个例子,现在我们有一个需要将会话存储到CouchBase的客户端,所以我们就会增加将会话存储挂钩到任意的Sails适配器的能力。

我认为在Sails中仍然缺失的最大部分,并且不是由客户端需求直接驱动的功能是对模型中校验和关联的原生支持。比如像Express 和 Socket.io,你可以自行强制此类的约束,但是到目前为止,Sails还没有好的工具来实现。在今年的早些时候,我创建了anchor作为数据校验和键入工具来帮助你以一致的方式处理好数据校验。下一步就是将它集成进Sails,我们将会在这个春季和初夏进行这项工作。

再来点神秘感吧,我对增加更多的可选blueprint功能有一个全面的计划,但是现在还对大家保密。:)

英文原文链接:Sails 0.8.9: A Rails-Inspired Real-Time Node MVC Framework

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

sails and pomelo by chengchao xie

嗯,sails有些设计理念和pomelo有点象, 例如不与客户端绑定, 参考rails的COC理念。 不过本质上还是基于无状态web应用的MVC框架,灵活性、可伸缩性不如pomelo

个人对服务器端MVC无爱,更喜欢MVVM框架,可惜这方面只能自己打造 by wen bob

我已经放弃使用express那一套了,因为主要做实时性的东西,MVC远不如MVVM来得爽。现在没找到好用的框架,自己做的,node.js + socket.io + knockout.js

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

2 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT