自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

讓30臺服務器縮減到2臺:從Ruby遷移到Go語言

開發(fā) 開發(fā)工具 后端
我們開發(fā)第一版的IronWorker已經(jīng)是3年前的事了,是用Ruby寫的,API基于Rails開發(fā)。我們沒用多久就發(fā)展成了相當大的規(guī)模,很快我們就觸及到了Ruby程序的承載上限。長話短說,我們切換到了Go語言,請接著讀下去,下面是事情如何一步步發(fā)展的。

[[68242]]

我們開發(fā)第一版的IronWorker已經(jīng)是3年前的事了,是用Ruby寫的,API基于Rails開發(fā)。我們沒用多久就發(fā)展成了相當大的規(guī)模,很快我們就觸及到了Ruby程序的承載上限。長話短說,我們切換到了Go語言,請接著讀下去,下面是事情如何一步步發(fā)展的。

最初的設(shè)計

首先,做一點背景介紹:我們開發(fā)的第一版IronWorker,起初叫做SimpleWorker(很不錯的名稱,不是嗎?),用的是Ruby。我們過去是一個顧問公司,為其它公司開發(fā)應用,在當時有兩個東西被炒得非?;穑簛嗰R遜的Web Services和Ruby on Rails。所以我們開發(fā)的應用都基于AWS的Ruby on Rails架構(gòu),并因此吸引了不少大客戶。我們開發(fā)IronWorker的初衷是來源我們自身的需求。我們有不少做硬件設(shè)備的客戶,他們會7×24小時不停的給我們發(fā)送數(shù)據(jù),我需要收集這些數(shù)據(jù),把它們整理成有用的信息。典型的做法就是讓定時任務每天每小時的遍歷這些數(shù)據(jù)。我們想到應該開發(fā)一個東西,能夠處理所有用戶的數(shù)據(jù),而不必做一大批的定時任務為每個客戶單獨處理。于是我們開發(fā)了一個服務類應用,并在內(nèi)部使用了一段時間,但后來我們認為一定會有其他的人也需要這個應用,于是我們決定公布它,這樣,IronWorker誕生了。

我們的服務器可承受的CPU使用率大概在50-60%。當超過這個額度,需要增加服務器來保持它在50%左右。只要我們不介意大量的服務器租用費(我們當然介意),這種模式會工作的很好。但最大的問題是出現(xiàn)在流量大量陡增時。當一個大型的流量高峰到來時,它會產(chǎn)生多米諾效應,會拖垮我們整個的服務器集群。當某些指標超過50%的閥值時,我們的Rails服務器會吃掉100%的CPU使用率,變成無響應狀態(tài)。這會導致負載均衡設(shè)備認為它已經(jīng)宕了,把它移出分發(fā)池,于是這臺無響應的服務器上的負載就會轉(zhuǎn)移到池中其他服務器上。因為池中剩下的服務器需要承載這失去的服務器上的負載再加上流量高峰,必然會有第二臺服務器倒下,負載均衡設(shè)備又會把它移除,前赴后繼。很快池中所有的服務器都會耗盡。這種現(xiàn)象也叫做colossal clusterf**k (ref: +Blake Mizerany)。

這里是一個簡單描繪多米諾宕機效應的繪圖

這里是一個簡單描繪多米諾宕機效應的繪圖。

在這種架構(gòu)下避免這種事情發(fā)生的唯一辦法就是保持有大量的額外處理能力,讓我們的服務器的負載遠低于它應該能承受的能力,但這意味著要多花一大筆錢。必須讓這種狀態(tài)有所改變。

重寫應用

我決定重寫這應用。這是一個很容易的決定,很顯然,我們的Ruby on Rails無法支撐我們業(yè)務規(guī)模的增長。我們都有多年的開發(fā)Java的經(jīng)歷,曾經(jīng)寫過很多東西只需要很少的資源就能處理大量負載,遠比Ruby on Rails的處理能力強的多,我知道我們可以做出很多改進。于是,接下來的問題變成了應該使用哪種語言?

選擇一種語言

