Ruby on rails RubyonRails的可伸缩性/性能?

Ruby on rails RubyonRails的可伸缩性/性能?,ruby-on-rails,ruby,scalability,Ruby On Rails,Ruby,Scalability,我已经使用PHP有一段时间了,并且在CodeIgniter中使用得很好,这是一个很棒的框架。我开始了一个新的个人项目,上一次我在考虑使用什么(PHP vs ROR)时,我使用了PHP,因为我听说ROR存在可伸缩性问题,特别是在阅读了Twitter开发者对它的评论之后。可伸缩性仍然是ROR中的一个问题,还是有改进 我想学一门新的语言,ROR看起来很有趣。PHP完成了这项工作,但众所周知,它的语法和组织结构非常复杂,感觉像是一个大难题。RoR的主要特点是,除非你进入Alexa的前100名,否则你不会

我已经使用PHP有一段时间了,并且在CodeIgniter中使用得很好,这是一个很棒的框架。我开始了一个新的个人项目,上一次我在考虑使用什么(PHP vs ROR)时,我使用了PHP,因为我听说ROR存在可伸缩性问题,特别是在阅读了Twitter开发者对它的评论之后。可伸缩性仍然是ROR中的一个问题,还是有改进


我想学一门新的语言,ROR看起来很有趣。PHP完成了这项工作,但众所周知,它的语法和组织结构非常复杂,感觉像是一个大难题。

RoR的主要特点是,除非你进入Alexa的前100名,否则你不会有任何可伸缩性问题。除非你能将Phusion、Passenger或Mongrel挤出,否则共享主机的稳定性会有更多问题。

RoR正用于许多大型网站,但与任何语言或框架一样,它需要良好的体系结构(数据库扩展、缓存、调优等)才能扩展到大量用户


RoR有一些小的变化,使其更容易扩展,但不要期望它能神奇地为您扩展。每个网站都有不同的扩展问题,所以你必须投入一些工作来扩展它。

开发一种技术,这将给你的项目带来最大的成功机会-快速开发,易于调试,易于部署,好的工具,你对它了如指掌(除非重点是学习一门新语言),等等

如果你一个月有上千万的Unique,你可以雇佣几个人,如果你需要的话,可以用不同的技术来改写


。。。你会在缓存中搜索(抱歉-无法抗拒!!)

花点时间看看推特用户必须处理的问题,然后问问自己,你的应用是否需要扩展到这个级别


然后在Rails中构建它,因为您知道它是有意义的。如果你达到了Twitter级别,那么你将乐于考虑性能优化选项。至少你会用一种很好的语言来应用它们

再详细介绍一下Ryan Doherty的答案

我的日常工作是使用静态类型语言(.NET/C#),Ruby也是一种辅助工具。在我目前的工作之前,我是一家ruby开发公司的首席程序员,为《纽约时报》辛迪加服务公司工作。在那之前,我也在PHP工作(尽管很久很久以前)

我这么说只是为了说明这一点:我亲身经历过rails(以及更普遍的ruby)的性能问题,还有一些其他的选择。正如Ryan所说,你不会让它自动为你缩放。找到你的瓶颈需要工作和极大的耐心

我们从其他人甚至我们自己身上看到的大部分性能问题都是在ORM层中处理执行缓慢的查询。我们从Rails/ActiveRecord到Rails/DataMapper,最后到Merb/DM,每个迭代都因为底层框架而获得了更快的速度

缓存对性能有着惊人的影响。不幸的是,我们无法缓存数据。我们的缓存最多每五分钟就会失效一次。我们网站的几乎每一个部分都是动态的。因此,如果你不能做到这一点,也许你可以从我们的经验中学习

我们必须认真地微调数据库索引,确保我们的查询没有做非常愚蠢的事情,确保我们没有执行比绝对必要的更多的查询,等等。当我说“非常愚蠢的事情”时,我指的是1+N查询问题

#1 query
Dog.find(:all).each do |dog|
   #N queries
   dog.owner.siblings.each do |sibling|
      #N queries per above N query!!
      sibling.pets.each do |pet|
         #Do something here
      end
   end
end
DataMapper是处理上述问题的一个极好的方法(它没有1+N问题),但更好的方法是使用您的大脑,停止这样的查询:D当您需要原始性能时,大多数ORM层不会轻松处理极端定制的查询,因此您不妨手工编写它们

我们也做了一些常识性的事情。我们为不断增长的数据库购买了一台健壮的服务器,并将其转移到了自己的专用机箱中。我们还必须不断地进行大量的处理和数据导入。我们也将处理转移到它自己的盒子上。我们也停止了仅仅为了数据导入实用程序而加载整个奇怪的堆栈。我们只优雅地加载了我们绝对需要的内容(从而减少了内存开销!)

如果你还不知道。。。一般来说,当涉及到ruby/rails/merb时,您必须向外扩展,将硬件投入到问题中。但最终,硬件是便宜的;虽然这不是伪劣代码的借口!:D

即使有这些困难,我个人也不会在另一个框架中启动项目,如果我能帮助的话。我热爱这门语言,每天都在不断地学习。这是我从C#那里得不到的,尽管C#更快

我也喜欢开源工具,用这种语言开始工作的低成本,用这种语言做一些事情的低成本,并试着看看它是否有市场,同时用一种语言工作,这种语言通常是优雅和美丽的

最后,当你选择你的框架时,你日复一日的想活、想呼吸、想吃饭、想睡觉。如果你喜欢微软的思维方式,就选择.NET。如果您想要开放源代码,但仍然想要结构,请尝试Java。如果您想拥有一种动态语言,并且仍然比ruby具有更多的结构,那么可以尝试python。如果你想要优雅,试试Ruby(我开玩笑,我开玩笑…还有很多其他优雅的语言适合你。不要试图挑起一场火焰战:D)

见鬼,全都试试!我倾向于同意上面的答案,早期担心优化并不是你应该或不应该选择框架的原因,但我不同意这是他们唯一的答案

总之,是的,你必须克服一些困难,但是语言的优雅,imho,远远超过了
Dog.find(:all).each do |dog|
   #N queries
   dog.owner.siblings.each do |sibling|
      #N queries per above N query!!
      sibling.pets.each do |pet|
         #Do something here
      end
   end
end
Dog.Owners.Include()
Dog.Owners.Siblings.Include()
Dog.Owners.Siblings.Pets.Include()
Dog.find(:all).each do |dog|