AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

從零到生產(chǎn):Go在Google的歷程

來源: 責(zé)編: 時(shí)間:2024-04-26 08:49:24 140觀看
導(dǎo)讀2007年Go誕生于Google,2009年Google正式對(duì)外宣布了Go語言的開源!時(shí)至今日,距離Go開源已經(jīng)過去了近15個(gè)年頭了[1]!Go在Google公司內(nèi)部究竟是怎樣的一個(gè)狀態(tài)呢?前Google員工Yves Junqueira近期撰文從其個(gè)人所見所聞?wù)劻薌o在G

2007年Go誕生于Google,2009年Google正式對(duì)外宣布了Go語言的開源!時(shí)至今日,距離Go開源已經(jīng)過去了近15個(gè)年頭了[1]!Go在Google公司內(nèi)部究竟是怎樣的一個(gè)狀態(tài)呢?前Google員工Yves Junqueira近期撰文從其個(gè)人所見所聞?wù)劻薌o在Google的歷程[2]!這里簡(jiǎn)單翻譯,供大家參考!T6M28資訊網(wǎng)——每日最新資訊28at.com

最近,Jeremy Mason[3]和Sameer Ajmani[4]撰寫了有關(guān)使Go成為Google內(nèi)部語言之一的傳奇故事。Go目前是世界上第八大最受歡迎的編程語言(譯者注:2024.4,Go已經(jīng)攀升到第7位,見下圖),并且仍在增長,因此人們有興趣了解Go早期以及它是如何走到這一步的。T6M28資訊網(wǎng)——每日最新資訊28at.com

Go在TIOBE排名升至第7(譯者配圖)T6M28資訊網(wǎng)——每日最新資訊28at.com

T6M28資訊網(wǎng)——每日最新資訊28at.com

我想我應(yīng)該從SRE、框架開發(fā)人員和早期采用者的角度來寫。我分享的所有信息都與谷歌已經(jīng)公開記錄的系統(tǒng)相關(guān),所以我不認(rèn)為我泄露了任何秘密。這個(gè)故事有一些重要的部分(例如:envelopei(譯者注:不知道是什么鬼))我在其他地方?jīng)]有看到提到過,所以我不會(huì)討論它們。T6M28資訊網(wǎng)——每日最新資訊28at.com

破冰:我在Google的Go編程簡(jiǎn)介

在Go公開發(fā)布之前我就開始關(guān)注它,當(dāng)它發(fā)布時(shí),我立即成為了它的粉絲和Google內(nèi)部的早期用戶。我喜歡它的簡(jiǎn)單性。T6M28資訊網(wǎng)——每日最新資訊28at.com

我在核心庫上做了一些工作,并且在社區(qū)中很活躍,早期經(jīng)常幫助go-nuts郵件列表中的用戶,并編寫開源庫。后來,我?guī)椭M織了西雅圖的Go Meetup[5],并與他人共同組織了備受喜愛的會(huì)議Go Northwest[6]。T6M28資訊網(wǎng)——每日最新資訊28at.com

據(jù)我所知,我在Google編寫了第一個(gè)生產(chǎn)關(guān)鍵型工具,后來又用Go編寫了第一個(gè)面向用戶的服務(wù)。T6M28資訊網(wǎng)——每日最新資訊28at.com

第一個(gè)是用于監(jiān)控Google+[7] Bigtable[8]服務(wù)器運(yùn)行狀況的服務(wù)。這是我作為SRE的工作之一。Bigtable擁有有關(guān)每個(gè)tablet性能的詳細(xì)內(nèi)部統(tǒng)計(jì)數(shù)據(jù),但有時(shí)我們需要了解為什么某個(gè)tablet如此過載以及系統(tǒng)其他地方發(fā)生了什么,以便我們能夠了解根本原因。我們需要隨著時(shí)間的推移收集這些數(shù)據(jù)并進(jìn)行分析。因此,我構(gòu)建了一個(gè)爬蟲,可以檢查數(shù)千臺(tái)服務(wù)器并在全局儀表板中顯示詳細(xì)的統(tǒng)計(jì)數(shù)據(jù)。T6M28資訊網(wǎng)——每日最新資訊28at.com

2011 年,Andrew Gerrand在接受The Register采訪[9]時(shí)提到了這項(xiàng)工作。他當(dāng)時(shí)向我證實(shí),這指的是我的項(xiàng)目。我很興奮!他在采訪中這樣說道:T6M28資訊網(wǎng)——每日最新資訊28at.com

谷歌有管理應(yīng)用程序和服務(wù)的人員,他們需要編寫工具來抓取幾千臺(tái)機(jī)器的狀態(tài)并聚合數(shù)據(jù),”他說。“以前,這些操作人員會(huì)用Python編寫這些內(nèi)容,但他們發(fā)現(xiàn)Go在性能和實(shí)際編寫代碼的時(shí)間方面要快得多。”T6M28資訊網(wǎng)——每日最新資訊28at.com

Go的運(yùn)行速度和編寫速度確實(shí)更快。最重要的是,使用起來很有趣。它讓我更有效率,所以我迷上了Go!T6M28資訊網(wǎng)——每日最新資訊28at.com

