JavaEye 站长谈Ruby on Rails 项目实践------- 摘自:infoQ
但是在这个过程当中,我其实最早考虑是用Java开发,因为PHP的话,我之前,在00年、01年的时候,也做过大概有将近两年的开发,那PHP的话,就是当整个网站规模很大,也就你的那个网站代码量很大的时候,那管理起来相当困难。而且PHPBB的话,就是PHP的话,它本身它的这个面向对象的机制、运行效率也不是特别高,那么所以后来我,后来的时候,我一直考虑用Java去做,像我学习Java的话也是从2000年,差不多从2000年开始做得,一直到06年,也做了很多年。那么我在06年就开发,06年准备在开发JavaEye新的版本网站的时候,考虑到如果用Java开发的话,它的整个开发成本会很高,当初我预计的话,如果用Java运作的话,可能大概要,乐观的估计的话,可能要三个月到五个月才能开发完,所以当时感觉到开发量很大。这也是之所以迟迟没有开发的原因。
那么大概在06年的三四月份,那个时候Ruby on Rails在国内已经起来了,在起来以后那个时候我已经在开始在用Ruby on Rails了,那么看了一段时间以后,我自己的评估呢,它是能够比Java的开发效率高很多,当时的一个传言说就是快十倍了,然后当时那我想就用Ruby on Rails做好了,那后来我们实际上只用了一个多月就开发出来了,确实应该说效率不错。如果用Java的话,它就面临着整个应用系统重启的时候啊,它中间至少要中断,比如说要三四秒或一分钟这样的一个中断过程,这个其实对于互联网网站是很难忍受的,所以你要像Ruby on Rails那样,反正你重新发布一下,重启一下,一两秒整个网站就可以完全更新了。
然后我们现在Web服务器跟数据服务器其实CPU都还空闲的,就是其实都是很低廉的硬件了,两台都是两路AMD的PC Sever,两台机器加起来,我当时总共购买价值才两万八。两台机器总共花了两万八千块钱购买过来,我们现在两台机器可以每天支撑50万到80万的动态系统,而CPU的空闲率差不多50%到60%,所以从我目前这种情况来估计啊,我们的网站就是现在这种程序情况来看,每天可以支撑100万以上的动态请求是没有问题的。所以我想从我们目前这么廉价,你像总共价格不到三万块钱的硬件,那你跑Ruby on Rails,每天Pageviev可以支撑到100万。我觉得应该说已经是,不能说特别优秀吧,起码就是说可以达到你要求,在性能上不会让你觉得无法接受。
那我想其实是这样的啊,先从我们自身网站上来说,我自己应该还算一个比较资深的在Unix方面的网管吧,应该也做了很多年,所以像我自己部署JavaEye的整个平台呢,我还是从性能方面考虑,还有从灵活性方面考虑。所有相关的,整个包括Ruby在内,那包括Ruby上所有的一些的库,还包括一些所有的插件基本上全都是我自己手工安装,我自己手工配置的,那我要达到的一个最大的可定制性,以及最高的性能。但是我想,我这种部署方式也不是说放之四海而皆准的,一般来说呢,现在也有一些包括一些Package,比如说像Thoughtworks公司,它们发布的像Rubyworks这样一个Package。我们也基本上是按照它的指导,按照它的整个的概念的说明,一步一步可以完成,经过一个性能相当不错的环境把它搭建起来,我想这也是一个方案。
那我随便举个例子,比如说,你要想把一个方法注入到你当前的类里面,你就有很多办法,你可以用Module,或者你可以用Class,你可动态地加载进来。Ruby有很多很多种方法,那么你这不同的人,你在处理同一个问题的时候,你写这段代码,你采用什么方式,那么每一个人它都会采用自己的方式,从代码风格上比较难统一。那带来一个问题就是,你写的代码,其实我大概也能看得懂,但是呢你为什么要这么做,我可能我也不是特别理解,我不太会理解你为什么要,这个代码你为什么要那么去写,它可能就是需要经常的面对面的沟通,我才能够明白,我想这是第一个问题,就是本身由Ruby语言带来的这样一个,在团队协作上,带来比较大的一个问题。
那我们面临第二个问题,我想主要还是跟我刚才说的还有关联,我们主要的开发平台还是在Windows上开发的,毕竟你要在Windows下,在IE浏览器上还要测试,还包括考虑到就是我们通过我们后台监测系统呀,通过Google Analytics监测的话,我们整个网站的访问者98%是使用Windows的,那么,那这种情况下的话,比如说你调用CSS了,你使用什么样的字体,对吧?所以这些考虑就必须使的在Windows下开发的,才能够保证你开发出来的网站浏览者看的时候应该基本是一致的。那么你在Windows下做开发,然后你在,我们是在SUSE Linux上去做部署,那么在这里,其实中间会有一些差异,包括有一些依赖于本地化库的,一些第三方的类库,比如说Magic,它就是可能会在Windows下,在Linux下,它有不同的表现,还包括也就是说你的文件存储路径啦,诸如此类的,整个操作系统之间的差异,会给你带来一些困扰。那我想这是两个问题,这个问题只要你有足够的经验还是能够克服的。
要说第三个问题,我觉得就是Ruby,它其实有很多第三方的插件,但是插件呢质量参差不齐,而且没有一个特别统一的管理。那我们说Ruby它其实有一个网站叫Rubyforge,它可以把一些第三方的类库都放在上面。你要搜索什么也好,安装什么也好,其实你都可以到统一的到这样一个代码集散地,你去获取,但是像Rails第三方插件,它不是这样的,目前没有一个。怎么说呢,没有一个这种就是专门有一个网站来搜集和索引所有第三方插件,插件就是散落在各个的作者自己的博客的地方或者,反正就散落在各个角落里面,所以你要去找插件的话,那你要搜的话,其实你也要自己去慢慢搜,而且搜出来的话,它没有一个官方的评价,你也不知道它好还是不好,然后自己去用。
用的话呢,从我们现在来看,大部分插件拿过来用,我们或多或少都会有一些自己修改,总会有一些Bug的,那么这个Bug的问题,其实更多的也跟就是我们中文的这种Rails的开源的Contributor不够有关,所以很多一些西欧的或者是美国的Contributor它本身,它背景呢就是那种Contributor背景国家嘛,所以它做开发的时候未必会考虑到我这种中文的这种多字节处理应该是个什么样子的。像这种情况中文的在Ruby社区,Rails社区Contributor不够吗,所以我们经常会碰到这样一种问题,但是你也没办法得自己来改。但是呢我觉得这些所有的用来描述这种专用的,用来描述特定领域的,这样的所谓的DSL领域呢,我感觉基本上分成两类,一类就是现在Java和主流企业运用,它比较倾向的一种方式,就是我用XML语言来描述,那包括像现在的在SOA里面描述一个业务,其实都这样用的,但是呢,就是这种描述语言呢,它基于一个基础,就是说不是程序运用这种描述语言,这是用某种工具可视化的工作。但另外一种流派呢,就是另外一种方向,就是用脚本语言运用非常灵活的,描述能力很强,非常切近与这种英文的,怎么说呢,英文的这种自然语法的,就是脚本语言去描述。像这个呢,其实就是Ruby。
应该说这两种方向在Ruby做描述DSL这个领域相当的,我觉得是相当有前途的,包括Rails,其实就是Ruby DSL的它的一个应用,还比如说,这个构建工具Rake,就相当于一个Java里ANT这样的一个工具,它也是这样的,这个包括Rails包括Rake,还包括就是我看过的在日本它有一些游戏,它用的一种脚本叫RGSS,就是描述我这个在游戏里地图怎么绘制,然后东西怎么移动,规则是什么样的。就是所有的这些东西,它都是类似于一种英文的语法的方式去描述的,就是我应该做什么什么,还包括现在,我们现在那个在这个JavaEye 3.0开发里边,用的一种描述需求的方式,用RSPEC,这个RSPEC呢就是说什么呢?所谓SPEC呢,就是需求、需求规则嘛,就是你用Ruby语言来描述,我要实现一个什么样的功能,它应该具备什么什么,像这些东西,其实本身就是可以运行的Ruby代码,所以我觉得用Ruby做DSL,应该说是方兴未艾吧。第二个呢,就是现在Sun呢,在它自己的整个开发工具NetBeans上,也专门的有这种开发人员,就是在NetBeans开发针对Ruby和Ruby on Rails这样的一个开发环境,那么像现在在那个NetBeans上你要如果说,Ruby on Rails应用的话,已经非常强大,差不多相当于我们平常在Java上运行Eclipse,很多功能都有,包括类型的推断,自动的补齐了,很多很多,基本上都齐全。那么我想Sun公司它其实,我也看过一些访谈啊,基本上Sun的一种看法它还在JVM上还可以是很开放的态度,就希望JVM成为一个平台,一个通用的。怎么说呢,一个通用的运行应用程序代码的一个平台,不管Java也好,还是Ruby也好,还是Python也好,在这里顺便说一下,让Java平台的那个Python语言,原来2.1已经停止好几年了,但是最近它整个开发突然又活跃起来了,最近2.2版本发布了。结果我想我对在Java平台上的这种动态语言的发展还是,应该说还是非常乐观的,在JVM平台上,这几种动态语言从目前来看的话,我觉得JRuby的前景是最看好的,主要原因本身Ruby社区发展的蓬勃,然后再加上Sun在JRuby上面投入的资源非常多,还有些其它的,像Groovy啊,还有Python啊,我觉得相对来说没有Ruby发展的好。
所以我们通过,我简单说JRuby和XRuby这样两个项目来看,其实它代表一种趋势,什么趋势呢?就是Java开发者,他逐渐的呢,他对Ruby感兴趣了,包括像微软.NET平台它也是一样的,他也一定是在微软平台上很多微软程序员,他会觉得Ruby这种东西是种很优秀的语言,对他的工作也好,对他的工作有很大的帮助,所以他希望能够我在微软平台上来使用Ruby,所以纵观这种情况,我觉得应该是一个很好的现象,当然从这种这么多的解析器、虚拟机来看,目前来说,还没有什么分裂,至少我没看到有什么分裂的现象。应该说,我应该所有的这些虚拟机呀解析器啊,还都是像CRuby标准这种规格相兼容。
那我认为也只可能出现两种情况,一种情况就是,程序员就觉得我的项目纯粹就用Ruby写,只是把它放在Java平台上跑,那这是一种可能性,但这种可能性,它其实不是一种深层次的应用,只不过就是只说我运行平台从操作系统层面更直接,或者说CRuby转到这个JRuby而已。那更多的一种融合,它其实体现在不同的语言上,它各取所需,就是采用自己更适合的方式,我们说,打个比方吧,就是在Java平台上,以后也许啊,做一个企业应用项目还是以Java为主,就是你主要还是用Java去做的,还是用Java的组件,但是某一些,其中的某一些部分,也可能比较适合用Ruby去做,像这种情况呢,我觉得最可能出现。
比如说,我们做一个电子政务里边一个系统,或者说做一个银行的KS系统,那比如说我们做电子政务,它涉及到工作流了,涉及到工作流的话,我们现在在Java里面,我们都是用XML来描述这个工作流,这个文件很难维护的,没有特殊的工具来维护,但也许以后我们会有一种比较好的Ruby库,很方便的,我甚至可以让我们的业务人员一条一条的把他的工作流给它写下来,而Ruby的规则呀,它本身就有可运行的,工作流并不明显,这个就很有意义。它比如像一些医院的排班系统,它有很多很复杂的规则在里面,就是规则引擎,规则引擎的话像现在,你要是说如果纯粹用Java去写,那不可能了,那太复杂了,所以现在那个JBoss有个Drools的,也是一个叫JBoss Rules,它也是一个规则引擎,不过它的语法也是自己的定义的,它其实也是相当于一个很小的桌面应用,那我们以后也可以想象一下,我们如果用Ruby DSL,我们写规则也许是跟需求人员一起写,一条一条写,本身这个就是可以运行的,所以在对企业应用这个角度来说,我到是觉得Ruby DSL会是特别有前途的一个方法。还比如说,我如果是调度的话,我也是用其它的方法。其实它的做法就是,我隔离跟操作系统之间的关系,抹平操作系统的差异,所有的功能都是在Java虚拟机上来完成的,但Ruby现在这种情况来说呢,就是如果你考虑到操作系统了,很多东西可以在操作系统级别很简单地来完成。现在比如说,如果你如果要用Linux操作系统,本身操作系统自己就,Linux自己就相信,而Ruby它本身因为现在有CRuby,它跟操作之间的这种互调用比Java来说要简单很多,要方便很多。所以只要把操作系统这个层面来考虑进来,还包括Java调度,你可以直接用操作系统这种任务调度机制,所以其实我觉得,在企业应用方面,如果考虑到操作系统,把它整合进来这个应该不是个问题。
所以现在很多Java厂商它在强调,在用大内存支持上,不要把那个JVM的内存开的太大,开两个G就行了,然后在同一台机器上你要跑好几个JVM,然后那个做Cluster。所以你要其实说进程问题,其实Java现在也面临这个问题,那我们反过再来看Ruby,Ruby它每个进程,它自己的,怎么说呢,因为是解析器,它性能比较低,而JC也很严谨,但是它的做法就是说我一个Ruby解析器不够,我跑多个可以吧,一个不够我跑10个,10个不够,我跑20个,20个不够,我跑100个,那所以Ruby现在这种情况,跑多个进程,每个进程它其实是单线程,但是这种方式的话,它相对Java来说有个好处,就是说当我需要在Cluster上扩展的话,它是属于一种无状态的架构,从这种横向扩展比较好做。
然后呢,第二个方面在企业应用。,因为Ruby它这种编码的风格是在这种大规模团队开发上还是遇到一些问题,就是你怎么样未来用一些更好的软件方法来指导它,这个目前好像没有这种更适合Ruby的软件方法学出来。所以我想在企业应用开发这一块,目前来说不会成为一个主流,至少五年之内,我想不会成为主流吧。但是呢,就是Ruby的DSL,就是成为企业应用的里面的一些粘合剂,这个我到非常非常看好,我想这个就是基本上,从市场前景上来分析。
然后另外呢,我觉得从国内的情况来说的话,有一个趋势特别值得注意,这个也是我们Java网站本身也是做招聘,就是帮企业来寻找人才,有一个趋势特别值得关注,是什么样的趋势呢?就是有越来越多的欧美的外包,它们要求国内用Ruby on Rails开发,它在国内寻找就是Ruby on Rails这方面的公司和团队。那么你要说Ruby语言本身,它自己自身需要哪些方面的改进呢,我觉得这个问题相对来说还比较……,我也不是特别在行啊,我只能说就基于我自己很浅显的一些看法。Ruby其实现在目前来说呢,还是有一些在语法上,稍微有一些小的缺陷,比如说在Ruby的那个Block的内部变量,其实相当于,如果跟那个Block外部的那个全局变量重名的话,它其实是没有办法隔离的。所以这个现在就,我们写Ruby程序它就是,就有这样一个准备,Block变量的名字,你不要跟外面的变量重名,所以像这个这方面是有一些语法上一些小的缺陷,那诸如此类,还有很多很多这种小的语法缺陷,那么我想这些语法缺陷还有待于以后的弥补。那这个的话,像我知道的啊,在Ruby下一个版本当中,这个Ruby的作者Matz它在里面也添加了很多很多新的尝试,让Ruby的语言更加动态,更加灵活。出处: http://www.cnblogs.com/todototry/
关注语言: python、javascript(node.js)、objective-C、java、R、C++
兴趣点: 互联网、大数据技术、大数据IO瓶颈、col-oriented DB、Key-Value DB、数据挖掘、模式识别、deep learning、开发与成本管理
产品:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。