Robbin 写的文章,标题就是《Ruby 社区应该去 Rails 化了》
本人新手,学了两天 ruby,rails 还没开始学,对这些还没什么概念,当然 Sinatra 也没学过。
想问问大家怎么看这个事情?
@OhCoder 我觉得,我们做出选择的原则是务实,如果你还没有,完整的或是良好的开发技巧,所谓的 Full-stack , 那么你最好学习一个框架,并学习透彻,这里我推荐 Rails,因为 Rails 的设计被很多人推崇,许多其它语种都衍生了类 Rails 的框架,向其借鉴与学习,Rails 在一定程度肯定是很成功的, 另一方面,像大牛们讨论的东西,其实与我们并不冲突,只是各有所需,他们需要的是另一方面的东西“运行率效”,这方面的的讨论 (省略一万字)...,在很大程度上 Rails 能满足你的需求,包括性能。
我赞同文章中绝大多数观点,只有 @robbin 的一个个人结论我不太赞同:Rails 过时了? 我认为 Rails 在其胜任的场景表现依然稳健,虽然提供的功能太过丰富而显得臃肿,但还不是轻易用 Sinatra 就能替换掉的。
我的理解是,我们应该把 Rails 更多的看成一个工具,而不是一个锤子。对于@robbin 说的 rails 过时了,应该是针对开发 web service 的场景下,可以有更好的选择。
#1 楼 @robbin 我赞同原文里所描述的种种事实,但我觉得没必要提什么“去 Rails 化”的说法,特别不应该在前面加一个“社区”。
我认为“社区”的意义分两个层面:第一,是让处于食物链高端的人们有一个交流、进取、突破、创新的场所。这一点应该是所有社区的终极目标之一,然而这一点针对的恰恰是少数人;第二,是让所有的初学者、入门者、感兴趣的人能够体会到社区的各种好处,比如资料丰富,帮助方式多,热情洋溢等等,这个在少数人看来有点浪费精力和时间,但是如果从整个社群来看,你今天为这群人的付出就像是在为这个社区造血。不为他们做点什么的话,将来有一天高端的那一群人将失去伙伴,越来越孤独,将不再有后来者你追我赶,兴兴向荣。
Rails 的性能从来都不是其骄傲的本钱,这一点好多人都说过,好多人都证明过,但你无法否认它对促进新手接触和学习 Ruby 所起到的决定性作用。不管多少言论和人群在说 Rails 的种种缺点,DHH 一个 15 分钟 Blog,就能让一大群初学者趋之若鹜,兴致昂扬。
为什么?因为两个层次的人目标不一致,追求不一致。当你走过这条路的时候,回过头来你会指出哪里走得不好,哪里走了弯路,或者当初选择哪个会更好。可问题是,你若没有走过,你今天能得出这种结论吗?Rails 提供的已然是走这条路的最佳方案(但不是最优方案,因为最优方案对于初学者往往意味着技术难度,理解能力等方面的门槛)。或许有朝一日,会出现一个性能甩出 Rails 一千条大街,又兼具 Rails 其他种种优点的框架,到那一天不用任何人说,Rails 自然会淡出舞台。
说到趋势,移动的确是趋势,Full stack 的框架过渡到 Web service 的框架也是趋势,然而社区的伟大之处就在其包容性,Ruby 社区从来没有分过 Mobile 化的,No-Full stack 化的,或是 Less-Rails 化的社区,无论什么趋势还是经典都可以有立足之地,容身之所,这不是很好吗?难道一定要为了走得更远的人迎合趋势,就要打出把过去的路变窄甚至封闭的旗号吗?
这不禁让我想起了曾经轰轰烈烈的 Web Standards 的争论,没人说过 WS 不对或者不好,也没人否认它是趋势,但任何人,哪怕是 W3C 这样的庞大组织也无法阻止用户或是其他开发者选择用什么浏览器或者工具。其实没必要这么做,如果你认为某样东西或者某种趋势是好的,你只需要正面宣传,大力推广,努力为其贡献产品和工具,自然就会有人跟随而上;反过来看,凡是举一个必要削一个的,即使本意没错,出发点很好,也会遭致很多人的反感和抵触,并非明智之举。
这篇原文,给 Ruby 社区的一部分人看是非常非常好的,很有启发意义和带头作用,可是对另外一部分(基数很大)却有可能费力而不讨好,我只能说文章是好文章,道理是好道理,可惜不能代表“社区”,或许换一种做法会更有效,比如像 DHH 等人那样做一个积极的推动者。原文后面介绍了其他几个 Ruby 的框架,Sinatra 还提供了一个模板,这就是很积极的举措,只可惜标题太冲了,我估计很多年轻人看了标题就准备开喷了,那些真正有干货的部分能不能坚持读完都让人存疑啊!
为了更方便开发者,Rails 的确是做足了功课,势必在速度上慢了很多。 说 Rails 过时是不科学的,因为 Rails 本身就适用与快速开发, 供创业公司或者团队迅速实现自己的功能,或许在数据庞大后会换用 node,Go 或者其他,但要论起步时,那 Rails 还是有很多优越性的。
赞同文中的不少观点,没有最好的技术,只有合适的技术,合适的技术不仅仅关于出现的地方,也跟时间有关;rails 亦然,同一个应用开始时候使用 rails 是个很好的选择,那么在需要的时候用更好的技术替换 rails 也是一个好的选择。
去 Rails 化个人也在一定程度上赞同,所谓去并不是抛弃不用,而是应该不惟 rails;不可否认 rails 成就了 ruby,但是这也使得很多人惟 rails 化了
Rails 作为一个 full-stack 的的框架,确实不适合做 Web Service,但也不能得出 Ruby 社区应该去 Rails 化了这个观点吧
ruby on rails作为一个full-stack的web开发框架,并不适合用来开发Linkedin和Iron.io的后台web服务,从某种意义上来说,属于rails的时代已经过去了
全栈式的 rails 不适合做 web 服务,并不一定代表 rails 的时代过去,顶多属于用错了地方,杀鸡用了牛刀
开发 web 站点,sinatra,goliath 框架太过简单,什么都需要自己去搭,padrino 还没有成熟的有代表性的大型网站,而 rails 久经考验,现成的解决方案和资料齐全,这些不太大众的框架应该还取代不了 rails 的位置
移动时代的发展趋势就是:未来服务器端会更多的使用Web Service而不是Website,这也意味着Rails将越来越不适合时代的发展,我个人的结论就是:rails过时了
这个结论应该是 website 不适合时代的发展,website 过时了,rails 只是开发 website 的一种解决方案,照这个理论,php 也该过时了,它在 web 开发时代占据主要地位
用 ruby 开发 web 服务用 rails 的确不是个好选择,只不过从这些论断中也没看出来 rails 过时的痕迹。不过 ruby 太多局限在 rails 的范畴,不希望最后成也萧何,败也萧何
基本的常识又重新说了一遍。我觉得文章里面的好东西就是给出了 ruby 下高并发的解决方案以及实际使用案例,这样在未来的项目选型的时候可以用来作为支撑材料。
#24 楼 @linjunhalida 欢迎都去 EC2 上现原型...
参考:http://eric.themoritzfamily.com/websocket-demo-results-v2.html
很同意 robbin 的观点,现在感觉开发应用都是往 web service 方向靠,移动设备需要访问,网页也大多都靠 ajax loading 了。一直担心 ruby 在这方便的性能问题,所以最近也去关注了 go,贫乏的类库做真实场景的应用开发真的太累了。非常感谢 robbin 在文章中提供的数据。
我觉得也应该转移部分注意力到其他方面了
比如 mruby 这边,日本推上天天看到他们放出来各种好玩的玩意。今天看到一个统计各地家用交流电频率的那么结合硬件的东东,感觉思维跟他们不在一个次元上了。。。
虽然这帖子不讨论领域模型问题,不过既然提到了,就大家探讨一下。领域模型的理解问题就是分久必合,合久必分的情况。在一段时间某一种会被认为比较正确的。最早大家 java 刚刚起来,一股脑的搞贫血模型,再堆上 N 个 xx 层。后来慢慢觉得这种做法又太烦了,就出了其他的模型。到了 rails 里刚开始流行 fat model, thin controller,于是乎写 rails 都往 model 里塞代码。又过了一阵子,觉得这样又不行了,model 越来越大,难以维护,于是乎又开始提炼,然后就出现了7 Patterns to Refactor Fat ActiveRecord Models这样的文章,这种情况就会反反复复的发生。
其实这些想多了也就那样,重要的是不被任何一种理论和传统束缚,不要过份设计,也不要过份重构,当然也不能把代码塞在一个地方,合理的组织代码,结构清晰,测试保证,其他的当作浮云吧。
去Rails化是说:不要不假思索的接受Rails给你的一切,不要默认Rails推荐的用法在任何场合都是最优解;而应该自己动手,根据实际应用场景挑选最合适的组件。
确实很有道理。
我是一贯主张改良而不是革命的,libv8 不必要的占运行时 20 兆内存,那就想办法去除它,有 gems 有内存泄露就想办法找到出来,之前我还发现过ruby-prof 和 railsexpress 补丁的相容性问题,发现问题就开 Issue,总还是可以一个个解决的。Rails 4 不也开始强调性能了么? 对于绝大多数人来说,随便抛弃成熟的 rails 而去使用小众的多的其他框架有点不明智,现在可以说是 web service 时代,说不定明年突然 HTML5 又火了呢?这年头变化快啊!
我倒觉得这种标题很好,能激发更多的人进来讨论。文章没得说的好,读完受益良多,昨晚看完就在想,该清理一下项目中的 middleware,这点以前都没有想过。
Rails 最要还是东西太多了,目前我参与的 Rails 项目跑起来就得要 100m 每个进程的内存占用,有时候一些比较慢的动作需要异步实现,就得上个 Resque 或 Sidekiq 什么的,有来一个进程 100m + ... 资源足够的时候倒是没多大问题,Rails 随便搞搞都能轻松应对大多数大流量的项目。但自己搞的时候就能明显体现出来,浪费内存就是浪费钱...
但是反过来有又一想,其实大多数访问量不是非常巨大的情况,用 Rails 依然是最佳的选择,上手就可以开始搞,什么细节都考虑到了(比如:安全),每次开始新项目的时候都在考虑,要不要用个轻量级的框架来搞,结果最终还是 Rails,主要还是用 Rails 几下就能搞出东西来...
大家讨论还是那个观点,Rails 快是它的强项,不用考虑太多的东西,例如:对于一个月要搞定的新项目,这种事对于 Java 来说是不可能的(有过亲身体会),但用 python + Djiango,4 个人,需求都有,数据库有设计,20 多天搞定(不是最简约的功能);不知道 ROR 是不是比 python + Djiango 更快?
#49 楼 @garychang 之前的 Study 表明,即便不算 Admin,用 Django 开发实际代码量略小于 Rails...不过是老版本了,现在 Rails 和 Django 大部分都很接近了,除了 Rails 大致上要多占一倍内存以外。
http://www.slideshare.net/itisreal/rails-vs-django-study-presentation
可以组织个 Rails 4.0 vs Django 1.5 Study 么
我觉得说的挺好,不是说 rails 不好,只是用在不同的方面,“我一直觉得 Ruby 社区的很多开发者长期以来待在 Rails 的舒适区里面,完全丧失了探索和尝试其他东西的勇气,其实在 Rails 的世界之外,Ruby 社区的好东西还有很多很多”,这句话说的非常好
我一直觉得 Ruby 社区的很多开发者长期以来待在 Rails 的舒适区里面,完全丧失了探索和尝试其他东西的勇气,其实在 Rails 的世界之外,Ruby 社区的好东西还有很多很多
中枪!
启发很大,躺在 rails 的温床太久了...一些性能敏感的模块或许不适合使用 rails 实现吧,毕竟并发模型放在那里,适合 WEB 项目,不是 WebService 项目
# POST /posts # POST /posts.json def create @post = Post.new(params[:post])
respond_to do |format| if @post.save format.html { redirect_to @post, notice: 'Post was successfully created.' } format.json { render json: @post, status: :created, location: @post } else format.html { render action: "new" } format.json { render json: @post.errors, status: :unprocessable_entity } end end end status: :unprocessable_entity 这是什么语法?
只有长连接需要高并发,特别是聊天或者游戏服务器的场景,而且都有相应的解决方案... 大部分网页都是一下就搞定的并发有个鬼用...
@zhangjingqiang @bhuztez 写页面绝对是 django 比较慢,那个模板略蛋疼啊... 一个 admin 搞这么久是他们不对,都不会查一下各种 admin 的 gem...
有几家网站可以达到 LinkedIn 的规模,一般的网站,Rails 足够了。 一开始的 Startup 目标是效率和生存,选择 Rails 是有原因滴,性能等问题等做大了,有资源了,到时候自然会解决滴
用相同的开发流程比较,就容易 bias 到自己熟悉的那边... 实际用法区别巨大,用各自特色的功能就比较不起来了...
攻击者也不好混啊,有攻击价值的站不多,vurcurex 还是开发人员没订阅更新,在周二被 1day 的
其实 ruby 在并发问题上是比较弱一些(或是做的不漂亮),因为并发模型并没有内建于语言之中(像 Erlang, Scala 的 actor),又一直没有一个很漂亮的并发库。matz 也承认这一点(为没有在语言中内建并发模型感到后悔)。
这是我近年来看到的,ruby 方面最精彩的文章。
当年看了下 rails,被 ActiveRecord 迷倒了,因为没写过 MVC,不觉得 MC 有啥厉害的。 后来看来这个: http://raganwald.com/2006/05/how-to-make-programming-hard-for.html
再去看了 ActiveRecord 的源码,才了解到原来 ruby 是这么用的。 不过这个大哥的文章,比我了解的深入太多了。
知其然,知其所以然。才能用好,用对。 用信仰和喜爱程度、使用人数选择要用什么的,这个太幼稚了。
@lgn21st , status: :unprocessable_entity ---- 最新 RAILS 代码 :status => :unprocessable_entity 这两个功能一样吗?
@zeeler ,我这边是用 grape 做的基于地理位置的搜索,给定坐标搜索基于该坐标的附近建筑,类似这种,貌似是不能用 cache 吧,我觉得瓶颈问题应该是在并发上,路由解析上,其他的应该是业务逻辑的问题了
ruby 效率问题应该不大,rails 的确是有些过于臃肿,但是开发起来很爽。ruby 很多 web 框架,就好像 python 也有很多框架一般。 如果只是一个普通的站点,你从来不用考虑过多的性能问题,你什么时候见到 ruby china 抱怨过 rails 巨慢,垃圾的要死呢。 经常出现的问题就是一个逻辑占用的资源远远比 rails 大,普通的站点瓶颈一般不会出现在框架上。
不过话说回来,ruby 社区的确是应该去 rails 化了。我不敢说 rails 过时,而且很多新手就是冲着 rails 来的。但是等他们弄完 rails,他们在社区里应该更加关注 ruby 本身的东西,同时为 ruby 发展做出更多贡献,而不是需要问问题的时候跑来问一下 rails 的问题,然后匿了。
#105 楼 @vincenttone 我记得好像以前看 ruby china 有个帖子说网站曾经跑在 Linode 上,启动了两个 Thin 进程和一个后台 resque,然后内存就不够用了,网站并发访问一高就很慢,似乎是抱怨过 Rails 的吧。
我个人网站:robbin 个人网站 跑在 Linode512 上,用 rainbows 跑了两个进程,每个进程跑 32 个线程,每个 workder 进程稳定使用 70MB 内存。调大 GC 参数以后,每个 workder 进程稳定在 110MB 物理内存,可以轻松支撑很大的并发访问量。
RUBY_HEAP_MIN_SLOTS=600000 RUBY_FREE_MIN=200000 RUBY_GC_MALLOC_LIMIT=60000000 export RUBY_HEAP_MIN_SLOTS RUBY_FREE_MIN RUBY_GC_MALLOC_LIMIT
谢谢分享。
我的想法是用 Rails 起步快速开发,在商业模式和规模逐渐提高的时候通过监控找出瓶颈迅速剥离成 service, 分开 scale。剥离的模块会功能比较单一而且数据核心,用 Sinatra / Grape 比较合适。这会是个比较好的折衷 / 兼顾。我看到的太早考虑 service 架构的往往都变的 YAGNI,而且开发成本太高
Padrino 起步这条路还一直没有机会用,可以尝试一下。