低級(jí)庫:節(jié)點(diǎn)身份驗(yàn)證和RPC

當(dāng)Go啟動(dòng)時(shí),它無法與Google的內(nèi)部基礎(chǔ)設(shè)施通信。T6M28資訊網(wǎng)——每日最新資訊28at.com

首先,團(tuán)隊(duì)必須構(gòu)建一個(gè)基于proto buffer的stubby RPC 系統(tǒng)[10]。這需要實(shí)現(xiàn)LOAS[11]來加密和驗(yàn)證與遠(yuǎn)程節(jié)點(diǎn)的通信,并使用Chubby[12] 進(jìn)行名稱解析(類似于kubernetes中使用的etcd[13])。T6M28資訊網(wǎng)——每日最新資訊28at.com

Stubby和Chubby是出了名的復(fù)雜。Stubby需要一個(gè)復(fù)雜的狀態(tài)機(jī)來管理連接,但大部分繁重的工作都是由Chubby完成的,即使Borg[14] 節(jié)點(diǎn)耗盡CPU,或者因?yàn)橛腥苏谶\(yùn)行map reduce而占用了所有機(jī)架的交換機(jī)帶寬而導(dǎo)致暫時(shí)的網(wǎng)絡(luò)斷開連接,Chubby也需要提供一致的world view,這很容易陷入死鎖或可靠性問題。T6M28資訊網(wǎng)——每日最新資訊28at.com

根據(jù)海勒姆定律[15],系統(tǒng)的所有可觀察行為都將取決于某人,因此團(tuán)隊(duì)必須確保與現(xiàn)有生產(chǎn)網(wǎng)絡(luò)預(yù)期的行為完全匹配,并注意極端情況。例如,眾所周知,健康檢查很容易出錯(cuò),不應(yīng)該太嚴(yán)格,否則當(dāng)網(wǎng)絡(luò)的一部分暫時(shí)過載或與另一部分?jǐn)嚅_連接時(shí),它們會(huì)為級(jí)聯(lián)故障敞開大門。必須實(shí)現(xiàn)的其他的分布式系統(tǒng)功能,例如backend subsetting和負(fù)載均衡。我們需要診斷何時(shí)出現(xiàn)問題,因此很早就添加了日志記錄和指標(biāo)庫。T6M28資訊網(wǎng)——每日最新資訊28at.com

為了找到要通信的host:port,服務(wù)使用Chubby進(jìn)行名稱解析(name resolution)。它作為少量數(shù)據(jù)的完全一致的存儲(chǔ)系統(tǒng),其最常用的功能是解析BNS[16] 地址 - 類似于你今天在kubernetes中使用etcd看到的功能。T6M28資訊網(wǎng)——每日最新資訊28at.com

系統(tǒng)使用Stubby協(xié)議向其他服務(wù)發(fā)送數(shù)據(jù)并從其他服務(wù)接收數(shù)據(jù)。在Stubby(如gRPC[17])中,消息使用proto buffer wire format進(jìn)行編碼。使用反射在運(yùn)行時(shí)創(chuàng)建proto buffer有效負(fù)載會(huì)太慢并且占用大量資源。工程師還會(huì)錯(cuò)過來自強(qiáng)類型系統(tǒng)的反饋。出于這些原因,谷歌為所有語言使用了生成代碼庫。幸運(yùn)的是,proto buffer與語言無關(guān)。團(tuán)隊(duì)只需為現(xiàn)有構(gòu)建系統(tǒng)邏輯編寫B(tài)laze[18] 擴(kuò)展,瞧,我們就為所有內(nèi)部RPC服務(wù)提供了高質(zhì)量的客戶端庫代碼。T6M28資訊網(wǎng)——每日最新資訊28at.com

奇怪的是,為另一種語言生成代碼會(huì)產(chǎn)生少量的增量構(gòu)建時(shí)間成本,而Google擁有成千上萬的RPC服務(wù)。因此,我們決定每個(gè)RPC服務(wù)的所有者必須選擇允許構(gòu)建系統(tǒng)為其特定服務(wù)生成Go代碼。雖然有點(diǎn)官僚主義,但隨著時(shí)間的推移,我們看到數(shù)千個(gè)CL(谷歌的等效Pull請(qǐng)求)飛來飛去,將Go添加到每個(gè)服務(wù)的生成代碼集中。這對(duì)于我們的社區(qū)來說是一個(gè)愚蠢但有趣的進(jìn)度衡量標(biāo)準(zhǔn),因?yàn)槲覀兛梢杂?jì)算代碼庫中“啟用 Go”標(biāo)志的實(shí)例數(shù)量。T6M28資訊網(wǎng)——每日最新資訊28at.com

影響全局Master選擇和Bigtable引流執(zhí)行

