啟動 Google 生產:Google 的網站可靠性工程團隊如何使用 Go

Cluas發表於2021-04-14

谷歌經營著少量非常龐大的服務。這些服務由一個覆蓋開發者所需一切的全球基礎設施提供支援:儲存系統、負載均衡器、網路、日誌記錄、監控等等。然而,它不是一個靜態系統,它不可能是。架構演化,新產品和想法不斷產生,新版本必須推出,配置推送,資料庫模式更新等等。我們最終會以每秒數十次的速度將更改部署到系統中。

由於規模如此之大,以及對可靠性的迫切需求,谷歌開創了網站可靠性工程(SRE)的先河,此後許多其他公司都採用了這一角色。“SRE 是當你把操作當作軟體問題來對待時得到的結果。我們的使命是保護、提供和改進谷歌所有公共服務背後的軟體和系統,時刻關注它們的可用性、延遲、效能和容量。”-站點可靠性工程(SRE)

Credit to Renee French for the Go Gopher

2013-2014 年,谷歌的 SRE 團隊意識到,我們的生產管理方法在很多方面都不再有效。我們已經遠遠超越了 shell 指令碼,但是我們的規模有太多的變動部分和複雜性,所以我們需要一種新的方法。我們確定我們需要朝著生產的宣告模型(稱為 “ Prodspec”)前進,它驅動一個專用的控制平面(稱為 “Annealing”)。

當我們開始這些專案時,Go只是谷歌關鍵服務的一個可行選擇。大多數工程師更熟悉PythonC++,這兩者都是有效的選擇。儘管如此,Go還是吸引了我們的興趣。新奇的吸引力當然是一個因素。但是,更重要的是,Go承諾了在效能和可讀性之間的最佳平衡點,這是其他語言都無法提供的。我們開始了一個小實驗, 用 Go 實現了AnnealingProdspec的一些初始部分。隨著專案的進展,最初用Go編寫的部分成為了核心。我們對Go很滿意——它的簡單性越來越好,效能也很好,併發原語很難被替代。

從來沒有使用Go的命令或要求,但是我們不想回到PythonC++GoAnnealingProdspec中有機成長。這是正確的選擇,因此現在是我們的語言選擇。現在,大部分谷歌產品是由我們用 Go 編寫的系統管理和維護的。

在這些專案中擁有一門簡單語言的力量是難以言表的。有些情況下確實缺少了某些特性,例如在程式碼中強制某些複雜結構不應發生變化的能力。但是對於每一個例子來說,毫無疑問,有幾十個或上百個例子,簡單性是有用的。

例如,Annealing影響各種各樣的團隊和服務,這意味著我們嚴重依賴於整個公司的貢獻。Go 的簡單性使我們團隊之外的人能夠看到為什麼某些部分或其他部分不適合他們,並經常自己提供修復或特性。這讓我們得以迅速成長。

ProdspecAnnealing負責一些相當關鍵的部件。Go的簡單性意味著程式碼易於遵循,無論是在review期間發現bug,還是試圖確定在服務中斷期間究竟發生了什麼。

Go的效能和併發性支援也是我們工作的關鍵。由於我們的產品模型是宣告式的,所以我們傾向於操作大量結構化資料,這些資料描述了產品是什麼以及它應該是什麼。我們擁有大型服務,因此資料可能會越來越大,這種情況下通常會使純粹的順序處理效率不高。

我們在很多地方用很多方式操縱這些資料。 這不是讓一個聰明人想出我們演算法的並行版本的問題。 這是一個偶然的並行性問題,即找到下一個瓶頸並對程式碼部分進行並行處理。Go可以做到這一點。

由於Go的成功,我們現在將 Go 用於ProdspecAnnealing的每個新開發中。除了 SRE 團隊,谷歌的工程團隊也在他們的開發過程中採用了Go。瞭解Core Data SolutionsFirebase HostingChrome團隊如何使用Go來大規模構建快速,可靠和高效的軟體。

站點可靠性工程師 Pierre Palatin 撰寫

References

  1. 站點可靠性工程(SRE)https://sre.google/
  2. Core Data Solutions https://go.dev/solutions/google/coredata/
  3. Firebase Hosting https://go.dev/solutions/google/firebase/
  4. Chrome https://go.dev/solutions/google/chrome/
更多原創文章乾貨分享,請關注公眾號
  • 啟動 Google 生產:Google 的網站可靠性工程團隊如何使用 Go
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章