2016年9月22日-23日,由CSDN重磅打造的SDCC 2016大數(shù)據(jù)技術(shù)&架構(gòu)實(shí)戰(zhàn)峰會(huì)(杭州站)將在杭州舉行。大會(huì)前夕,百度網(wǎng)頁搜索架構(gòu)部架構(gòu)師鄭然接受了CSDN專訪,談及了對(duì)架構(gòu)的理解、SOFA(Service Oriented Flyweight Architecture)的前世今生,以及技術(shù)人提升之道。 百度網(wǎng)頁搜索架構(gòu)部架構(gòu)師 鄭然
鄭然于2009年加入百度網(wǎng)頁搜索部,在百度網(wǎng)頁搜索部工作的7年時(shí)間里,一直從事百度搜索引擎的架構(gòu)研發(fā)工作,先后負(fù)責(zé)過百度搜索引擎的大規(guī)模索引構(gòu)建工作,大數(shù)據(jù)離線平臺(tái)架構(gòu)工作。近幾年來一直從事著大規(guī)模服務(wù)治理相關(guān)工作,包括支撐大規(guī)模服務(wù)變更的PaaS系統(tǒng),保障百度搜索引擎99。995%可靠性的高可用架構(gòu)和中間件,以及百度搜索引擎容量規(guī)劃和評(píng)估等。 專訪正文 CSDN:請(qǐng)先和大家介紹下您和目前所從事的工作,以及關(guān)注哪些技術(shù)領(lǐng)域? 鄭然:我自從2009年加入百度以來,一直在網(wǎng)頁搜索部從事搜索引擎架構(gòu)相關(guān)的工作。 從最開始的大規(guī)模分布式索引建庫系統(tǒng)到離線泛建庫大數(shù)據(jù)分析架構(gòu)相關(guān)的工作。近幾年一直從事大規(guī)模服務(wù)治理技術(shù)的研發(fā)工作,設(shè)計(jì)并實(shí)施了輕量級(jí)的接口化和組件化的微服務(wù)開發(fā)平臺(tái)SOFA;帶領(lǐng)團(tuán)隊(duì)對(duì)支撐百度搜索引擎海量服務(wù)部署和變更的PaaS平臺(tái)——Eden進(jìn)行了一系列重構(gòu)和優(yōu)化(日前在業(yè)內(nèi)技術(shù)大會(huì)上分享過Eden,Slides參見:《Eden – 百度搜索系統(tǒng)的PaaS架構(gòu)設(shè)計(jì)和實(shí)踐》);現(xiàn)階段,我們把服務(wù)治理拆分成效率提升,高可用架構(gòu)和容量?jī)?yōu)化三個(gè)大方向,系統(tǒng)化的解決服務(wù)治理面臨的問題,構(gòu)建搜索引擎的私有云平臺(tái)。 我個(gè)人對(duì)于高可用架構(gòu)、云計(jì)算、容器和微服務(wù)、服務(wù)治理、DevOps等技術(shù)領(lǐng)域非常感興趣,也希望和大家進(jìn)一步交流。 CSDN::作為一名資深架構(gòu)師,能否談下您對(duì)架構(gòu)的理解? 鄭然:這個(gè)問題有點(diǎn)大,我理解架構(gòu)的本質(zhì)是為了業(yè)務(wù)服務(wù)的,解決不了業(yè)務(wù)問題的架構(gòu)毫無用處。但是往往業(yè)務(wù)問題是復(fù)雜的,同時(shí)已有架構(gòu)和系統(tǒng)都會(huì)或多或少的存在技術(shù)債務(wù)(我猜大多數(shù)情況下技術(shù)債務(wù)還不少)。所以我覺得對(duì)于一個(gè)架構(gòu)師來說,選擇正確的時(shí)間,使用正確的技術(shù),選擇解決哪些問題,最終能給業(yè)務(wù)帶來什么價(jià)值,是需要經(jīng)過深思熟慮的。一方面要能滿足業(yè)務(wù)需求,解決業(yè)務(wù)問題,另一方面又要償還技術(shù)債務(wù),讓系統(tǒng)向著理想目標(biāo)前進(jìn),這其實(shí)需要很多折中和權(quán)衡,即使在架構(gòu)設(shè)計(jì)過程中也往往是一個(gè)折中的過程。不過恰巧是這一點(diǎn),讓我覺得這正是吸引我一直從事架構(gòu)相關(guān)工作的原因。 CSDN:有人覺得架構(gòu)師是個(gè)很高大上的職業(yè),您覺得作為一名架構(gòu)師,需要具備哪些能力? 鄭然:我一直工作在一線,從“硬件”和“軟件”兩方面談:
CSDN:您在百度網(wǎng)頁搜索部工作了7年,能夠分享下近年來百度搜索引擎的挑戰(zhàn)? 鄭然:百度搜索引擎其實(shí)一直在不斷更新,只不過可能每天只提升一點(diǎn)點(diǎn),影響一小部分query,大家感受不那么明顯,是一個(gè)從量變到質(zhì)變的過程。百度一直以“讓人們最平等便捷的獲取信息,找到所求”為使命,隨著移動(dòng)互聯(lián)網(wǎng)的發(fā)展以及信息量的不斷膨脹,用戶找到信息的難度更大了。所以從2016年開始百度正在從多個(gè)維度全面打造“新搜索”,讓搜索結(jié)果多樣化全方位的滿足用戶請(qǐng)求,同時(shí)不斷完善內(nèi)容生態(tài),促進(jìn)優(yōu)質(zhì)內(nèi)容在百度全平臺(tái)的承載。這就意味著百度搜索引擎的算法復(fù)雜度和數(shù)據(jù)計(jì)算存儲(chǔ)量的大幅提升,給搜索引擎的算法和架構(gòu)帶來了巨大的挑戰(zhàn)。 CSDN:這次在SDCC 2016(杭州)架構(gòu)峰會(huì)上,您主要分享SOFA(Service Oriented Flyweight Architecture)這一輕量級(jí)的面向服務(wù)的開發(fā)框架,可否介紹下SOFA的前世今生? 鄭然:先澄清一下, sofa-pbrpc和我要分享的SOFA是完全不同的。以我們的反作弊服務(wù)為例,反作弊服務(wù)需要根據(jù)網(wǎng)頁的HTML計(jì)算和解析出上千個(gè)特征,然后在經(jīng)過幾百個(gè)策略,最后得出反作弊的結(jié)果。這上千個(gè)特征存在錯(cuò)綜復(fù)雜的依賴關(guān)系,策略與策略之間也存在著嚴(yán)格的順序要求。隨著算法的越發(fā)復(fù)雜,有些特征或者策略的計(jì)算需要消耗的資源會(huì)越來越大, 這時(shí)候大家想到的辦法一定是對(duì)服務(wù)進(jìn)行拆分了。如果沒有SOFA,這樣的拆分過程相當(dāng)于做一次重構(gòu)的工作量,而且對(duì)反作弊效果來說是沒有正向收益的,做算法的同學(xué)最不愿意做這種事情。所以能否靈活的進(jìn)行拆分,就是提升研發(fā)效果的關(guān)鍵了。使用SOFA技術(shù)以后,修改幾行配置就可以實(shí)現(xiàn)拆分了;另外反作弊服務(wù)中有些特征和策略的計(jì)算邏輯,可能其他服務(wù)或者產(chǎn)品線也同樣需求,比如切詞,提取title、content、anchor等,那么如果能非常方便的實(shí)現(xiàn)代碼共享,也勢(shì)必大幅提升研發(fā)效率。所以在這種情形下,我們?cè)O(shè)計(jì)和實(shí)現(xiàn)了SOFA這一接口化和組件化的開發(fā)平臺(tái)。 在2013年SOFA完成的第一個(gè)版本中,我們已經(jīng)實(shí)現(xiàn)了RPC的功能并且性能十分優(yōu)異,考慮到當(dāng)時(shí)距離SOFA成型還有相對(duì)較長(zhǎng)的時(shí)間,同時(shí)部門內(nèi)一些偏向基礎(chǔ)架構(gòu)的系統(tǒng)(比如百度開源的tera分布式表格系統(tǒng))僅僅有RPC的需求,所以我們把SOFA中RPC的代碼剝離出來,適配了protobuf,于是乎就有了sofa-pbrpc這個(gè)項(xiàng)目了。 可以說RPC只是SOFA的冰山一角, 我希望通過本次SDCC的分享,給大家揭秘整個(gè)SOFA平臺(tái)。不過由于SOFA依賴了一些公司的庫以及人力問題,還沒有開源出來,但是我個(gè)人認(rèn)為整個(gè)SOFA的設(shè)計(jì)思想還是非常先進(jìn)的,所以決定在本次SDCC上為大家介紹SOFA,希望能給大家?guī)硪稽c(diǎn)點(diǎn)啟發(fā)。 CSDN:SOFA目前有哪些最佳實(shí)踐? 鄭然:SOFA自身具備接口化和RPC的能力,所以適用于所有應(yīng)用RPC的場(chǎng)合。同時(shí)得益于SOFA接口化和組件化的設(shè)計(jì)思想,更適合于構(gòu)建帶有復(fù)雜業(yè)務(wù)邏輯的服務(wù)模塊。不知道大家有沒有遇到過這樣的場(chǎng)景,比如我想使用切詞功能,于是我從公司的代碼庫中反復(fù)搜索,終于找到了代碼路徑。Checkout下來之后,首先閱讀頭文件,看過復(fù)雜的結(jié)構(gòu)體聲明和函數(shù)定義以后,準(zhǔn)備寫一個(gè)demo程序做實(shí)驗(yàn)。代碼寫完編譯好之后,發(fā)現(xiàn)缺少切詞詞典,于是乎從公司的wiki上反復(fù)搜索,終于找到對(duì)應(yīng)的接口RD,我們從一個(gè)FTP地址下載了切詞詞典。然后運(yùn)行demo,詞典加載失敗,聯(lián)系接口RD發(fā)現(xiàn)詞典版本和代碼版本不匹配,于是重新下載對(duì)應(yīng)版本的切詞詞典,終于demo運(yùn)行通過了。下一步當(dāng)然是把切詞的邏輯添加到線上的模塊了。代碼寫完并且添加好編譯依賴之后,發(fā)現(xiàn)編譯不通過,原來切詞庫依賴的一個(gè)庫和當(dāng)前模塊沖突了,打平之后發(fā)現(xiàn)當(dāng)前開發(fā)的模塊又編譯不通過了……這時(shí)候如果運(yùn)氣好的話,經(jīng)過反復(fù)實(shí)驗(yàn),可以找到一個(gè)編譯通過的版本; 運(yùn)氣不好的話,那只能修改相應(yīng)的代碼了,真是一如好悶深似海啊! 燒香拜佛之后,終于編譯通過了,運(yùn)行之后程序如果core了,這還算好的,如果運(yùn)行之后得出的結(jié)果不對(duì), 那才叫一個(gè)叫天天不應(yīng)叫地地不靈呢。 遺憾的是,我們的搜索服務(wù)中存在很多這樣的模塊。我們的反作弊服務(wù)和頁面解析服務(wù)都是包含復(fù)雜的特征提取和算法模塊,這些模塊隨著算法復(fù)雜度的提升,需要的CPU和內(nèi)存會(huì)不斷提升。如果說編譯依賴沖突的問題還可以通過一些艱苦卓絕的工作解決,那么資源需求達(dá)到一定程度之后,就必須進(jìn)行服務(wù)拆分了。沒有使用SOFA之前,這樣的拆分是非常復(fù)雜的,不僅僅研發(fā)周期長(zhǎng),對(duì)服務(wù)的效果又起不到提升的作用研發(fā)過程需要反復(fù)的測(cè)試功能和效果的評(píng)估,給算法的研發(fā)同學(xué)帶來的極大的痛苦。SOFA的接口化和組件化的設(shè)計(jì)思想,可以大大簡(jiǎn)化上述過程。組件的符號(hào)隔離機(jī)制,確保組件之間不同版本的庫并存; 接口化和組件化的能力使得我們僅僅通過修改配置,就可以完成服務(wù)拆分工作; 而且不同的組件可以采用不同的編程語言, 進(jìn)一步加速組件的研發(fā)效率。SOFA上線以后, 先后支持了公司包括網(wǎng)頁搜索,自然語言處理,深度學(xué)習(xí)研究院,機(jī)器翻譯等十幾個(gè)的產(chǎn)品線,構(gòu)建了上百個(gè)服務(wù),使用SOFA的研發(fā)人員接近200人。 CSDN:微服務(wù)目前受到廣大互聯(lián)網(wǎng)公司的熱捧,您如何評(píng)價(jià)這一現(xiàn)象? 鄭然:可能很多朋友看到微服務(wù)帶來的可擴(kuò)展、松耦合、研發(fā)和迭代效率提升等優(yōu)點(diǎn), 都有蠢蠢欲動(dòng)的感覺。微服務(wù)背后隱藏著一座冰山,我們看到的往往是浮出水面的華麗的部分,而水下作為微服務(wù)的底座,需要包含日志的匯總和分析、服務(wù)注冊(cè)和發(fā)現(xiàn)、部署和升級(jí)、資源管理、CI/CD流水線、服務(wù)依賴關(guān)系管理、調(diào)用鏈跟蹤框架、灰度發(fā)布、藍(lán)綠部署、容量評(píng)估和規(guī)劃等技術(shù),如果公司對(duì)這些基礎(chǔ)設(shè)施缺乏積累,那么引入微服務(wù)架構(gòu)我覺得會(huì)是一場(chǎng)噩夢(mèng)。當(dāng)然這些基礎(chǔ)設(shè)施的發(fā)展也很迅速,開源社區(qū)也非常活躍,大大降低了建設(shè)這些基礎(chǔ)設(shè)施的門檻。 CSDN:您作為技術(shù)人員,擅長(zhǎng)太多,包括:流式索引構(gòu)建系統(tǒng)&離線計(jì)算平臺(tái)架構(gòu)&PaaS&服務(wù)治理&高可用架構(gòu)&DevOps等,可否分享下您學(xué)習(xí)新知識(shí)或技能的方法?以及在日常生活中你是通過哪些方式來提升個(gè)人技能的? 鄭然:對(duì)于我來說,我特別享受學(xué)習(xí)的過程。我一直堅(jiān)持每天7:30到公司,吃過早飯之后讀一個(gè)小時(shí)的早報(bào)。早報(bào)的內(nèi)容大部分是來自各個(gè)微信公眾號(hào)和自媒體,把其中認(rèn)為好的文章記錄下來,這樣組織了一個(gè)《分布式技術(shù)一周技術(shù)動(dòng)態(tài)》的小專欄,每周為大家推送。 這個(gè)小專欄持續(xù)了一年半了,總共推送了上千篇技術(shù)文章,我個(gè)人的知識(shí)面也得到了很大的擴(kuò)展。我也一直堅(jiān)持組織團(tuán)隊(duì)和部門的技術(shù)分享會(huì),我一個(gè)人的力量畢竟是有限的,我希望所有人都養(yǎng)成學(xué)習(xí)的習(xí)慣,當(dāng)然我也可以從大家的分享中更快速的獲取知識(shí)。 不過如果需要系統(tǒng)的學(xué)習(xí),還是需要看書的,公司提供了圖書館制度,每個(gè)人每個(gè)季度都有一定的額度購買圖書。 我的日常工作主要包括系統(tǒng)設(shè)計(jì)方案評(píng)審,項(xiàng)目過程中疑難問題的解決,需求和方案的討論, code review。我喜歡編碼,如果一段時(shí)間不寫代碼,就感覺心里不踏實(shí),我的代碼量在部門內(nèi)排名還是比較靠前的。除此之外,我還需要給自己預(yù)留學(xué)習(xí)和思考的時(shí)間,這里的學(xué)習(xí)不是像讀早報(bào)那樣泛泛的學(xué)習(xí),需要一定的系統(tǒng)學(xué)習(xí),比如讀一本書,學(xué)習(xí)一個(gè)開源或者公司內(nèi)部的系統(tǒng),學(xué)習(xí)設(shè)計(jì)方案等。思考的時(shí)間也特別重要,我需要保證我做出的技術(shù)決策大部分是對(duì)的,我需要保證整體技術(shù)方向不會(huì)出現(xiàn)偏差,我需要保證每個(gè)同學(xué)都有足夠的成長(zhǎng)空間, 這些都需要深入思考。 |
|