作為這些早期庫的早期采用者和專注于生產(chǎn)系統(tǒng)的工程師,我能夠了解內(nèi)部系統(tǒng)的工作原理。我?guī)椭{(diào)試并解決了許多奇怪的問題。隨著時(shí)間的推移,我獲得了構(gòu)建系統(tǒng)來自動(dòng)化運(yùn)維SRE工作的信心。注意到我們的服務(wù)中大多數(shù)面向用戶的中斷發(fā)生在存儲(chǔ)層(Bigtable 或 Colossus),我產(chǎn)生了創(chuàng)建一個(gè)控制系統(tǒng)的想法,該系統(tǒng)可以監(jiān)視Bigtable分區(qū)的運(yùn)行狀況,并在檢測(cè)到問題時(shí)在GSLB[19]中小心地清空它們。當(dāng)時(shí),當(dāng)發(fā)生中斷時(shí),SRE會(huì)進(jìn)行分頁,在確認(rèn)這是存儲(chǔ)問題后,他們會(huì)簡(jiǎn)單地清空集群并返回睡眠狀態(tài)。T6M28資訊網(wǎng)——每日最新資訊28at.com

我想用適當(dāng)?shù)目刂葡到y(tǒng)取代這個(gè)手動(dòng)whackamole。抽取流量可能會(huì)導(dǎo)致級(jí)聯(lián)故障,因此這是一項(xiàng)危險(xiǎn)的操作。當(dāng)時(shí),大多數(shù)SRE不想在自動(dòng)化系統(tǒng)中冒這種風(fēng)險(xiǎn)。幸運(yùn)的是,我有一個(gè)很好的團(tuán)隊(duì)。他們仔細(xì)審查了我的提案,提供了有關(guān)潛在故障模式的大量反饋,我們最終提出了一個(gè)我們有足夠信心的設(shè)計(jì)。我們需要仔細(xì)聚合來自不同監(jiān)控系統(tǒng)的信息(這可能會(huì)失敗或提供不正確的數(shù)據(jù)),使用全局負(fù)載均衡器安全地離開集群,然后最終在Buganizer[20] 中開具ticket,以便待命的SRE在工作期間進(jìn)行處理。T6M28資訊網(wǎng)——每日最新資訊28at.com

系統(tǒng)需要多個(gè)副本始終處于運(yùn)行狀態(tài)以對(duì)中斷做出反應(yīng),但一次只有一個(gè)副本保持活動(dòng)狀態(tài)至關(guān)重要。為了支持這一點(diǎn),我為Go編寫了一個(gè)全局“主選舉(master election)”庫,它將確保系統(tǒng)的單個(gè)副本一次處于活動(dòng)狀態(tài)。它使用全局Chubby鎖服務(wù)來提供一個(gè)高級(jí)庫來告訴應(yīng)用程序開始運(yùn)行或在無法證明我們持有“全局鎖”時(shí)自行關(guān)閉。T6M28資訊網(wǎng)——每日最新資訊28at.com

為了支持這項(xiàng)工作,我還到處編寫了一些小實(shí)用程序,并與Go團(tuán)隊(duì)合作修復(fù)錯(cuò)誤。我報(bào)告了我發(fā)現(xiàn)的問題,他們修復(fù)了這些問題。T6M28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)時(shí),Go團(tuán)隊(duì)的重點(diǎn)是外部用戶。他們所有的注意力都集中在發(fā)布Go 1.0上。這是一個(gè)資源很少的小團(tuán)隊(duì),但他們的“秘密武器”是他們是杰出的工程師,而且團(tuán)隊(duì)非常高效。不知何故,盡管針對(duì)內(nèi)部用戶的支持時(shí)間非常有限,但他們還是很好地完成了支持工作。內(nèi)部郵件列表非常活躍,谷歌員工大多在業(yè)余項(xiàng)目中使用Go,但Go團(tuán)隊(duì)采用了非常強(qiáng)大的內(nèi)部流程來使事情順利運(yùn)行。他們仔細(xì)審查了每個(gè)人的代碼,并幫助建立了強(qiáng)大的內(nèi)部代碼質(zhì)量文化。每當(dāng)他們發(fā)布新的Go候選版本時(shí),他們都會(huì)使用新版本重建所有內(nèi)部項(xiàng)目并重新運(yùn)行我們的測(cè)試以確保一切正常。他們總是以正確的方式做事。T6M28資訊網(wǎng)——每日最新資訊28at.com

生產(chǎn)中JID代理部署的最初洞察

幾個(gè)月后,我在Google用Go編寫了第一個(gè)面向用戶的服務(wù)。我所說的面向用戶的意思是,如果它停止工作,許多面向用戶的產(chǎn)品將停止工作。這是一個(gè)簡(jiǎn)單的RPC服務(wù),但所有Google消息服務(wù)都使用它。T6M28資訊網(wǎng)——每日最新資訊28at.com

