Iron.io从Ruby迁移到Go:减少了28台服务器并避免了连锁故障

标签: iron io ruby | 发表时间:2013-03-22 22:54 | 作者:
出处:http://pipes.yahoo.com/pipes/pipe.info?_id=10560380f804c7341f042a2b8a03e117

过去几个月,我在用Go语言编写系统,所以一直密切关注能够证实我的选择是正确的”的那些消息。当Iron.io记录下 使用Go重写IronWorker的经验时,机会出现了。Iron.io中非常忙碌的作业执行系统最初是用Ruby编写的。

重写的结果是:

  • 服务器数量从30台减少到2台,而且第2台仅用于实现冗余。
  • CPU利用率下降至5%以下。
  • 所用内存也下降了很多。Rails应用在启动时需要接近50MB内存,而Go版本在启动时只需要几百KB内存。
  • 连锁故障成为历史。
  • 运行于成百上千台服务器上的新服务完全用Go编写。
  • 他们认为,Go的使用使他们得以“构建伟大的产品,得以成长和扩展,同时还能吸引一流人才”。他们的博客中写道:“我们认为,在可预见的未来,它将继续帮助我们成长。”一般建议根据人才库的规模来选择编程语言,他们发现Go语言的选择帮助他们吸引了顶级人才。
  • 容易部署,因为Go程序会编译为一个单一静态映像。
  • Go存在的小问题:需要学习一种新语言,库还有限。
  • 如果服务器流量很高,或者你想应对突发的增长,Go是很好的选择。

当然,如果没有第二系统效应(Second System Effect)的影响,重写会快得多,不过你可能会回想起LinkedIn的类似经验: LinkedIn从Rails迁移到Node:服务器减少27台,速度提升多达20倍

下面说明一下Go解决的问题:

  • 在使用Ruby时,服务器的CPU利用率维持在50%到60%之间。为将CPU利用率保持在50%左右,可以增加服务器,这样就可以优雅地处理流量峰值。但这种方式有个缺点:需要昂贵的服务器来进行水平扩展。
  • 他们有一个非常有趣的故障模式。当流量出现峰值时,Rails服务器的CPU利用率将达到100%。这就致使该服务器看上去是失效了,进而引发负载均衡器把流量路由到其余服务器上,这样更多服务器的CPU利用率会飙升到100%。最终导致连锁故障。

使用Ruby有助于产品快速上市,这个理由十分在理。虽说性能并非一切,但这里我们看到了性能的价值,尤其是在Web层之外,性能更为重要。表现良好的服务在健壮性和成本方面都有巨大优势。

以往,系统的弱点被服务器的量所掩盖,但大量服务器要花很多钱,而且未必总能解决问题。

性能起到了缓冲作用,使系统既能承载流量而不至崩溃,又能容忍一次次的突发冲击。即时(Just-in-time)分配和启动新实例都需要时间,而长时间的流量峰值可能引发连锁故障。针对性能编码,而不是针对产品上市时间编码,即可防患于未然。

Go 并不完美

如果看一下Go的Google网上论坛,你会发现Go并不是没有 性能问题。不过这些问题往往可以编码绕过。比如用bufio.ReadSlice代替bufio.ReadString,能够去掉一次数据复制,代码魔法般地快了若干倍。

学习这些技巧是需要时间的,尤其对这样一种新语言而言。

让Go真正处于不利地位的是,JVM和V8 JavaScript引擎在垃圾回收优化和代码生成方面已经有了许多年的经验积累。Go要赶上尚需时日。

性能永远不会是免费的。你必须巧妙地编码,将状态共享最小化,不要老翻腾内存,要尽力剖析,理解自己的语言并且能够用这种语言来做正确的事。

查看英文原文 Iron.io Moved From Ruby to Go: 28 Servers Cut and Colossal Clusterf**ks Prevented


