Go在Google SRE的工程實(shí)踐

原文地址:https://opensource.googleblog.com/2021/04/actuating-google-production-how-googles-sre-team-uses-go.html)
原文作者:Pierre Palatin
本文永久鏈接:https://github.com/gocn/translator/blob/master/2021/w15-actuating-google-production-how-googles-sre-team-uses-go.md
譯者:Cluas
校對:Asta Xie

谷歌線上跑著一些巨型服務(wù),這些服務(wù)由全球基礎(chǔ)設(shè)施提供支持,涵蓋了開發(fā)者所需的所有組件:存儲系統(tǒng)、負(fù)載均衡器、網(wǎng)絡(luò)、日志記錄、監(jiān)控等等。然而,它并不是一個靜態(tài)系統(tǒng),它也不可能是。隨著架構(gòu)的演化,新產(chǎn)品和新想法的不斷產(chǎn)生,新版本的發(fā)布,配置的推送,數(shù)據(jù)庫模式的更新等等,最終需要我們會以每秒數(shù)十次的速度將這些更改部署到系統(tǒng)中。
由于規(guī)模過于龐大,以及對可靠性的迫切需求,谷歌開創(chuàng)了網(wǎng)站可靠性工程(SRE)的先河,此后許多其他公司都開始采用了這一角色。
“SRE 是當(dāng)你把操作當(dāng)作軟件問題來對待時得到的結(jié)果。我們的使命是保護(hù)、提供和改進(jìn)谷歌所有公共服務(wù)背后的軟件和系統(tǒng),時刻關(guān)注它們的可用性、延遲、性能和容量。”-站點(diǎn)可靠性工程(SRE)。

2013-2014 年,谷歌的 SRE 團(tuán)隊(duì)開始意識到,我們的生產(chǎn)管理方法在很多方面都不再像之前那么有效。我們的運(yùn)維自動化已經(jīng)非常領(lǐng)先了,但是我們這樣的規(guī)模有太多的變動部分和復(fù)雜性,所以我們需要一種新的方法來保障它。我們最終確定我們需要朝著生產(chǎn)聲明模型(稱為 “ Prodspec”)的方向前進(jìn),用它來驅(qū)動一個專用的控制平面(稱為 “Annealing”)。
當(dāng)我們開始開發(fā)這些項(xiàng)目時,Go剛剛成為 Google 提供關(guān)鍵服務(wù)的可行選擇之一。大多數(shù)工程師更熟悉Python和C++,這兩者都是有效的選擇。盡管如此,Go還是引起了我們的興趣。好奇心當(dāng)然是一個因素,但是,更重要的是,Go承諾了其他語言都無法提供的在性能和可讀性之間的最佳平衡點(diǎn)。我們開始了一個小實(shí)驗(yàn), 用 Go 實(shí)現(xiàn)了Annealing和Prodspec的一些初始部分。隨著項(xiàng)目的進(jìn)展,最初用Go編寫的部分成為了核心。我們對Go很滿意——它的簡單性越來越好,性能也很好,并且并發(fā)原語很難被替代。
盡管我們從來沒有收到使用Go的命令或要求,但是我們已經(jīng)不想回去使用Python或C++。Go在Annealing和Prodspec逐步被應(yīng)用。現(xiàn)在回過頭來看,這是相當(dāng)正確的選擇。現(xiàn)在,大部分谷歌產(chǎn)品是由我們用 Go 編寫的系統(tǒng)管理和維護(hù)的。
在這些項(xiàng)目中擁有一門簡單語言的力量是難以言表的。盡管Go在有些情況下確實(shí)缺少了某些特性,如在代碼中強(qiáng)制某些復(fù)雜結(jié)構(gòu)不發(fā)生改變的能力。但是對于大多數(shù)情況,毫無疑問,在多數(shù)情況下,這種簡單性起到了幫助作用。
舉個例子,Annealing影響各種各樣的團(tuán)隊(duì)和服務(wù),這意味著我們的發(fā)展嚴(yán)重依賴于整個公司的貢獻(xiàn)。Go的簡單性使我們團(tuán)隊(duì)之外的人能夠看到為什么某些部分或其他部分不適合他們,并經(jīng)常自己提供修復(fù)或特性,這讓我們得以迅速成長。
Prodspec和Annealing負(fù)責(zé)一些非常關(guān)鍵的組件。Go 的簡單性意味著這些代碼無論是在審核期間發(fā)現(xiàn)錯誤還是在嘗試確定服務(wù)中斷期間到底發(fā)生了什么時,都很容易去跟蹤。
Go的高性能和對并發(fā)性支持也是幫助我們工作的關(guān)鍵。由于我們的產(chǎn)品模型是聲明式的,所以我們需要操作大量的結(jié)構(gòu)化數(shù)據(jù),這些數(shù)據(jù)主要用來描述了產(chǎn)品是什么以及它應(yīng)該是什么。加上我們擁有大量的服務(wù),所以數(shù)據(jù)量變得巨大無比,這種情況下如果使用純粹的順序執(zhí)行處理就顯得不是那么高效。
我們在很多地方用很多方式操縱這些數(shù)據(jù),與其讓一個聰明人想出我們算法的并行版本的問題,不如在遇到一個偶然的并行性問題時,找到瓶頸并將這段相關(guān)代碼進(jìn)行并行化,Go可以輕易地做到這一點(diǎn)。
歸功于我們在Go上取得了成功,我們現(xiàn)在將Go應(yīng)用于Prodspec和Annealing的每個新開發(fā)中。除了 SRE 團(tuán)隊(duì),谷歌的工程團(tuán)隊(duì)也在他們的開發(fā)過程中采用了Go。點(diǎn)擊了解Core Data Solutions,F(xiàn)irebase Hosting和Chrome團(tuán)隊(duì)如何使用Go來大規(guī)模構(gòu)建快速,可靠和高效的軟件。
References
站點(diǎn)可靠性工程(SRE)https://sre.google/
Core Data Solutions https://go.dev/solutions/google/coredata/
Firebase Hosting https://go.dev/solutions/google/firebase/
Chrome https://go.dev/solutions/google/chrome/