該服務(wù)根據(jù)從另一個(gè)RPC服務(wù)獲取的內(nèi)部用戶ID將數(shù)據(jù)與[JID格式](https://en.wikipedia.org/wiki/JID_(Jabber "JID格式")) 相互轉(zhuǎn)換。該服務(wù)很簡(jiǎn)單,但規(guī)模很大,當(dāng)時(shí)每秒執(zhí)行數(shù)十萬個(gè)請(qǐng)求。它對(duì)于為Android、Hangouts和其他產(chǎn)品提供支持的Google消息服務(wù)核心至關(guān)重要。T6M28資訊網(wǎng)——每日最新資訊28at.com

這次遷移是Google Go的一個(gè)非常重要的測(cè)試平臺(tái)。重要的是,它為我們提供了一個(gè)令人難以置信的基礎(chǔ)來比較Go與其他生產(chǎn)語言(特別是 Java)的性能。該服務(wù)正在取代難以維護(hù)的基于Java的服務(wù)(不是因?yàn)镴ava,而是因?yàn)槠渌颍虼宋覀兪褂脤?shí)際生產(chǎn)流量同時(shí)運(yùn)行這兩個(gè)服務(wù),并密切比較它們的性能。T6M28資訊網(wǎng)——每日最新資訊28at.com

我們從第一個(gè)大規(guī)模實(shí)驗(yàn)中吸取了重要的教訓(xùn):Go使用比Java更多的CPU內(nèi)核來服務(wù)相同的流量,但垃圾收集(GC) 暫停非常短。作為一個(gè)努力減少GC暫停以改善面向用戶的服務(wù)的尾部延遲的SRE,這是非常有希望的。Go團(tuán)隊(duì)對(duì)這個(gè)結(jié)果很滿意,但他們并不感到驚訝:Go只是在做它設(shè)計(jì)的事情!T6M28資訊網(wǎng)——每日最新資訊28at.com

事實(shí)上,幾年后,當(dāng)SRE領(lǐng)導(dǎo)層正式審查Go的生產(chǎn)就緒情況[21]并要求Go團(tuán)隊(duì)確保Go具有良好的GC性能時(shí),我認(rèn)為這很大程度上只是形式上的。Go很早就證明了Go具有出色的GC性能,并且多年來它不斷變得更好。T6M28資訊網(wǎng)——每日最新資訊28at.com

遇到內(nèi)部庫缺失的情況

在早期,在Flywheel[22]之前,在dl.google.com[23] 服務(wù)之前,在Vitess[24]之前,Go被Google的大多數(shù)工程師忽視了。如果有人想向用戶交付產(chǎn)品,他們首先必須編寫基本構(gòu)建塊,讓他們連接到谷歌的其他服務(wù)。對(duì)于大多數(shù)人來說,這是不可能的。T6M28資訊網(wǎng)——每日最新資訊28at.com

鎖服務(wù)(chubby)和RPC系統(tǒng)(stubby)的底層庫相對(duì)較快地出現(xiàn)(同樣,Go團(tuán)隊(duì)非常優(yōu)秀),Google最重要的庫是與我們存儲(chǔ)系統(tǒng)的接口:Bigtable、 Megastore、Spanner、Colossus。如果你想讀取或?qū)懭霐?shù)據(jù),你基本上還不能使用Go。但是,慢慢地,Go團(tuán)隊(duì)(有時(shí)與核心基礎(chǔ)設(shè)施團(tuán)隊(duì)合作)開始應(yīng)對(duì)這一挑戰(zhàn)。T6M28資訊網(wǎng)——每日最新資訊28at.com

他們最終一一為Bigtable、Colossus甚至Spanner 創(chuàng)建了庫(不是Megastore,因?yàn)樗艽蟪潭壬鲜且粋€(gè)被Spanner 取代的庫)。這是一項(xiàng)重大成就。T6M28資訊網(wǎng)——每日最新資訊28at.com

Google的Go 使用量仍然有限,但我們的社區(qū)正在不斷壯大。我在Google開設(shè)了第一門官方的Go編程簡(jiǎn)介課程,并幫助位于蘇黎世的Google員工找到了可以使用Go進(jìn)行工作的有趣項(xiàng)目。大約在這個(gè)時(shí)候我終于獲得了Go的“可讀性”(譯者注:這似乎是Go團(tuán)隊(duì)對(duì)代碼review者資格的一種認(rèn)可),后來加入了Go可讀性團(tuán)隊(duì)。T6M28資訊網(wǎng)——每日最新資訊28at.com

需要站點(diǎn)可靠性工程師來指導(dǎo)應(yīng)用程序功能

Go中缺少的另一件事是與生產(chǎn)相關(guān)的功能,我們多年來了解到這些功能對(duì)于生產(chǎn)團(tuán)隊(duì)來說是必需的。也就是說,如果你想運(yùn)行大型系統(tǒng)而不需要一直處于運(yùn)維和救火模式。T6M28資訊網(wǎng)——每日最新資訊28at.com

每當(dāng)發(fā)生中斷并診斷根本原因時(shí),隨著時(shí)間的推移,我們會(huì)了解到系統(tǒng)中應(yīng)該改進(jìn)的弱點(diǎn)。目標(biāo)是減少停機(jī)和運(yùn)維開銷。很多時(shí)候,為了使系統(tǒng)更加可靠,我們必須對(duì)應(yīng)用程序運(yùn)行時(shí)進(jìn)行更改。我們很難理解我們需要觀察和控制系統(tǒng)以使其真正可靠的細(xì)節(jié)深度。T6M28資訊網(wǎng)——每日最新資訊28at.com

