Google 執行少數幾個非常大型的服務。這些服務是由全球基礎設施提供支援,涵蓋開發人員所需的一切:儲存系統、負載平衡器、網路、記錄、監控等等。儘管如此,它並非靜態系統,也不可能如此。架構會演進,新的產品和點子會被創造出來,新的版本必須推出、設定檔必須推播、資料庫架構必須更新,等等。我們最後會每秒對系統部署變更數十次。
由於這種規模和對可靠性的關鍵需求,Google 開創了網站可靠性工程 (SRE),許多其他公司也隨後採用這個職位。「SRE 是您在將營運視為軟體問題時所獲得的成果。我們的任務是保護、提供和推進所有 Google 公開服務背後的軟體和系統,並持續關注其可用性、延遲、效能和容量。」— 網站可靠性工程 (SRE)。
「Go 承諾在效能和可讀性之間取得平衡點,這是其他語言 [Python 和 C++] 都無法提供的。」
在 2013-2014 年,Google 的 SRE 團隊意識到我們對生產管理的方法在許多方面已經不再適用。我們已經遠遠超越 shell 指令碼,但我們的規模有太多變動的部分和複雜性,因此需要一種新的方法。我們確定我們需要朝向生產的宣告式模型邁進,稱為「Prodspec」,驅動一個專用的控制平面,稱為「Annealing」。
當我們開始這些專案時,Go 才剛成為 Google 中關鍵服務的可行選項。大多數工程師比較熟悉 Python 和 C++,這兩個都是有效的選擇。儘管如此,Go 還是引起了我們的興趣。當然,新奇感是一個因素。但更重要的是,Go 承諾在效能和可讀性之間取得平衡,這是其他語言無法提供的。我們開始對退火和 Prodspec 的一些初始部分進行小型 Go 實驗。隨著專案的進展,那些用 Go 編寫的初始部分發現自己處於核心位置。我們對 Go 感到滿意——它的簡潔性讓我們印象深刻,效能就在那裡,而且並行處理原語很難被取代。
「現在,Google 生產的大部分內容都是由我們用 Go 編寫的系統管理和維護的。」
從未有任何使用 Go 的命令或要求,但我們不希望回到 Python 或 C++。Go 在退火和 Prodspec 中自然而然地成長。這是正確的選擇,因此現在成為我們的首選語言。現在,Google 生產的大部分內容都是由我們用 Go 編寫的系統管理和維護的。
在這些專案中擁有簡單語言的力量難以言喻。確實有某些功能遺失的情況,例如在程式碼中強制執行某些複雜結構不應被變異的能力。但對於這些情況中的每一個,無疑有數十或數百個情況是簡潔性有所幫助的。
「Go 的簡潔性意味著程式碼很容易理解,無論是在審查期間發現錯誤,還是在嘗試確定服務中斷期間究竟發生了什麼時。」
例如,退火影響了各種團隊和服務,這表示我們高度依賴公司各方的貢獻。Go 的簡潔性讓團隊外的人員能夠了解某些部分或其他部分為何對他們不起作用,並經常自行提供修正或功能。這讓我們能夠快速成長。
Prodspec 和退火負責一些非常重要的元件。Go 的簡潔性表示程式碼易於遵循,無論是在檢閱期間發現錯誤,或是在服務中斷期間嘗試確定發生了什麼事時。
Go 效能和並行支援也是我們工作的關鍵。由於我們的生產模式是宣告式的,因此我們傾向於處理大量結構化資料,這些資料描述了生產是什麼,以及它應該是什麼。我們的服務很大,因此資料可能會變得很龐大,通常讓純粹的順序處理不夠有效率。
我們在許多方面和許多地方處理這些資料。這不是讓聰明的人想出我們演算法的平行版本的問題。這是隨意並行處理的問題,找出下一個瓶頸並將該程式碼區段平行化。而 Go 正好能做到這一點。
由於我們使用 Go 成功,我們現在將 Go 用於 Prodspec 和退火的每項新開發。
除了網站可靠性工程團隊外,Google 各地的工程團隊已在其開發過程中採用 Go。瞭解 核心資料解決方案、Firebase Hosting 和 Chrome 團隊如何使用 Go 大規模建置快速、可靠且有效率的軟體。
關於 Google 網站可靠性工程 (SRE)
Google 的網站可靠性工程團隊的任務是保護、提供和推進所有 Google 公開服務背後的軟體和系統,包括 Google 搜尋、廣告、Gmail、Android、YouTube 和 App Engine,僅舉幾例,並持續關注其可用性、延遲時間、效能和容量。
他們分享了使用 Go 建置核心生產管理系統的經驗,這些經驗來自於使用 Python 和 C++ 的經驗。