谷歌執行著少量但規模巨大的服務。這些服務由覆蓋開發者所需一切的全球基礎設施提供支援:儲存系統、負載均衡器、網路、日誌記錄、監控等等。儘管如此,它並非一個靜態系統——也無法成為靜態系統。架構不斷演進,新的產品和想法不斷湧現,新版本必須推出,配置需要推送,資料庫模式需要更新,等等。我們最終每秒鐘要部署數十次系統更改。
鑑於這種規模和對可靠性的關鍵需求,谷歌開創了網站可靠性工程(SRE),這是一個許多其他公司後來都採納的角色。“SRE 就是當你把運維當作一個軟體問題來對待時所得到的東西。我們的使命是以永不鬆懈的眼光,保護、維護和推進谷歌所有公共服務背後的軟體和系統,並關注其可用性、延遲、效能和容量。”——網站可靠性工程(SRE)。
“
Go 在效能和可讀性之間提供了一個甜蜜點,這是其他語言(Python 和 C++)都無法提供的。
在 2013-2014 年,谷歌 SRE 團隊意識到,在許多方面,我們生產管理的方法已經不再適用了。我們已經遠遠超越了 shell 指令碼,但我們的規模有太多活動部件和複雜性,需要一種新的方法。我們決定,需要朝著一種宣告式的生產模型邁進,稱為“Prodspec”,由一個名為“Annealing”的專用控制平面驅動。
當我們開始這些專案時,Go 剛剛開始成為谷歌關鍵服務的可行選項。大多數工程師更熟悉 Python 和 C++,兩者都是有效的選擇。然而,Go 引起了我們的興趣。新穎性因素肯定有一定影響。但更重要的是,Go 在效能和可讀性之間提供了一個甜蜜點,這是其他語言都無法提供的。我們開始在 Annealing 和 Prodspec 的一些初始部分進行小規模的 Go 實驗。隨著專案的進展,這些用 Go 編寫的初始部分成為了核心。我們對 Go 很滿意——它的簡潔性讓我們越來越喜愛,效能也達到了要求,而且併發原語很難被替代。
“
現在,谷歌的大部分生產都由我們用 Go 編寫的系統進行管理和維護。
在任何時候,都沒有強制或要求使用 Go,但我們也沒有意願回到 Python 或 C++。Go 在 Annealing 和 Prodspec 中自然而然地發展起來。它是正確的選擇,因此現在也是我們首選的語言。現在,谷歌的大部分生產都由我們用 Go 編寫的系統進行管理和維護。
在這些專案中擁有簡單語言的力量是難以估量的。有些情況下,確實缺少某些功能,例如在程式碼中強制要求某些複雜結構不應被變異的能力。但在所有這些情況中,肯定有數十或數百個情況是由於簡潔性而受益的。
“
Go 的簡潔性意味著程式碼易於理解,無論是在審查中發現 bug,還是在嘗試確定服務中斷期間究竟發生了什麼時。
例如,Annealing 影響著廣泛的團隊和服務,這意味著我們非常依賴公司內部的貢獻。Go 的簡潔性使得我們團隊之外的人能夠看到某些部分為何對他們不起作用,並常常自己提供修復或功能。這使我們能夠快速成長。
Prodspec 和 Annealing 負責一些非常關鍵的元件。Go 的簡潔性意味著程式碼易於理解,無論是在審查中發現 bug,還是在嘗試確定服務中斷期間究竟發生了什麼時。
Go 的效能和併發支援也是我們工作中的關鍵。由於我們的生產模型是宣告式的,我們傾向於操作大量結構化資料,這些資料描述了生產是什麼以及它應該是什麼。我們有大型服務,因此資料可能會變得很大,這使得純粹的順序處理通常不夠高效。
我們以多種方式並在許多地方操作這些資料。這並非是有一個聰明人想出一個我們演算法的並行版本。這而是關於隨意並行化,找到下一個瓶頸並並行化該程式碼段。Go 正是為了這一點而設計的。
由於我們在 Go 方面的成功,現在我們對 Prodspec 和 Annealing 的所有新開發都使用 Go。
除了網站可靠性工程團隊之外,谷歌內部的工程團隊也已在其開發過程中採用了 Go。閱讀有關核心資料解決方案、Firebase 託管和Chrome團隊如何使用 Go 構建快速、可靠且高效的大規模軟體的文章。
關於谷歌網站可靠性工程(SRE)
谷歌網站可靠性工程團隊的使命是以永不鬆懈的眼光,保護、維護和推進谷歌所有公共服務(例如谷歌搜尋、廣告、Gmail、Android、YouTube 和 App Engine 等)背後的軟體和系統,並關注其可用性、延遲、效能和容量。
他們分享了他們從 Python 和 C++ 的經驗出發,構建核心生產管理系統使用 Go 的經驗。