例如,我們需要確保,除了記錄傳入請(qǐng)求之外,應(yīng)用程序還應(yīng)該記錄有關(guān)該操作中涉及的傳出請(qǐng)求的詳細(xì)信息。這樣,我們就可以確定地指出,比如說,我們的“CallBob”服務(wù)在上午 11:34 變慢是因?yàn)椤癋indAddress”調(diào)用的延遲增加。當(dāng)我們操作大型系統(tǒng)時(shí),我們不能滿足于猜測(cè)工作和弱相關(guān)性。有太多的轉(zhuǎn)移注意力和根本原因查找工作需要處理。我們需要對(duì)原因有更高的確定性:我們希望看到失敗的特定請(qǐng)求確實(shí)經(jīng)歷了高延遲,并排除其他解釋(即:未觸發(fā)緩慢的 FindAddress 調(diào)用的傳入請(qǐng)求不應(yīng)失敗)。T6M28資訊網(wǎng)——每日最新資訊28at.com

同樣,多年來我們注意到SRE的大部分時(shí)間都花在團(tuán)隊(duì)之間的協(xié)調(diào)上,以確定一個(gè)服務(wù)每秒應(yīng)發(fā)送到另一個(gè)服務(wù)的確切連接數(shù)和請(qǐng)求數(shù),以及如何準(zhǔn)確建立這些連接。例如,如果多個(gè)服務(wù)想要連接到后端,我們希望清楚哪些節(jié)點(diǎn)正在連接到哪些其他節(jié)點(diǎn)。這稱為后端子集化(backend subsetting)。需要仔細(xì)調(diào)整,考慮整個(gè)系統(tǒng)的健康狀況,而不僅僅是一個(gè)節(jié)點(diǎn)或一對(duì)節(jié)點(diǎn)的健康狀況,而是整個(gè)網(wǎng)絡(luò)的健康狀況。太大的子集會(huì)導(dǎo)致資源占用過多,太小的子集會(huì)導(dǎo)致負(fù)載不平衡。因此,隨著時(shí)間的推移,SRE團(tuán)隊(duì)開始幫助維護(hù)用于與其服務(wù)通信的客戶端庫,以便他們可以檢測(cè)正在發(fā)生的情況,并保留對(duì)其他節(jié)點(diǎn)與其系統(tǒng)通信方式的一些控制。T6M28資訊網(wǎng)——每日最新資訊28at.com

揭開魔法:Go服務(wù)器工具包

SRE共同擁有客戶端庫的模型在實(shí)踐中運(yùn)行得非常好,隨著時(shí)間的推移,我們了解到向這些庫添加流量和負(fù)載管理是一個(gè)好主意。T6M28資訊網(wǎng)——每日最新資訊28at.com

  • 當(dāng)你的系統(tǒng)開始過載時(shí),你會(huì)如何處理傳入的RPC?
  • 你應(yīng)該將這些請(qǐng)求保留在隊(duì)列中,還是立即拒絕它們?
  • 你應(yīng)該使用哪些指標(biāo)來確定你的系統(tǒng)是否過載?
  • 當(dāng)系統(tǒng)的太多部分認(rèn)為它們過載時(shí),如何避免進(jìn)入級(jí)聯(lián)故障?

Alejo Forero Cuervo 在SRE書籍章節(jié)“處理過載”[25]中寫了一些經(jīng)驗(yàn)教訓(xùn),值得一讀。我們一一向庫中添加了謹(jǐn)慎的邏輯,以根據(jù)經(jīng)驗(yàn)和內(nèi)部傳感器自動(dòng)設(shè)置這些參數(shù)。T6M28資訊網(wǎng)——每日最新資訊28at.com

在《不斷發(fā)展的SRE參與模型[26]》中,我的前同事 Ashish Bhambhani和我的前老板Acacio Cruz解釋說,我們最終發(fā)展了SRE參與模型,以包括服務(wù)器框架(server framework)的工作和采用。該模型使SRE能夠直接影響系統(tǒng)在細(xì)微差別領(lǐng)域的行為,這得益于我們豐富的現(xiàn)場(chǎng)經(jīng)驗(yàn)。T6M28資訊網(wǎng)——每日最新資訊28at.com

我和我的SRE團(tuán)隊(duì)希望將這些功能引入Go,但它們對(duì)于Go團(tuán)隊(duì)來說太過奇特和專業(yè),無法處理。我設(shè)立了一個(gè)20%的項(xiàng)目(后來變成了一個(gè)全職項(xiàng)目),并招募了一群愿意做出貢獻(xiàn)的經(jīng)驗(yàn)豐富的工程師。我飛往紐約,會(huì)見了一位非常出色的Go團(tuán)隊(duì)成員,我們共同努力為Go中的“服務(wù)器框架”構(gòu)建了路線圖。T6M28資訊網(wǎng)——每日最新資訊28at.com