感谢 杨赛对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com。也欢迎大家通过新浪微博( @InfoQ)或者腾讯微博( @InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

您可能也会喜欢

相关 [iron io ruby] 推荐:

物理IO与逻辑IO

- - 操作系统 - ITeye博客
IO性能对于一个系统的影响是至关重要的. 一个系统经过多项优化以后,瓶颈往往落在数据库;而数据库经过多种优化以后,瓶颈最终会落到IO. 而IO性能的发展,明显落后于CPU的发展. Memchached也好,NoSql也好,这些流行技术的背后都在直接或者间接地回避IO瓶颈,从而提高系统性能. 上图层次比较多,但总的就是三部分.

了解Ruby Gems

- Jacky - Reborn
所谓RubyGem,就是一个个软件包,通常被简称为“gem”. 通常一个Gem里包含一个Ruby应用程序或者一个Ruby程序库. 而RubyGems软件本身允许用户在自己的系统中轻松地下载、安装、操作Gems. 以下两个网址无论如何都应该放到自己的收藏夹里:. 最著名的Gem之一,当然是Rails——当我们安装Rails的时候,使用的命令行是:.

开始Ruby

- TheLover_Z - 博客园-首页原创精华区
我的上一篇为什么要学动态语言和大家分享了一些心得,如果有人因此想试试动态语言,哪怕是一点点,我也很高兴,毕竟自己写的东西还有点意义. 俗话说,万事开头难,但是开始用动态语言一点也不难,还是以ruby为例. 1.首先来看看这个网站, http://tryruby.org/. 顾名思义,这个网站的目的就是让大家试试Ruby,我觉得做的比较好的就是它有一步步的教程,只要照着它的提示一步步往下,就能领略Ruby的魅力.

Ruby On Rails 4 hello world,Ruby On Rails上手

- - CSDN博客Web前端推荐文章
有机会再试一试Rails了,只是原来接触的是2,现在已然变成了4,似乎现在的安装比原来会快些. 似乎这就是当前的最新版本. 似乎这就是诸如Django、Rails这类对于轻量级网站的数据库要求. 其他可以看情况安装,如openSUSE. 可以直接用rails生成. 这样的话打开  http://localhost:3000 就可以看到,Rails的欢迎界面Welcome aboard,有点类似于Django-CMS的小马哥~~.

安装rails(ruby on rails)

- - BlogJava_首页
  记得两年前使用ror做网站,自动生成功能记忆犹新,只是当时网络知识实在缺乏,体会不到其中的乐趣. 现在了解的很多了,书也有两本,一直想重新体验最新版做个网站. 安装这个过程实在有点坑爹,查找网上若干ror的书包括2012年版的书,按照上面的步骤都没法安装完成,搞得我一会在linux下试验,一会在windows下试验,都没成功,只好放下.

Ruby视频资料清单

- Shu. Wang - 欧阳的技术笔记
斯坦福Ruby与Rails进行Web开发的开放课程. 通俗易懂,不过其中课程使用的Rails版本是2.3. 同时,本课程配合斯坦福系列开发课程,是非常好的自学材料. lynda公司出品的rails3基础教程. 绝对通俗易懂,视频拆分方式很适合等人时间阅读. 并不支持Rails3.1,是Rails3.0.

linux异步IO浅析

- Sepher - kouu's home
知道异步IO已经很久了,但是直到最近,才真正用它来解决一下实际问题(在一个CPU密集型的应用中,有一些需要处理的数据可能放在磁盘上. 预先知道这些数据的位置,所以预先发起异步IO读请求. 等到真正需要用到这些数据的时候,再等待异步IO完成. 使用了异步IO,在发起IO请求到实际使用数据这段时间内,程序还可以继续做其他事情).

java nio和io的比较

- - 互联网 - ITeye博客
第一部分:简单介绍NIO.     服务器在合理时间内处理大量客户机的请求的能力取决于服务器使用I/O流的效率,同时为成百上千的客户提供服务的服务器必须能并发的使用I/O服务.     用Java语言写的服务器,由于其线程与客户机之比几乎是一比一,因而易受到大量线程开销的影响,其结果是即导致性能问题,又缺乏伸缩性.

我的PHP,Python和Ruby之路

- heely - robbin的自言自语
因为看到一篇讨论PHP,Python和Ruby的编程语言讨论贴,就说说我的PHP,Python和Ruby之路吧:. 我2000-2001年用PHP用了两年,那还是第一次互联网泡沫时期,到2001年后期,Servlet/JSP流行,然后我就发现:你说用PHP写的东西,都会被人鄙视. 当时我们其实也用Java了,只不过用Java写后端的消息队列.

关于Ruby 2.0: 我们的计划

- Fred - LetRails
这是Matz在去年10月份做的一个关于Ruby 2.0的主题演讲,正如他所说,Ruby 2.0在特性方面只是向前迈进了一小步,更多的改变将发生在实现层面. Ruby 2.0的新特性包括:. 1.step(a, b) do |i| p i end # 是从a到b,还是从b到a. 减少monkey patch对系统可能造成的负面影响.