重写应用我决定重写这应用。这是一个很容易的决定,很显然,我们的Ruby on Rails无法支撑我们业务规模的增长。我们都有多年的开发Java的经历,曾经写过很多东西只需要很少的资源就能处理大量负载,远比Ruby on Rails的处理能力强的多,我知道我们可以做出很多改进。于是,接下来的问题变成了应该使用哪种语言? 选择一种语言我对任何新建议都持开放的态度,最不济,我还可以重回到Java。Java是一个在很多方面(比如性能上)很棒的语言(是吗?),但经过了多年的Ruby程序编写后,我已经为它的开发效率所痴迷。Ruby很有趣,朴素,简单。 我们搜索了一下比Ruby性能上要好的脚本语言(Ruby并不是很差),比如Python和Javascript/Node,我们还研究了Java的衍生语言,如Scala和Clojure,和还有其它的语言例如Erlang(AWS使用了它)和Go语言(golang)。Go语言获胜。事实上,它的作为基础组成部分的并发特征太强悍了;它的标准核心库提供了我们开发API服务需要的所有东西;它简洁;它编译快;很像Ruby,Go语言很有趣;最后,数字是不会撒谎的。经过了一次原型制作和性能测试后,我们知道了通过它我们可以将负载能力做重大的提高。经过了征询团队的意见(“这很好,它背后有Google支持”),我们打起了攻坚战。 起初决定押宝Go语言时,这是一个有风险的决策。Go语言的社区并没大量的形成,没有多少开源的Go语言工程项目,在正式产品上使用Go语言的成功案例并不多(有吗?)。而且我们并不敢肯定在认定Go语言后能否招到这方面的顶级人才,但很快我们发现我们可以招到顶级人才——正是因为我们选择了Go语言。我们是首个公司公开的宣称在我们的产品中使用Go,首个公司在Go语言邮件列表里贴出Go语言工作职位招聘。很多顶级程序员希望来我们这里,就是因为这样他们可以在每日的编程中使用Go语言。 Go语言的表现在我们推出了首个Go语言版本后,我们的服务器数量从30个减少到了2个,并且只留了2个服务器做冗余储备。它们就像是根本没有被使用,完全就像没有任何程序在上面运行。我们的CPU使用率低于5%,整个应用的运行启动只消耗了几百KB的内存(仅在启动时),相比之下Rails应用要耗用50MB。这种比较甚至是包括了虚拟机内存使用!这真是天与地的差别。从此我们再也没有经历过多米诺宕机的事故。 相比起之前,我们的业务增长了许多。我们有了更大的流量,我们增加了两个新服务(IronMQ 和 IronCache),我们有数百个服务器来支持客户的需求。这全部是用Go做后台马达。回想起来,选择Go语言是一个明智之举,它让我们开发出更好的产品,帮助公司成长,扩大企业规模,并且吸引了一流人才。我相信它会继续在可预见的未来帮助我们进步。 |