Go團(tuán)隊(duì)一開始不太愿意接受我們的方法。整個(gè)“框架”概念對(duì)他們來說有點(diǎn)危險(xiǎn)。這可能會(huì)成為一場(chǎng)宗教戰(zhàn)爭(zhēng),但Go團(tuán)隊(duì)花時(shí)間詳細(xì)解釋了他們擔(dān)心的原因。Sameer尤其具有一種不可思議的能力,能夠用技術(shù)術(shù)語反思和解釋為什么他認(rèn)為某件事以某種方式比另一種方式效果更好。T6M28資訊網(wǎng)——每日最新資訊28at.com

Sameer強(qiáng)烈認(rèn)為,Go不應(yīng)該有不一致的開發(fā)人員體驗(yàn),無論是內(nèi)部還是外部,無論是否有“框架”。如果Google有不同的方法來構(gòu)建Go應(yīng)用程序,那將對(duì)內(nèi)部Go社區(qū)造成損害。與他的擔(dān)憂一致,我們的20%人組成的烏合之眾團(tuán)隊(duì)竭盡全力確保我們的“框架”感覺更像是另一個(gè)庫,而不是一個(gè)框架,并且它不會(huì)為Go引入不同的編程模型。目標(biāo)是通過簡(jiǎn)單的庫導(dǎo)入來引入我們的可靠性功能。如果你使用我們的庫包裝你的Go HTTP或Stubby服務(wù)器,所有內(nèi)容在代碼中看起來都一樣,但你神奇地獲得了開箱即用的日志記錄、檢測(cè)、負(fù)載卸載、流量管理,甚至每請(qǐng)求級(jí)別的實(shí)驗(yàn)性支持。T6M28資訊網(wǎng)——每日最新資訊28at.com

為了創(chuàng)建這個(gè)讓服務(wù)變得更好的神奇庫,我們必須對(duì)Google的內(nèi)部RPC庫甚至構(gòu)建系統(tǒng)進(jìn)行重大更改 - 以使我們的框架團(tuán)隊(duì)能夠?yàn)镽PC系統(tǒng)創(chuàng)建任意“擴(kuò)展”,從而無需任何操作即可無縫運(yùn)行,并避免接收和發(fā)送請(qǐng)求時(shí)產(chǎn)生顯著的性能開銷。T6M28資訊網(wǎng)——每日最新資訊28at.com

結(jié)果是值得的。效果非常好。我們的項(xiàng)目使服務(wù)變得更容易管理,而無需強(qiáng)加與Go團(tuán)隊(duì)想要的不同的編程風(fēng)格。為了避免混淆,我們將其稱為服務(wù)器“工具包”,它成為在Google構(gòu)建生產(chǎn)就緒系統(tǒng)的正確方法。人們經(jīng)常在他們的LinkedIn個(gè)人資料中引用我們的內(nèi)部服務(wù)器框架:)。它被稱為Goa,不要與不相關(guān)的外部Goa 框架[27]混淆。以下是某人LinkedIn個(gè)人資料中的示例:T6M28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片T6M28資訊網(wǎng)——每日最新資訊28at.com

憑借其生產(chǎn)就緒功能,我們的Go工具包消除了Go內(nèi)部增長的主要障礙。工程師現(xiàn)在可以確信他們的Go項(xiàng)目的性能與舊的Java和C++項(xiàng)目一樣好,并且可調(diào)試。也就是說,增長還沒有完全發(fā)生。Go需要一個(gè)殺手級(jí)用例才能在Google流行起來。T6M28資訊網(wǎng)——每日最新資訊28at.com

Go在多個(gè)SRE團(tuán)隊(duì)中的采用

當(dāng)時(shí),我所在的SRE團(tuán)隊(duì)在Google具有特殊地位,即社交SRE團(tuán)隊(duì)。我們?cè)赟WE和SRE都有出色的工程師和出色的管理人員。所以我們能夠以正確的方式做事。一些SRE團(tuán)隊(duì)正在追尾救火,但我們有幸能夠正確地進(jìn)行工程設(shè)計(jì)。這創(chuàng)造了一個(gè)良性循環(huán),我們?cè)趩栴}變得嚴(yán)重之前不斷解決問題,這意味著我們有時(shí)間進(jìn)一步優(yōu)化運(yùn)維,等等。T6M28資訊網(wǎng)——每日最新資訊28at.com

結(jié)果,我們的SRE團(tuán)隊(duì)編寫了很多有用的代碼。像我的高級(jí)工程師同事一樣,我?guī)椭藗冋业揭龅氖虑椋虼宋規(guī)椭鷨?dòng)了許多早期的Go中與生產(chǎn)相關(guān)的工具。如果其中一個(gè)工具發(fā)現(xiàn)有問題,它會(huì)自動(dòng)、安全地從整個(gè)Bigtable集群中刪除流量。T6M28資訊網(wǎng)——每日最新資訊28at.com

還有其他與流量和負(fù)載管理相關(guān)的Java和C++項(xiàng)目,由其他高級(jí)工程師領(lǐng)導(dǎo)。這種創(chuàng)新環(huán)境吸引了人才,我們不斷取得良好的成果,因此我們的SRE團(tuán)隊(duì)不斷壯大。T6M28資訊網(wǎng)——每日最新資訊28at.com

