InfoQ Geekathon 大模型技术应用创新大赛 了解详情
写点什么

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

  • 2013-03-22
  • 本文字数:1381 字

    阅读完需:约 5 分钟

过去几个月,我在用 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 )关注我们,并与我们的编辑和其他读者朋友交流。

活动推荐:

2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。

2013-03-22 09:546707
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 126.9 次阅读, 收获喜欢 33 次。

关注

评论

发布
暂无评论
发现更多内容

架构师训练营第 0 期 - 第 8 周 - 学习总结

架构师训练营第8周学习总结

TH

视频丨包不同的沙雕敏捷之砸锅卖铁买兰博

华为云开发者联盟

程序员 运维 敏捷 敏捷开发 技术人

一图看懂华为云DevCloud如何应对敏捷开发的测试挑战

华为云开发者联盟

微服务 敏捷开发 测试 云服务 华为云

轻量级BI应用-Superset实践

Jackchang234987

BI 数据产品

第8周回顾

慵秋

判断两个链表是否合并

Acker飏

使用Spring Validation优雅地校验参数

Java课代表

springboot

2行代码搞定一个定时器!

简爱W

一次线上JVM Young GC调优,搞懂了这么多东西!

南方有乔木兮

学习总结 - 架构师训练营 - 第八周

走过路过飞过

面试官问:僵尸进程和孤儿进程有了解过吗

Java小咖秀

Linux 学习 面试 进程 经验

信创舆情一线--50多家科技公司源代码泄露

统小信uos

单向链表合并算法

走过路过飞过

架构师训练营week08 学习总结

GunShotPanda

第八周总结

Acker飏

JVM详解之:HotSpot VM中的Intrinsic methods

程序那些事

Java JVM GC

该学一学了!零基础入门Docker

程序员的时光

Docker

Java中的模板设计模式,太实用了!

BUZHIDAO

Java

架构师培训 -08总结 数据结构算法,网络通信协议,非阻塞网络 I/O,数据库原理

刘敏

Java SSM 框架常见面试题

老大哥

Java

架构师训练营 第 8 周总结

Jam

架构师训练营week08 作业

GunShotPanda

第八周总结

LEAF

BFC "苦"前端久矣!

double U

CSS 大前端

Developer 转型记:一个开发平台的“魔力”

华为云开发者联盟

华为 AI 开发者 开发者工具 华为云

百万并发「零拷贝」技术系列之经典案例Netty

码农神说

Java Netty 零拷贝

要都练基本功

架构师

揭秘淘宝平台广告策略,拆解最佳投放实践

华为云开发者联盟

数据分析 广告 用户增长 淘宝 电商

【解构系统设计面试】什么是系统设计?以及如何设计一个新鲜事系统?

罗远航

系统设计

判了!中科大博士写游戏外挂赚了12万获刑,被抓才知道帮团队赚了300万……

程序员生活志

游戏开发 游戏 游戏外挂 新闻

  • 扫码添加小助手
    领取最新资料包
Iron.io从Ruby迁移到Go:减少了28台服务器并避免了连锁故障_Ruby_Todd Hoff_InfoQ精选文章