GopherChina第一天小结
GopherChina第一天小結(jié)
2019-04-29 07:34 by 軒脈刃, ... 閱讀, ... 評論, 收藏, 編輯GopherChina第一天小結(jié)
今天參加了Asta舉辦的第五屆GopherChina,第一天參加完,頗有感受,晚上回來趁著還有記憶,來做一下記錄。
寫在前面
一早從9點(diǎn)開始,一天下來一共八個(gè)主題,各個(gè)主題都有自己的特色,全部聽下來也是挺不容易的。這些主題有大到說框架,也有小到說具體的某個(gè)包的使用的。
一早上真心起的比上班還早,早早就過去占了個(gè)位子。之前也參加過一些技術(shù)大會,最擔(dān)心的就是講師講說的主題變成某個(gè)公司的宣傳分享。我們聽眾大都懷著學(xué)習(xí)的心態(tài)來的,都希望能在技術(shù)大會上得到的是一些干貨,所謂干貨,就是經(jīng)驗(yàn)。就是說并不是你用Golang做了多牛逼的事情,而是你怎么用Golang做了多牛逼的事情,在做了多牛逼的事情的過程中有哪些經(jīng)驗(yàn)只談,哪怕只有一個(gè)經(jīng)驗(yàn)分享,能讓我們在實(shí)際工作中繞開這個(gè)坑,也或許就值回票價(jià)了。
大型微服務(wù)框架設(shè)計(jì)實(shí)踐
這個(gè)是我司滴滴歡總的分享。其實(shí)之前我在內(nèi)部已經(jīng)聽過一遍這個(gè)分享了,當(dāng)時(shí)聽完之后就對這個(gè)在我們外賣部門踐行下來的微服務(wù)框架的思想、實(shí)現(xiàn)都非常感興趣。還強(qiáng)烈建議其他公司的小伙伴一定要仔細(xì)聽歡總這個(gè)分享。今天第二次聽,PPT已經(jīng)較之前內(nèi)部分享的潤色不少,也做了一些公司業(yè)務(wù)的脫敏處理。不過整體聽完,讓我對業(yè)務(wù)框架的認(rèn)識又深了一層。
整個(gè)PPT大致是從框架開始說起,從框架的進(jìn)化史,說到框架的風(fēng)格(從配置->約定->DSL->容器化),從而引入“操作系統(tǒng)”的概念,表述說現(xiàn)在的服務(wù)框架,正越來越向操作系統(tǒng)的方向發(fā)展。我現(xiàn)在還記得今天杜歡在大會上表達(dá)的一些對框架的言論,比如業(yè)務(wù)框架應(yīng)該符合原則“Rule Of Lease Power”,即剛好夠用。好的框架需要屏蔽業(yè)務(wù)無關(guān)的通用技術(shù)細(xì)節(jié),讓一些不可靠的調(diào)用變得可靠起來。這些言論真是不能同意更多。框架和業(yè)務(wù)代碼的關(guān)系就是一個(gè)封閉開放的原則,框架需要把不想對業(yè)務(wù)代碼開放的部分給盡可能封裝掉,讓業(yè)務(wù)的思維負(fù)擔(dān)完全聚焦在具體的業(yè)務(wù)代碼中。
而后歡總就開始聊起了他親手寫的微服務(wù)框架的一些實(shí)現(xiàn)要點(diǎn)。這些要點(diǎn)雖然沒有具體的代碼展示,不過基本也把如何實(shí)現(xiàn)都說了一下。首先框架與業(yè)務(wù)正交,通過提供一系列工具鏈,能自動生成最初的項(xiàng)目模版,并通過代碼注入一些框架需要的代碼。這個(gè)是說的對于框架,完善的工具鏈?zhǔn)悄軠p輕很多業(yè)務(wù)的負(fù)擔(dān)的。其次,他的框架將所有底層實(shí)現(xiàn)都進(jìn)行了封裝,包括對mysql,redis,kafka等的封裝。其中還特意說了他的redis封裝,基本就是按照redis的command 文檔進(jìn)行了一輪封裝。還有,他提到的對http和rpc做劫持的工作,我覺得這個(gè)部分不是所有的業(yè)務(wù)框架設(shè)計(jì)者都能想到的,他包裝了http.Handler,也對thrift的序列化流程進(jìn)行了劫持,具體在劫持過程后,能有效的進(jìn)行context注入,請求回放,全鏈路壓測等工作。具體如何使用FSM實(shí)現(xiàn)thrift的protocol這塊就沒大聽懂了。接著,就是提供了跨服務(wù)邊界的context。這塊下午在b站毛總的分享里面也提到了,基本上跨服務(wù)的context控制是golang微服務(wù)框架的標(biāo)配了把。實(shí)現(xiàn)跨服務(wù)context之后,對TimeoutContext的使用就能做防雪崩的事情,每個(gè)服務(wù)調(diào)用都會自動計(jì)算超時(shí)時(shí)間,能有效防止雪崩效應(yīng)。
最終歡總很自豪的給我們展示了這個(gè)框架服務(wù)的業(yè)務(wù)收益。
從歡總這個(gè)分享中,基本能對Golang的微服務(wù)框架所必須的特性都會有了很好的了解了。
如何用Go打造高性能路徑規(guī)劃和ETA引擎
這個(gè)也是我今天很期待的一個(gè)topic之一。之前半年在路網(wǎng)的項(xiàng)目中也投入了不少精力。對路網(wǎng)的生產(chǎn),制造,使用流程都有了一些了解。其實(shí)我很想了解下Grab中路網(wǎng)在整個(gè)項(xiàng)目工程中的生產(chǎn)、服務(wù)、變更方面的東西。但是整個(gè)PPT聽下來,和我想聽到的描述方向還是有一些不同的。
胡泊描述的這個(gè)topic主要描述的是Grab地圖團(tuán)隊(duì)中使用Golang做了哪些事情。他們使用OSM做地圖數(shù)據(jù),通過軌跡數(shù)據(jù)和算法來補(bǔ)充OSM中缺失的路網(wǎng)數(shù)據(jù)。他們稱之為路網(wǎng)學(xué)習(xí)。然后軌跡數(shù)據(jù)和路網(wǎng)數(shù)據(jù)的mapmatch的匹配也是完全由golang實(shí)現(xiàn),具體實(shí)現(xiàn)使用的算法給我們展示了很復(fù)雜的算法PPT,完全聽懵了。在司機(jī)軌跡定位處理和提供路況服務(wù)工程這塊,花了好幾個(gè)PPT說了下Grab在軌跡處理這塊的一些優(yōu)化點(diǎn),比如對數(shù)據(jù)進(jìn)行壓縮,將數(shù)據(jù)存儲分離,創(chuàng)建緩存層,引入大數(shù)據(jù)spark streaming處理等。后續(xù)又展示了路徑規(guī)劃和ETA的算法邏輯。
這個(gè)主題整個(gè)聽下來只能用一臉懵逼來形容了。感覺聽了一個(gè)小時(shí)的算法和機(jī)器學(xué)習(xí)知識的課程。最后給的Go在GEO領(lǐng)域的一些開源的項(xiàng)目倒是一大亮點(diǎn),后續(xù)如果還有機(jī)會做路網(wǎng)相關(guān)的工作,可以研究一下這些項(xiàng)目。
TiDB的Golang實(shí)踐
早就聽聞TiDB的大名,也沒有機(jī)會在項(xiàng)目中實(shí)踐使用。這次的分享,整體聽下來對TiDB的一些架構(gòu)設(shè)計(jì)也有了一些模模糊糊的印象了。
首先姚維先介紹了下 TiDB的 SQL處理層的模型結(jié)構(gòu)。感覺和mysql的SQL解析層的邏輯一樣。主要是創(chuàng)建AST樹,對這個(gè)樹進(jìn)行語法驗(yàn)證等處理。
而后畫風(fēng)一轉(zhuǎn),聊到了分布式系統(tǒng)的測試,像TiDB這種ToB的產(chǎn)品對測試要求更是嚴(yán)格了,因?yàn)橐坏┍黄髽I(yè)使用,無法輕易進(jìn)行升級。分布式系統(tǒng)的Error可以出現(xiàn)在任何地方,軟件,硬件網(wǎng)絡(luò)等都有可能出現(xiàn)問題,所以如何模擬這些各種場景下的錯(cuò)誤是很重要的。姚維介紹了Pingcap內(nèi)部的一個(gè)Schrodinger平臺,薛定諤平臺。不過沒有很好展示一下這個(gè)平臺的使用和有點(diǎn)。而后就花了大篇幅描述了一下FailPoint的測試注入。
咋聽下,我沒有能立馬理解FailPoint的意思,模糊的理解到這個(gè)意思是以某種方式來模擬各種異常情況,比如panic,之類的錯(cuò)誤Mock的方式。后來回家之后又去網(wǎng)上查了查,TiKV 源碼解析(五)fail-rs 介紹大致說的也是這個(gè)意思。
聊完failpoint之后,姚維很干貨的分享了他們是如何測試代碼是否又goroutine泄漏的。原理說白了就很簡單,使用runtime.Stack在測試代碼運(yùn)行前后計(jì)算goroutine數(shù)量,當(dāng)然我理解測試代碼運(yùn)行完成之后是會觸發(fā)gc的。如果觸發(fā)gc之后,發(fā)現(xiàn)還有g(shù)oroutine沒有被回收,那么這個(gè)goroutine很有可能是被泄漏的。這招是我覺得從這個(gè)分享學(xué)到的最實(shí)用的一招之一。姚維能將一個(gè)看起來很不容易解決的問題用最直接的語言描述出來,我喜歡這樣的分享方式。
再后面,就說到了TiDB是如何使用Chunk結(jié)構(gòu)來存儲表數(shù)據(jù)的。基本上在我理解就是使用Apache Arrow的方式,將TiDB的內(nèi)容列式存儲到Chunk結(jié)構(gòu)中。同樣的,姚維對Chunk的描述,引入,演變過程都用最直接的語言描述的非常清楚。
Testing; how, what,why
這個(gè)Dave大神的一個(gè)分享,不過時(shí)間安排的不是很好,下午一點(diǎn),這是困點(diǎn)時(shí)間,再加上是英文闡述。我不得不承認(rèn),我在一個(gè)小時(shí)中間,大概打盹了半個(gè)小時(shí)。。。
Dave人很nice,貼心的把PPT的關(guān)鍵字都粗體。基本上Dave的整個(gè)Topic是在告訴大家如何進(jìn)行單元測試,如何看測試覆蓋率,測試的重要性,如何才是合理的測試用例。基本上他也是建議使用現(xiàn)在比較流行的數(shù)組測試,一個(gè)大數(shù)組中存儲不同的輸入,輸出,然后對這個(gè)大數(shù)組循環(huán)判斷輸入是否能產(chǎn)生期望輸出。
我打盹之前聽的內(nèi)容是如何寫單元測試,打盹之后聽到的內(nèi)容是測試是非常重要的。中間的部分,等PPT放出來的時(shí)候再具體看看把。
感覺Dave大神說的比較務(wù)實(shí),完全是站在工程師編寫代碼的角度來說如何寫測試用例,沒有日常聽到的架構(gòu)、設(shè)計(jì)等還是稍微有點(diǎn)感動。可能基本功才是體現(xiàn)工程師素養(yǎng)的地方把。
Go業(yè)務(wù)基礎(chǔ)庫之Error & Context
這個(gè)是B站毛劍的分享。毛總上臺之前,臺下響起了雷鳴般的掌聲,因?yàn)锽站由于泄漏事件正處在焦點(diǎn)。毛總上臺第一句話希望大家提問緩解不要問一些不合適的問題。。。全場笑然。
毛總的干貨還是很多的,他的主題也是很踏實(shí)的,也是從業(yè)務(wù)框架的角度來說,B站是如何處理Error和Context的。
關(guān)于Error,首先是使用WithStack保存堆棧信息,以方便查找根因。并且詳細(xì)告訴我們B站的大倉庫是如何處理error的規(guī)則的。基本上聽下來,就是對所有調(diào)用第三方的服務(wù)的錯(cuò)誤都需要第一時(shí)間對error進(jìn)行wrap,對于go-common庫之前的error,統(tǒng)一在go-commmon層進(jìn)行wrap處理。而后,再三告訴大家他在錯(cuò)誤處理方面的一些最佳實(shí)踐。包括何時(shí)打錯(cuò)誤日志,何時(shí)直接透傳,如何集中處理并發(fā)goroutine的錯(cuò)誤,如何規(guī)劃錯(cuò)誤代碼和錯(cuò)誤信息等。整體聽下來,毛總的這些建議,恐怕需要是從架構(gòu)師視角才能得出來的干貨。
關(guān)于Context,其實(shí)是在業(yè)界討論非常多的了。總結(jié)下來,毛總對Context的觀點(diǎn)有幾個(gè),首先強(qiáng)烈建議顯示傳遞,即函數(shù)第一個(gè)參數(shù)為context。其次,強(qiáng)烈建議context覆蓋全業(yè)務(wù),包括日志,mysql,緩存等。再次,context的超時(shí)控制需要在流量入口處設(shè)置,并且越早設(shè)置越好,甚至說到了如果能提早到LSB路由分發(fā)之前設(shè)置會更好。還有,Context中存儲的元數(shù)據(jù)都需要有哪些,包括調(diào)用者,調(diào)用地址,traceid等信息。在goroutine中如何傳遞context等都是很好的B站實(shí)踐總結(jié)。
最終總結(jié)了下業(yè)務(wù)基礎(chǔ)庫的思考。
干貨滿滿,問答環(huán)節(jié)也沒人不識相的提起一些不合適的問題。這一part愉快結(jié)束。
Go同步和并發(fā)設(shè)計(jì)模型
這場嚴(yán)重超時(shí),基本上講了一個(gè)小時(shí)多時(shí)間。主要是做了一下Golang中鎖、并發(fā)處理、內(nèi)存模型的梳理。雖然講的很細(xì),不過我個(gè)人并不喜歡這樣的梳理描述。一個(gè)是比較冗長,另外一個(gè)是沒有結(jié)合具體的業(yè)務(wù)場景來說,光總結(jié)還是有點(diǎn)虛了。
這個(gè)topic一共五個(gè)話題,基本同步原語,擴(kuò)展同步原語,原子操作,channel,內(nèi)存模型。基本就是把mutex,RWmutex,Cond,channel等并發(fā)相關(guān)的結(jié)構(gòu)都梳理了一遍。
到最后已經(jīng)沒有很仔細(xì)聽了,總體感覺有點(diǎn)尷尬。
百度App Go語言實(shí)戰(zhàn)
這個(gè)topic其實(shí)更像是百度效能平臺的介紹。
首先百度對內(nèi)部項(xiàng)目都會有一個(gè)工程能力評估圖,對代碼規(guī)范、測試、上線等流程都有自己的評估標(biāo)準(zhǔn)。其次介紹了一下百度內(nèi)部對開發(fā)規(guī)范,開發(fā)工具,代碼規(guī)范的介紹。比較有干貨的是介紹了一下在實(shí)現(xiàn)開發(fā)框架server遇到的點(diǎn),比如創(chuàng)建了一個(gè)goroutine池來控制goroutine的數(shù)量。server端出現(xiàn)TIME_WAIT過多問題的處理。而后介紹了一下百度的構(gòu)建體系,如何自建鏡像等。具體的實(shí)現(xiàn)邏輯沒有細(xì)想,不過感覺百度內(nèi)部為了保證golang的代碼交付質(zhì)量,做了很多工作。最后還介紹了百度的代碼檢查工具,基本上也是使用AST解析代碼,并和規(guī)則匹配來檢查的。
用Golang搭建實(shí)時(shí)音視頻云
這個(gè)是最后一個(gè)主題,由于前面的延遲,時(shí)間已經(jīng)比較玩了,基本上會場上人數(shù)較少了一半多了。
具體的內(nèi)容我也已經(jīng)沒有很高的注意力聽了,基本上是聊的golang在WebRTC協(xié)議的服務(wù)端實(shí)現(xiàn)。上來先是例行解釋下為何技術(shù)選型使用golang,而后對WEBRTC的協(xié)議進(jìn)行了說明,接著大致說了一下他們實(shí)現(xiàn)的具體架構(gòu),和他們遇到的問題。
比較有印象是他們遇到的問題。他們整個(gè)團(tuán)隊(duì)是之前各種語系的人都有,于是出現(xiàn)各種錯(cuò)誤,比如阻塞for循環(huán)select的問題,比如日期格式化的問題。比如依賴庫版本問題。整體聽下來感覺他們的CR還是需要加強(qiáng),可能百度的那套Code的檢測機(jī)制就很合適。
不過整體聽下來開闊了一下視野。
總結(jié)
其實(shí)一天若干個(gè)話題聽下來,能記住的寥寥,但是晚上寫這篇文章的時(shí)候,還能在頭腦中浮現(xiàn)的,就是已經(jīng)記在心里的干貨了。
明天繼續(xù)早起。
總結(jié)
以上是生活随笔為你收集整理的GopherChina第一天小结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: The request was reje
- 下一篇: 面向初学者的高阶组件介绍