我們的工程總監(jiān)Acacio Cruz[28](負(fù)責(zé)我們團(tuán)隊(duì)以及山景城的同事所發(fā)生的許多積極的事情)非常關(guān)注工程效率:我們是否將工程時(shí)間用于最有影響力的事情?他明白標(biāo)準(zhǔn)化可以提高效率,而且他看到我們的工程師很高興并且富有成效。他的想法是推動(dòng)Go成為我們團(tuán)隊(duì)中任何自動(dòng)化的首選工具。該建議是避免使用Python并使用Go來編寫生產(chǎn)工具。令我驚訝的是,我的隊(duì)友沒有人反對(duì)。這加速了Go在我們的社交SRE團(tuán)隊(duì)中的使用,很快我們區(qū)域之外的人們就注意到了。T6M28資訊網(wǎng)——每日最新資訊28at.com

核心庫、服務(wù)器框架、成功的生產(chǎn)工具和圍繞Go的社交SRE標(biāo)準(zhǔn)化——它們都促成了人們對(duì)Go正在成為Google的一種嚴(yán)肅語言的看法的改變。T6M28資訊網(wǎng)——每日最新資訊28at.com

與此同時(shí),SRE已經(jīng)看到了幾代用Python編寫的工具,這些工具運(yùn)行得非常好,但隨著時(shí)間的推移變得非常難以維護(hù)。Google SRE喜歡Python,我們編寫了大量的Python代碼。不幸的是,當(dāng)時(shí)缺乏類型和編譯時(shí)語法錯(cuò)誤檢查導(dǎo)致了許多難以修復(fù)的問題:T6M28資訊網(wǎng)——每日最新資訊28at.com

  • 當(dāng)你從事其他人啟動(dòng)的項(xiàng)目時(shí),該項(xiàng)目可能有也可能沒有良好的測(cè)試覆蓋率。為不是你編寫的代碼添加測(cè)試是很困難的。你并不真正知道正在使用什么以及如何使用。所以你最終會(huì)測(cè)試太多的東西或測(cè)試太少的東西。在生產(chǎn)關(guān)鍵型工具中,我們?cè)谶M(jìn)行更改時(shí)不能冒險(xiǎn)。
  • 當(dāng)時(shí),人們通常一會(huì)兒編寫代碼,一會(huì)兒運(yùn)行測(cè)試。如果你在運(yùn)行測(cè)試時(shí)才意識(shí)到有語法錯(cuò)誤,也許你已經(jīng)將上下文切換到執(zhí)行其他操作,所以現(xiàn)在你必須返回并修復(fù)它。這會(huì)浪費(fèi)時(shí)間并增加不確定性。

隨著越來越多的SRE開始用Go編寫自動(dòng)化,很明顯這些團(tuán)隊(duì)很高興并且富有成效,并且不太可能陷入難以維護(hù)的代碼中。人們開始意識(shí)到,Go項(xiàng)目更容易發(fā)展和維護(hù),而這不僅僅是這些項(xiàng)目更新、更干凈或設(shè)計(jì)得更好的結(jié)果。T6M28資訊網(wǎng)——每日最新資訊28at.com

SRE領(lǐng)導(dǎo)層注意到了這種影響,并決定采取行動(dòng)并在組織內(nèi)進(jìn)行廣泛的溝通:SRE團(tuán)隊(duì)最好使用Go進(jìn)行與生產(chǎn)相關(guān)的項(xiàng)目[29],并避免使用Python。我不知道這在谷歌現(xiàn)在是否被視為獨(dú)裁,但當(dāng)時(shí)我認(rèn)為這感覺像是整個(gè)組織范圍內(nèi)良好的溝通和決策。T6M28資訊網(wǎng)——每日最新資訊28at.com

Go生產(chǎn)平臺(tái)和爆炸式增長

此后事情進(jìn)展得很快。我們創(chuàng)建了一個(gè)從早期就對(duì)Go提供強(qiáng)大支持的生產(chǎn)平臺(tái),并用高級(jí)抽象取代了許多樣板配置和重復(fù)過程。該平臺(tái)出現(xiàn)了強(qiáng)勁增長,最終其他平臺(tái)也出現(xiàn)了。Go和我們的服務(wù)器框架變得無處不在。我最終離開了谷歌,但我仍然快樂地記得那些日子。T6M28資訊網(wǎng)——每日最新資訊28at.com

雖然我只是該語言的用戶,但觀看一個(gè)項(xiàng)目從零到成為前10名的編程語言的經(jīng)歷教會(huì)了我很多東西。我親眼看到,一個(gè)強(qiáng)大的團(tuán)隊(duì),周圍有一個(gè)強(qiáng)大的社區(qū),真的可以做出大事。T6M28資訊網(wǎng)——每日最新資訊28at.com

觀察Go的崛起

我在Google從事Go編程工作改變了游戲規(guī)則,讓我對(duì)項(xiàng)目的技術(shù)方面以及世界著名團(tuán)隊(duì)的運(yùn)作方式有了深入的了解。隨著項(xiàng)目的進(jìn)行,我可以清楚地看到Go如何使項(xiàng)目和團(tuán)隊(duì)擴(kuò)展變得更容易。T6M28資訊網(wǎng)——每日最新資訊28at.com