我對任何新建議都持開放的態(tài)度,最不濟,我還可以重回到Java。Java是一個在很多方面(比如性能上)很棒的語言(是嗎?),但經(jīng)過了多年的Ruby程序編寫后,我已經(jīng)為它的開發(fā)效率所癡迷。Ruby很有趣,樸素,簡單。

我們搜索了一下比Ruby性能上要好的腳本語言(Ruby并不是很差),比如Python和Javascript/Node,我們還研究了Java的衍生語言,如Scala和Clojure,和還有其它的語言例如Erlang(AWS使用了它)和Go語言(golang)。Go語言獲勝。事實上,它的作為基礎(chǔ)組成部分的并發(fā)特征太強悍了;它的標準核心庫提供了我們開發(fā)API服務需要的所有東西;它簡潔;它編譯快;很像Ruby,Go語言很有趣;最后,數(shù)字是不會撒謊的。經(jīng)過了一次原型制作和性能測試后,我們知道了通過它我們可以將負載能力做重大的提高。經(jīng)過了征詢團隊的意見(“這很好,它背后有Google支持”),我們打起了攻堅戰(zhàn)。

起初決定押寶Go語言時,這是一個有風險的決策。Go語言的社區(qū)并沒大量的形成,沒有多少開源的Go語言工程項目,在正式產(chǎn)品上使用Go語言的成功案例并不多(有嗎?)。而且我們并不敢肯定在認定Go語言后能否招到這方面的頂級人才,但很快我們發(fā)現(xiàn)我們可以招到頂級人才——正是因為我們選擇了Go語言。我們是首個公司公開的宣稱在我們的產(chǎn)品中使用Go,首個公司在Go語言郵件列表里貼出Go語言工作職位招聘。很多頂級程序員希望來我們這里,就是因為這樣他們可以在每日的編程中使用Go語言。

Go語言的表現(xiàn)

[[68243]]

在我們推出了首個Go語言版本后,我們的服務器數(shù)量從30個減少到了2個,并且只留了2個服務器做冗余儲備。它們就像是根本沒有被使用,完全就像沒有任何程序在上面運行。我們的CPU使用率低于5%,整個應用的運行啟動只消耗了幾百KB的內(nèi)存(僅在啟動時),相比之下Rails應用要耗用50MB。這種比較甚至是包括了虛擬機內(nèi)存使用!這真是天與地的差別。從此我們再也沒有經(jīng)歷過多米諾宕機的事故。

相比起之前,我們的業(yè)務增長了許多。我們有了更大的流量,我們增加了兩個新服務(IronMQIronCache),我們有數(shù)百個服務器來支持客戶的需求。這全部是用Go做后臺馬達。回想起來,選擇Go語言是一個明智之舉,它讓我們開發(fā)出更好的產(chǎn)品,幫助公司成長,擴大企業(yè)規(guī)模,并且吸引了一流人才。我相信它會繼續(xù)在可預見的未來幫助我們進步。

英文原文:How We Went from 30 Servers to 2: Go

譯文鏈接:http://www.aqee.net/how-we-went-from-30-servers-to-2-go/ 

責任編輯:林師授 來源: 外刊IT評論
相關(guān)推薦

2013-03-14 09:42:58

GoRuby

2013-03-15 10:54:39

服務器RubyRails

2016-07-12 10:40:35

服務器

2016-08-16 15:21:19

服務器

2017-04-24 16:10:19

戴爾

2014-06-24 13:54:25

2016-09-21 10:25:20

私有云360私有云平臺Syndic

2013-11-20 15:58:13

2016-11-11 14:58:48

IBM 服務器

2009-02-27 16:56:00

Google服務器

2009-04-03 09:19:04

谷歌服務器數(shù)據(jù)中心

2018-05-11 09:40:10

服務器運維運營商

2009-09-22 16:49:01

第一臺服務器

2023-09-05 09:32:07

服務器Redis

2013-08-30 10:15:24

2024-10-31 10:41:01

2013-11-24 17:27:25

Facebook運維Facebook運維

2024-11-01 12:10:57

2019-11-12 13:30:07

開源技術(shù) 軟件
點贊
收藏

51CTO技術(shù)棧公眾號