为什么不能通过像Facebook这样的网站添加服务器来扩展规模?
我一直在寻找一个解释,为什么twitter必须将部分中间件从Rails迁移到Scala。 什么阻止了他们扩大Facebook的方式,通过添加服务器作为其用户基础扩大。 更具体地说,Ruby / Rails技术如何阻止Twitter团队采取这种方法?
并不是说Rails不能扩展,而是用Ruby(或任何解释型语言)对“活”数据的请求不能扩展,因为在CPU和内存利用方面,它们的成本比编译语言相对要贵得多。
现在,Twitter是一种不同types的服务,它具有相同的庞大用户群,但服务的数据变化较less,Rails可以通过caching成为可行的select; 即完全避免对Rails堆栈的实时请求,并将其卸载到前端服务器和/或内存中的数据库caching中。 关于这个话题的优秀文章:
如何Basecamp下一步如此快速
但是,Twitter并没有因为缩放问题而独自抛弃Rails,而是因为Scala作为一种语言,为解释语言无法提供的应用程序状态提供了某些内置的保证:如果编译,则会浪费时间错误的拼写错误,不正确的方法调用,错误的types声明等根本不存在。
对于Twitter的TDD是不够的。 Dijkstra在Scala编程中的一个引用说明了这一点:“testing只能certificate错误的存在,而不是它们的缺失”。 随着他们的应用程序的增长,他们越来越难以追踪到错误。 神秘的神秘之旅正在成为超越表演的障碍,所以他们做出了转变。 根据所有帐户压倒性的成功,推特是斯卡拉什么Facebook到PHP(虽然Facebook使用自己的超快C + +预处理器,所以作弊一点;-))
总之,Twitter做出了性能和可靠性的转换。 当然,Rails倾向于位于创新的前沿,所以世界上99%的非Twitter级别的应用程序可以通过解释型语言获得很好的效果(尽pipe现在我已经在编译语言方面扎实地工作了,斯卡拉太好了!)
没有哪个平台可以无限扩展,同时还能处理每时每刻都在变化的复杂数据。 语言和基础设施很重要,但您如何构build您的网站和数据访问模式更重要。
如果您曾经玩过Transport Tycoon或Settlers这样的游戏,那么您就需要知道如何随着使用量的增加而停留在升级基础架构之上。
像Facebook和Twitter这样的扩展平台是一个永无止境的任务。 你有越来越多的用户,你被推动添加更多的function和function。 这是一个不断升级的过程,导致更多的压力。
抛出问题的服务器并不总是答案,有时可能会导致更多的问题。
简短的版本是Ruby和Rails没有提供他们所需要的服务的性能和可靠性。 鉴于规模,这并不奇怪, 大多数COTS解决scheme在超大规模的末端并不令人满意。
高可扩展性涵盖了关于高端架构和其他站点的许多问题,因此也有助于回答该领域更广泛的问题。
他们本可以在这个问题上抛出更多的硬件,但是只要编写更高效的代码就会更加昂贵。 像许多高级框架一样,Ruby on Rails在许多方面都很出色,但高性能不是其中之一。 编译语言总是比解释语言更快。
Facebook(和Google)通过增加更多的服务器来扩展规模,但同时他们将应用分解成各种服务。 这些服务通过商定的接口和types进行通信,现在他们可以自由地使用任何他们认为合适的技术来构build这些服务。 仅仅因为你阅读Facebook使用PHP并不意味着他们的所有后端服务都由PHP提供服务(并没有任何意义,因为在SOA中,你可以select任何技术堆栈)。
我认为这个video是你的问题的最佳答案:
“从Ruby到JVM” https://www.youtube.com/watch?v=ohHdZXnsNi8
我认为这里缺less一个重要的平台。 是的,我们有编译和解释的论点,还有一些其他的。 但是一个非常重要的方面确实是这个平台。 有不同的Ruby虚拟机,但没有人请推特,虽然他们调整了一下。 但是Scala运行在JVM上,而且Twitter工程师们也在这方面做了一些漂亮的经验。 为什么他们没有尝试/selectJRuby? 那么我想上面提到的原因来这里发挥。
具有并行性的线性增益(这是多个服务器所能达到的)是非常罕见的,而且非常依赖于应用程序。 是的,它存在 – 这就是GPU如何完成大部分工作。 如果您正在提供静态页面,而没有会话状态,那也是如此。
然而,大多数情况下,添加服务器不会线性提高性能(即,10台服务器的速度不会比1台服务器快10倍), 这意味着您可以在单台服务器上获得的任何收益将比仅添加服务器。 这不像Twitter没有一堆服务器,现在呢?