Go對(duì)簡(jiǎn)約設(shè)計(jì)的強(qiáng)調(diào)促進(jìn)了統(tǒng)一編碼,使新程序員可以輕松地集成到項(xiàng)目中,這一功能在時(shí)間緊迫的項(xiàng)目中特別有用。隨著項(xiàng)目的發(fā)展,新的庫和工具包也出現(xiàn)了,提高了它的受歡迎程度,并促進(jìn)了包括Apple、Facebook和Docker在內(nèi)的幾家大型科技公司的采用。T6M28資訊網(wǎng)——每日最新資訊28at.com

盡管Rust具有更為廣泛和豐富的功能特性,但Go在各個(gè)行業(yè)的廣泛接受表明,強(qiáng)大的軟件不一定需要復(fù)雜。T6M28資訊網(wǎng)——每日最新資訊28at.com

回顧過去,很明顯,雖然我們的旅程充滿了挑戰(zhàn),但每一次的曲折、每一次的調(diào)整和進(jìn)步,都是塑造今天Go的關(guān)鍵。隨著社區(qū)不斷向前發(fā)展,我很高興看到我們下一步的發(fā)展方向。T6M28資訊網(wǎng)——每日最新資訊28at.com

Go gopher由Renee French設(shè)計(jì),并根據(jù) Creative Commons 3.0 屬性許可證獲得許可。T6M28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-85698-0.html從零到生產(chǎn):Go在Google的歷程

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 為什么Java String哈希函數(shù)乘數(shù)為31?

下一篇: .NET配置文件大揭秘:輕松讀取JSON、XML、INI和環(huán)境變量

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 對(duì)標(biāo)蘋果的靈動(dòng)島 華為帶來實(shí)況窗功能

    繼蘋果的靈動(dòng)島之后,華為也在今天正式推出了“實(shí)況窗”功能。據(jù)今天鴻蒙OS 4.0的現(xiàn)場(chǎng)演示顯示,華為的實(shí)況窗可以更高效的展現(xiàn)出實(shí)時(shí)通知,比如鎖屏上就能看到外賣、打車、銀行
  • 7月安卓手機(jī)性價(jià)比榜:努比亞+紅魔兩款新機(jī)入榜

    7月登場(chǎng)的新機(jī)有努比亞Z50S Pro和紅魔8S Pro,除了三星之外目前唯二的兩款搭載超頻版驍龍8Gen2處理器的產(chǎn)品,而且努比亞和紅魔也一貫有著不錯(cuò)的性價(jià)比,所以在本次的性價(jià)比榜單
  • 6月安卓手機(jī)性能榜:vivo/iQOO霸占旗艦排行榜前三

    2023年上半年已經(jīng)正式過去了,我們也迎來了安兔兔V10版本,在新的驍龍8Gen3和天璣9300發(fā)布之前,性能榜的榜單大體會(huì)以驍龍8Gen2和天璣9200+為主,至于那顆3.36GHz的驍龍8Gen2領(lǐng)先
  • 十個(gè)可以手動(dòng)編寫的 JavaScript 數(shù)組 API

    JavaScript 中有很多API,使用得當(dāng),會(huì)很方便,省力不少。 你知道它的原理嗎? 今天這篇文章,我們將對(duì)它們進(jìn)行一次小總結(jié)。現(xiàn)在開始吧。1.forEach()forEach()用于遍歷數(shù)組接收一參
  • 十個(gè)簡(jiǎn)單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強(qiáng)大而靈活的功能,用于修改或增強(qiáng)函數(shù)或類的行為。裝飾器本質(zhì)上是一個(gè)函數(shù),它接受另一個(gè)函數(shù)或類作為參數(shù),并返回一個(gè)新的函數(shù)或類。它們通常用
  • 三言兩語說透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術(shù),可以幫助我們寫出更加優(yōu)雅、泛用的函數(shù)。本文將首先介紹柯里化和反柯里化的概念、實(shí)現(xiàn)原理和應(yīng)用
  • 慕巖炮轟抖音,百合網(wǎng)今何在?

    來源:價(jià)值研究所 作者:Hernanderz“難道就因?yàn)樽约旱囊粋€(gè)產(chǎn)品牛逼了,從客服到總裁,都不愿意正視自己產(chǎn)品和運(yùn)營上的問題,選擇逃避了嗎?”這一番話,出自百合網(wǎng)聯(lián)合創(chuàng)
  • 三星折疊屏手機(jī)去年銷售近1000萬臺(tái) 今年目標(biāo)定為1500萬

    7月29日消息,三星率先發(fā)力可折疊手機(jī)市場(chǎng),在全球市場(chǎng)已經(jīng)取得了非常亮眼的成績,接下來會(huì)進(jìn)一步鞏固和擴(kuò)大這一優(yōu)勢(shì)。三星在推出Galaxy Z Flip5和Galax
  • 回歸OPPO兩年,一加贏了銷量,輸了品牌

    成為OPPO旗下主打性能的先鋒品牌后,一加屢創(chuàng)佳績。今年618期間,一加手機(jī)全渠道銷量同比增長362%,憑借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
Top