专访阿里王贤:我所理解的网站架构
?
王賢(花名賢哥),淘寶技術(shù)部技術(shù)專家,在分布式系統(tǒng)架構(gòu)設(shè)計、高并發(fā)系統(tǒng)設(shè)計、系統(tǒng)穩(wěn)定性保障等領(lǐng)域積累了較為豐富的實踐經(jīng)驗,對新技術(shù)有濃厚的興趣。
請先和大家介紹下你和目前所從事的工作,以及關(guān)注哪些技術(shù)領(lǐng)域?
賢哥:目前在負(fù)責(zé)某直播平臺,包括整體的技術(shù)架構(gòu)以及業(yè)務(wù)推廣,平臺旨在提供直播的一站式解決方案,涵蓋了大型音視頻直播、超大直播間中的聊天、彈幕、PPT教學(xué)、主播打賞等業(yè)務(wù)功能模塊。大型直播是一個非常有挑戰(zhàn)的業(yè)務(wù)場景,不僅僅需要解決音視頻的編解碼、切片、分發(fā)、穩(wěn)定性及播放質(zhì)量監(jiān)控的所帶來的一系列問題,還需要解決超高并發(fā)場景下消息發(fā)送、信令、心跳等問題,以及對于各種UGC內(nèi)容的過濾(圖像、文字)、多端的兼容、數(shù)字版權(quán)保護等等。
由于之前工作的原因,了解和接觸到的東西比較雜,在做云手機商城時,由于是異構(gòu)的系統(tǒng),需要跨平臺部署,去研究過異構(gòu)SOA架構(gòu)下的應(yīng)用通信、路由、部署、升級、遷移,到了淘寶之后,發(fā)現(xiàn)淘寶對于各種場景都有相對應(yīng)的中間件,花了很多的精力去熟悉分布式場景下各種中間件的工作原理及使用場景,以便提高系統(tǒng)架構(gòu)的可靠性降及低工作量,在店鋪那邊呆了幾個月,了解到一個復(fù)雜建站系統(tǒng)是如何工作的,頁面如何模塊化,如何渲染,如何通過靜態(tài)化提升性能,后面又做支付寶卡寶,由于那時候數(shù)據(jù)分析平臺還沒有現(xiàn)在這么成熟,為了看到系統(tǒng)的運行狀態(tài)及業(yè)務(wù)數(shù)據(jù),去研究了數(shù)據(jù)在線及離線分析,由于那時候頁面是放在支付寶客戶端首屏,對系統(tǒng)可靠性要求很高,又去看系統(tǒng)穩(wěn)定性保障的各種原理、技術(shù)、工具,很多時候都是需求驅(qū)動自己去學(xué)習(xí)新知識,這樣學(xué)了之后也能夠馬上用上,遇到一項新技術(shù)后,會先去了解一下它是做什么的,適合什么場景,等有具體的業(yè)務(wù)場景之后,再去深入學(xué)習(xí)。目前關(guān)注的主要有這么幾個領(lǐng)域,包括音視頻領(lǐng)域的技術(shù)發(fā)展及技術(shù)架構(gòu)(如數(shù)字版權(quán)保護、編解碼及視頻協(xié)議、點對點通信),高性能的WEB端雙工通信(通信協(xié)議性能),音視頻應(yīng)用的可靠性監(jiān)控。
能夠談下你是走上技術(shù)這條路的?
賢哥:大學(xué)學(xué)的計算機專業(yè),后又因各種機緣巧合到了淘寶,個人本身對于技術(shù)非常有興趣,享受通過實踐所帶來的成就感、滿足感,因此實際上是很自然而然的就選擇了這一行,作為碼農(nóng)的樂趣在于,可以通過一行行代碼,表達自己對于這個世界的理解。當(dāng)然,最主要的原因還是個人興趣,喜歡各種折騰。
畢業(yè)至今你都是一直在阿里,是因為技術(shù)文化還是其它的原因讓你有這樣的堅守?以及談?wù)劗厴I(yè)這些年來在工作中的收獲和體驗。
賢哥:阿里面臨著整個中國電商行業(yè)甚至是全球電商行業(yè)的最大的挑戰(zhàn),無論是從業(yè)務(wù)規(guī)模,還是用戶規(guī)模來看,都與其他競爭對手拉開了數(shù)量級的差距,這背后實際上是成千上萬的碼農(nóng)在默默支持,它能夠提供其他地方無法提供的場景和挑戰(zhàn),這或許是堅持下來的最大原因吧。能夠加入阿里工作的同事,必然是在某個領(lǐng)域有一技之長的,因此,跟每一個同事的合作過程,實際上也是學(xué)習(xí)的過程,成天與這些行業(yè)專家們打成一片,自己看待問題的眼光也會越來越全面,越來越成熟,收獲并不僅僅是從技術(shù)上,還有思考問題的方式,人生觀世界觀都有很大的變化和成長,大公司能夠聚集人才,并提供很多學(xué)習(xí)的機會和交流的氛圍,也鼓勵分享經(jīng)驗和個人積累,長此以往的這種氛圍的熏陶,也讓人受益匪淺。
在阿里做過的項目非常多,給你印象最深或收獲最大的是?為什么?
賢哥:實際上也經(jīng)歷過很多階段,不同的階段,不同的角色,可能體會不盡相同,感悟也不大一樣,從一開始的看的多、做的多,到后來的想的多、設(shè)計的多,每個階段關(guān)注的點不同,從具體技術(shù)細節(jié)難點的攻關(guān),到整體方案的把控、風(fēng)險控制,不同的階段,感受可能也會有所不同。印象比較深的可能有這么幾件事吧,記得有幾次,夜里一兩點鐘的樣子收到報警短信,系統(tǒng)掛了,然后吭哧吭哧爬起來找問題,各種翻日志翻代碼,找到問題之后需要和對應(yīng)的PE同學(xué)一起解決,打電話過去人家早就睡了,也是吭哧吭哧爬起來直到把問題修復(fù),沒有任何怨言,阿里的同學(xué)就是這樣,線上有問題第一時間解決,職業(yè)素養(yǎng)絕對是值得敬佩。
我實際上是比較懶的一個人,能自動的絕不人肉,有一次一個問答功能剛上線,淘寶的賣家也是挺聰明的,各種小廣告又是賣衣服又是賣手機的好不熱鬧,最后的結(jié)果就是整個頁面完全沒法看了,苦逼的運營MM一條一條手工的刪,刪的再快也趕不上發(fā)的多,然而我又是那種喜歡多管閑事的人,想到用貝葉斯算法可以解決這個問題,然后就業(yè)余+周末花了有一兩周的時間開發(fā)了一套反垃圾系統(tǒng),把這事拿出來說并非是這個算法有多牛逼多厲害,貝葉斯算法反垃圾并不是什么新鮮事,而是因為這個事情完全是腦袋一熱去做的,但是又收到了出人意料的效果,實際上這樣的事情也干了不少,只是這件比較有代表性。
另外一個印象比較深刻的項目是去年的雙十一直播,之前由于工作的變化,剛到新團隊沒幾天,接到一個任務(wù),要設(shè)計一套直播系統(tǒng),能支持XXX萬人同時在線,XXX個主播同時推流,又是游戲的雙十一雙十二核心玩法,可是以往的雙十一從來沒有做過類似的直播,沒有經(jīng)驗可借鑒,而此時離雙十一也就一兩個月的時間,那好吧,開始做,方案設(shè)計、資源協(xié)調(diào)、容量評估、壓力測試,中間涉及到N個團隊的合作、協(xié)調(diào)、擴容,技術(shù)上又遇到各種坑,連續(xù)加了一兩個月的班,大家都非常疲倦,可以說是遇到的挑戰(zhàn)最多的一個項目,所有的東西都得從零開始,上線的時間節(jié)點又無法往后推,謝天謝地最終我們解決了所有的問題,在雙十一雙十二期間總體表現(xiàn)的比較平穩(wěn),雖然并不完美。當(dāng)然,這一切并不是靠天吃飯,跟前期的方案和小伙伴們的努力密不可分,實際上這里面收獲也是蠻多的。
當(dāng)然,不論是處于什么角色,做好手頭的工作是本分,但是也不要被自己當(dāng)前的角色所局限,多去了解一下周圍的人在干什么,了解系統(tǒng)的設(shè)計思路,多問幾個為什么,為何要這樣設(shè)計,這樣設(shè)計有什么好處,有沒有其他更優(yōu)的方案,主動學(xué)習(xí),你能得到更多。
互聯(lián)網(wǎng)發(fā)展日新月異,技術(shù)也在不斷的更迭,在新技術(shù)來臨時,作為技術(shù)人員的你,有什么學(xué)習(xí)方法或技能可分享?
賢哥:技術(shù)總是從無到有,從有到優(yōu),顛覆整個行業(yè)的技術(shù),在誕生初期也是襁褓中的嬰兒,需要不斷完善。因此,對于技術(shù)的學(xué)習(xí)首先要把握脈絡(luò),在理清思路之后,從源碼學(xué)習(xí)也很重要,要知道,源碼面前,了無秘密,不但要知其然,還要知其所以然,這樣就容易觸類旁通,技術(shù)的發(fā)展往往是演進式的,從最初概念的提出,到原型產(chǎn)生,再到工業(yè)化,最后獲得業(yè)界的廣泛認(rèn)可被大規(guī)模使用,這中間有一個演變的歷程,所以,只要明白技術(shù)的運作機制,也就是所謂的原理、價值、使用場景,就很容易一個feature一個feature的學(xué)習(xí)。當(dāng)然,很多東西都是從大洋彼岸來的,從技術(shù)投入應(yīng)用,到相關(guān)的文章書籍出來,會有一定的滯后期,然而,等國內(nèi)翻譯的書籍出來,又是一個漫長的時間,所以,得習(xí)慣看英文文檔。
當(dāng)然,最重要的還是要理解技術(shù)的核心本質(zhì),包括原理、解決什么樣的問題、什么樣的場景適合使用,另外,還得看相關(guān)的技術(shù)的社區(qū)活躍度,有沒有可能在未來成為主流,這是非常重要的,通常來說,解決同一領(lǐng)域的問題,可能有很多方案,那么選擇那個方案,可能將在很長一段時間里,影響著你和你的團隊,如果選擇了一種不成熟的技術(shù),或者是社區(qū)不是那么活躍的技術(shù),那么,你就得花更多的時間來解決生產(chǎn)環(huán)境中所遇到的問題。當(dāng)理解了之后,再去學(xué)習(xí),實際上就變得容易了,并且,一項技術(shù)在出來之后,會不斷的有改進,有新特性,但是都是在原來的基礎(chǔ)上增磚添瓦,當(dāng)你理解這些技術(shù)的本質(zhì)之后,再去理解這些改進,這些新特性,會變得相對來說更容易一些。
另外就是不要一味的求新,流行的并不一定就是好的,適合你的才是最好的,A來了學(xué)A,B來了學(xué)B,C來了又覺得C好,學(xué)習(xí)是有成本的,把時間用在對的地方,多一份堅持。新的技術(shù)的引入,還需要考慮到周邊的生態(tài)環(huán)境,社區(qū)是否成熟,否則光是開發(fā)各種中間件、各種工具,都夠你喝一壺,熱潮褪去,一地雞毛。
在編程/開發(fā)之余,還有哪些興趣愛好?目前你一天的生活節(jié)奏是怎樣的?
賢哥:每天除了工作中的系統(tǒng)設(shè)計、編程開發(fā)、各種會議之外,業(yè)余時間可以說非常有限了。這些有限的時間一般會被這樣劃分,各種寫作、PPT會花去一部分時間,因為需要將工作中各種經(jīng)驗,踩過的坑記錄下來,這也是人生的一筆寶貴財富,隨著時間的流逝,很難想起來3年前做過什么項目,寫過什么代碼,獲得過什么經(jīng)驗,因此,日常的總結(jié)和反思很重要。
然后就是運動,會給自己留出一點時間進行運動,畢竟身體是革命的本錢,身體是自己的,一旦健康出了問題,任何的成功都沒有意義。另外就是看書學(xué)習(xí),技術(shù)發(fā)展的步伐是很快的,如果不能持續(xù)學(xué)習(xí),可能就會落后,而這些落后的觀念最后將直接反映在你所設(shè)計的系統(tǒng)上,另外就是通過看書學(xué)習(xí)讓自己的知識變得更全面,視野更加開闊,這樣反過來也會使你解決問題的思路更廣,變得更有創(chuàng)造力,看書是一種非常好的學(xué)習(xí)方式,因為平時快餐式的學(xué)習(xí)會容易陷入細節(jié)而無法了解全面,知識無法成體系,因此,也可借看書的時間來好好梳理自己的知識。由于比較喜歡音樂,也會花一部分時間去搜尋各種流行歌曲、輕音樂、鋼琴、小提琴曲目等等,音樂能使人的大腦處于放松狀態(tài),再就是陪伴自己的家人,旅行等等。
掌握知識、技術(shù)的三個層次
此前,你出版了《大型分布式網(wǎng)站架構(gòu)設(shè)計與實踐》一書,能否分享下你寫書的原因、過程、困難和感悟等?以及介紹下這本書的特色。
賢哥:其實是比較機緣巧合的一件事情,記得是2013年4月份,博文視點的董英女士找到我,問我是否有興趣寫本關(guān)于分布式系統(tǒng)方面的書,其實當(dāng)時已經(jīng)預(yù)感到這個事情做起來會比較難,但是還是義無反顧接下了這個活。主要是覺得,寫書是個高尚的事情,也算是為互聯(lián)網(wǎng)技術(shù)的發(fā)展盡了一絲綿薄之力了,從另一個角度來說,也是難得的一次機會,對之前的知識一個全面的回顧,一些知識點及細節(jié),有些也是知其然不知其所以然,或者是沒有親身驗證,剛好借此機會深入了解和挖掘。
對于知識或者是技術(shù)的掌握,個人認(rèn)為有三個層次,在項目中能做出來是一個層次,將經(jīng)驗寫出來惠及大家則是一個升華,當(dāng)然,能夠在各種場合隨時隨地的清晰表達出來,又是另一個層次。
實際上,真正寫作的過程遠比想象的要困難,在互聯(lián)網(wǎng)企業(yè)工作本身就是一件比較累比較辛苦的事情,有時候加班到晚上9-10點鐘回家,還要抽出一兩個小時的時間來寫作,周末基本上就一心撲在上面了,時間是一方面,最痛苦的莫過于在這過程中需要不停的上下文切換,工作到寫作,寫作到生活,而寫作又是一件需要靈感的事情,有時候可能在那坐了老半天憋不住幾句話,而在上班的路上你可能又文思如泉涌,很多時候常常不得不等到夜深人靜,才能夠完全靜下心來投入。
寫書的一年多時間里,簡直可以用煎熬來形容,無數(shù)次想過放棄,也曾經(jīng)質(zhì)疑過糾結(jié)過,能夠堅持下來寫完,我只能說,Oh,my god,謝天謝地,感謝所有陪伴在身邊的人及支持我的人。從一開始這本書的定位就不是曲高和寡,陽春白雪,而是希望讓各個不同崗位以及不同基礎(chǔ)的讀者們,都能夠有所收獲,因此,內(nèi)容中即有過程,也有總結(jié),當(dāng)然,每次回過頭來看這本書,寫作時候的那種“戰(zhàn)戰(zhàn)兢兢,如履薄冰”的感覺,依然還在,寫作是嚴(yán)肅的事情,每一次落筆,常常會擔(dān)心會不會因為自己的理解偏差,誤導(dǎo)讀者,以現(xiàn)在的眼光或者視角來看,這本書遠稱不上完美,但是一本書不可能無休止的寫下去,難免會有不完美的地方,接受瑕疵有時候也挺痛苦的。
避免失敗是所有工程技術(shù)的核心
你個人對架構(gòu)/軟件架構(gòu)的理解是?
賢哥:以下僅是個人的一些理解,架構(gòu)不僅僅融合了思想,融合了技術(shù),同時也融合了藝術(shù),好的架構(gòu)并不僅僅是停留在技術(shù)文檔里,而是在實踐的過程中不斷地修正和調(diào)整的,這對架構(gòu)師也提出了更高的要求,僅僅是停留在抽象和概念階段是沒有太大價值的,細節(jié)是魔鬼,一些從抽象層面看起來比較簡單的架構(gòu),實際上最大的挑戰(zhàn)往往來自于細節(jié),這些細節(jié)既包含產(chǎn)品視覺交互功能的實現(xiàn),也包含業(yè)務(wù)規(guī)則、風(fēng)險等種種邏輯的處理,還包括技術(shù)上的一些難以預(yù)知的“坑”,具體的技術(shù)方案在實施的過程中,可能需要花費大量的時間跟精力去解決和避免那些極端情況下可能出現(xiàn)的問題。
架構(gòu)應(yīng)該滿足一段時間內(nèi)的業(yè)務(wù)發(fā)展,但是這一段時間到底有多長,有說三個月,有說半年,有說一年,也有說三年,不同的人不同的環(huán)境對于這個問題的理解可能不同,創(chuàng)業(yè)型公司,或者是嘗試型的業(yè)務(wù),風(fēng)雨飄搖九死一生,優(yōu)先考慮的是業(yè)務(wù)模式而非技術(shù)架構(gòu),因此,此時的架構(gòu)應(yīng)該盡可能簡單盡可能容易實現(xiàn),三個月之后業(yè)務(wù)變成什么樣子甚至是否存在,還很難說,這個時候去想三年之后的架構(gòu),基本上也是天馬行空,對于比較成熟的業(yè)務(wù),或者是對之前穩(wěn)定的業(yè)務(wù)系統(tǒng)進行重構(gòu),則需要將眼光放長遠些,避免一些在中長期可能面臨的問題,比如數(shù)據(jù)庫的分庫分表數(shù)量,ID的長度,分庫分表的維度等。
另外就是系統(tǒng)需要可擴展,在設(shè)計時要留有一定的擴展點,避免稍有變更就需要整個系統(tǒng)重構(gòu)的情況出現(xiàn),對擴展開放,對修改封閉,實際上這很好理解,修改原有的系統(tǒng)而不是擴展原有的系統(tǒng),更容易引入新的問題,也會帶來更大的測試工作量。一段時間之內(nèi)架構(gòu)的演變,常常會經(jīng)歷從清晰,再到模糊混亂,再重構(gòu),再清晰,然后又變得模糊的過程,市場環(huán)境總是瞬息萬變的,因此,系統(tǒng)的設(shè)計要遵循對擴展開放,對修改封閉的原則,做到這點即可方便及時的接入新流程,又能夠不影響既有的流程。
從宏觀來看,各個系統(tǒng)間的關(guān)系一定不應(yīng)該是煙囪與煙囪的關(guān)系,而是猶如城市里的高樓大廈,通過公路連接起來,因此,要提高建房子的速度,就要充分利用已有的基礎(chǔ)設(shè)施,已有的中間件,來降低系統(tǒng)構(gòu)建的成本和風(fēng)險。
架構(gòu)設(shè)計的幾個層次,沒有架構(gòu)也是架構(gòu),專注于解決現(xiàn)有問題也能稱為架構(gòu),而好的架構(gòu)應(yīng)該是即能夠約束開發(fā)者又能夠解放開發(fā)者使其專注于功能的設(shè)計。盡量將復(fù)雜的事情變的簡單,而不要將簡單的事情變的復(fù)雜,技術(shù)從來都不是用來炫的,而是用來解決實際問題的。避免失敗是所有工程技術(shù)的核心,架構(gòu)也是技術(shù),要運用架構(gòu)技術(shù)去緩解風(fēng)險。
分布式架構(gòu) VS. 集中式架構(gòu)系統(tǒng),以及思考
分布式系統(tǒng)架構(gòu)是一個非常廣發(fā)的概念,他有著怎樣的特點,以及在網(wǎng)站何時要用分布式?另外它有哪些的場景?
賢哥:分布式架構(gòu)實際上是解決了集中式架構(gòu)系統(tǒng)能力進一步向上擴展的所面臨的瓶頸,這些瓶頸包括資源、運維、開發(fā)維護等,因為單機的硬件受到技術(shù)條件的限制,越往上擴展,成本可能并非是線性的而是指數(shù)級的,分布式架構(gòu)通過大量廉價的PC Server集群,使得能力的擴展與經(jīng)濟成本的關(guān)系再次回歸線性,另外當(dāng)開發(fā)團隊的規(guī)模越來越大,業(yè)務(wù)越來越復(fù)雜,分布式及服務(wù)化也使得系統(tǒng)能夠更好的進行拆解,讓更多的團隊能夠更高效率的在一起協(xié)作。
但是,從另一個角度來看,分布式架構(gòu)也是一種復(fù)雜的架構(gòu),很多傳統(tǒng)架構(gòu)下面可以弱化的問題,在分布式環(huán)境下變得凸顯,甚至是成為至關(guān)重要的問題,比如數(shù)據(jù)一致性問題,比如網(wǎng)絡(luò)通信、序列化、延時問題,比如如何應(yīng)對失敗的問題,傳統(tǒng)環(huán)境下數(shù)據(jù)一致性通過數(shù)據(jù)庫事務(wù)在相當(dāng)程度下被弱化了,而分布式環(huán)境下將成為一個非常復(fù)雜的問題,另外就是分布式架構(gòu)使得集群內(nèi)部的網(wǎng)絡(luò)通信變得更加頻繁,通信協(xié)議、序列化方式、通信延遲、容錯、性能這些都會變得復(fù)雜化,分布式環(huán)境下的失敗將成為常態(tài),如何處理這些失敗也會變得一個非常復(fù)雜的問題,一個成熟的分布式架構(gòu)體系所依賴的基礎(chǔ)設(shè)施很多,從各種中間件,到自動化運維體系,監(jiān)控體系,容災(zāi)體系,這些都需要一段時間的積累,并且持續(xù)投入和付出,因此,在考慮分布式架構(gòu)的同時,也需要從投入產(chǎn)出以及回報角度綜合考慮,對于創(chuàng)業(yè)公司來說,需要想清楚優(yōu)先要解決的問題是什么,再來思考企業(yè)需要什么樣的架構(gòu),一味地參考大公司的架構(gòu),可能會提前讓系統(tǒng)變得過于復(fù)雜,失去響應(yīng)靈活的特點,從而失去競爭力。
我所理解的網(wǎng)站架構(gòu)
賢哥送福利:
資料太多,加企鵝群:8 9 7 8 8 9 5 1 0,領(lǐng)取以上免費的學(xué)習(xí)資源。
大型網(wǎng)站架構(gòu)設(shè)計的思想與原則是什么?
賢哥:實際上很難說有個一個統(tǒng)一的思想和設(shè)計原則,能夠放之四海而皆準(zhǔn),因為每個人對于設(shè)計的理解和理念是不同的,個人覺得設(shè)計一個復(fù)雜的大型網(wǎng)站,實際上是一個分而治之的過程:
首先得充分的理解業(yè)務(wù),理解需求,理解當(dāng)下需要解決的首要問題,以及可能的風(fēng)險有哪些,再將目標(biāo)進行分解,進行具體的技術(shù)選型、模型設(shè)計、架構(gòu)設(shè)計。如果需要解決的核心問題是并發(fā),則可以通過各種緩存手段(本地緩存、分布式緩存),來提高查詢的吞吐,這樣雖然會一定程度上需要在數(shù)據(jù)一致性上做出犧牲,由強一致性變?yōu)樽罱K一致性,但是,如果數(shù)據(jù)一致性不是核心需要解決的問題,那么,此問題的優(yōu)先級則可以先放一放,反過來如果核心問題變?yōu)閿?shù)據(jù)的一致性,如交易系統(tǒng),那么再怎么強調(diào)數(shù)據(jù)的一致性都不為過,由于分布式環(huán)境下為了應(yīng)對高并發(fā)的寫入以及海量數(shù)據(jù)的存儲,通常需要對關(guān)系型數(shù)據(jù)庫進行分庫分表擴展,這也給數(shù)據(jù)一致性帶來了很大的挑戰(zhàn),原本的單庫事務(wù)的強一致性保障,在這個時候升級為跨庫的分布式事務(wù),而通過二階段或者三階段提交所保障的分布式事務(wù),由于分布式事務(wù)管理器與資源管理器之間的多次網(wǎng)絡(luò)通信成本,吞吐及效率上很難滿足高并發(fā)場景下的要求,而這實際上對于交易系統(tǒng)來說,又是一個很難回避的問題,因此,大家又想出很多的招來解決這個問題,通過可靠消息系統(tǒng)來保障不失為一種方式,變同步為異步,但是,又引入新的問題,消息系統(tǒng)為保證不丟消息,則很難保證消息的順序性以及是否重復(fù)投遞,這樣作為消息的接收方,則需要保障消息處理的冪等性,以及對消息去重。
個人比較推崇洛克希德·馬丁公司的著名飛機設(shè)計師凱利·約翰遜所提出的KISS原則,架構(gòu)設(shè)計能簡單絕不復(fù)雜,堅決砍掉任何華而不實的設(shè)計,不要因為3年后可能怎樣甚至是一些現(xiàn)實中根本無法出現(xiàn)的場景,加入到當(dāng)下的架構(gòu)設(shè)計中,導(dǎo)致系統(tǒng)無比復(fù)雜。有時候看似引入的是一個很簡單很容易解決的問題,可能在具體的執(zhí)行過程中,會因此帶來一系列不必要的麻煩,按下葫蘆起來瓢。
另外一點就是對于未經(jīng)驗證的新技術(shù)、新理念的引入一定要慎重,一定要在全方位的驗證過后,再大規(guī)模的使用,新技術(shù)、新理念的出現(xiàn),自然有它的誘惑,慎重并不代表保守,技術(shù)總是在不斷前進,擁抱變化本身沒有問題,但是引入不成熟的技術(shù)看似能帶來短期的收益,但是它的風(fēng)險或者是后期的成本可能遠遠大于收益。
設(shè)計一個大型網(wǎng)站架構(gòu)時,通常需要從哪些層面去考慮?服務(wù)器/存儲部署方面需要注意哪些問題?
賢哥:大型網(wǎng)站的設(shè)計是一個非常復(fù)雜的問題,需要考慮的問題很多,比如海量數(shù)據(jù)的存儲,存儲又分為在線存儲與離線存儲,在線又有關(guān)系型數(shù)據(jù)庫存儲和非關(guān)系型數(shù)據(jù)庫存儲,持久化存儲和內(nèi)存存儲,這些都需要架構(gòu)師根據(jù)具體的場景進行選型。
高并發(fā)且允許數(shù)據(jù)丟失的情況下,可以采用內(nèi)存存儲,而查詢條件單一,只需要根據(jù)主鍵進行查詢,則可以選擇key-value型的存儲,對于海量的文檔及圖片內(nèi)容,則可借助分布式文件系統(tǒng)以及CDN邊緣節(jié)點,即解決了存儲的問題,又能夠?qū)⒗錈釘?shù)據(jù)分離,并且通過邊緣節(jié)點提高用戶訪問的效率,如果是需要多維度的復(fù)雜查詢,則需要使用關(guān)系型數(shù)據(jù)庫。當(dāng)數(shù)據(jù)量大,并發(fā)寫入請求多的時候,又需要進行分庫分表,由于分庫分表會限制數(shù)據(jù)的查詢維度,查詢條件必須得帶上分庫分表的鍵,如果需要多個查詢維度,則需要使用數(shù)據(jù)同步工具同步出另一維度的數(shù)據(jù)結(jié)構(gòu),或者是搭建垂直搜索引擎,以提供多維度的數(shù)據(jù)查詢,很多情況下難以通過一種存儲工具解決所有問題,因此需要多種存儲復(fù)合使用,以提高效率及用戶的使用體驗。
再又如應(yīng)用的部署,從集中式架構(gòu)到分布式架構(gòu),SOA服務(wù)化,再到時下流行的微服務(wù)架構(gòu),接入層的負(fù)載均衡設(shè)備解決了無狀態(tài)WEB應(yīng)用的擴展問題,而軟負(fù)載中心則解決了服務(wù)發(fā)現(xiàn)和服務(wù)路由的問題,輕量虛擬化及docker的出現(xiàn)使得Martin Fowler所提出的微服務(wù)理念能夠更容易成為現(xiàn)實,當(dāng)然,大型網(wǎng)站還需要考慮比如某個地域出現(xiàn)不可抗力因素時,如何保障整站的可用性以及數(shù)據(jù)完整性,諸如同城容災(zāi),異地容災(zāi)(如兩地三中心),以及時下正處于風(fēng)口浪尖的異地雙活、異地多活架構(gòu)。
大型網(wǎng)站的架構(gòu)往往不是一蹴而就的,而是通過需求的推動經(jīng)過多年演變一步步形成的,不同的時期不同的階段不同的規(guī)模,所面臨的業(yè)務(wù)不同、需求不同、需要解決的核心問題也不同,這就導(dǎo)致不同的階段不同的架構(gòu),并且架構(gòu)也是不斷演進與發(fā)展的。
大型網(wǎng)站有哪些典型的故障以及通常有哪些解決之道或相應(yīng)的優(yōu)化建議呢?
賢哥:一個成規(guī)模的網(wǎng)站可能每天都在經(jīng)歷故障,只不過故障可能在絕大部分人感知到之前就已經(jīng)修復(fù)了,導(dǎo)致故障的原因很多,有可能是業(yè)務(wù)邏輯的變更對于依賴的測試不充分,或者是不兼容的版本升級導(dǎo)致的序列化錯誤,又或者是測試用例未覆蓋到的程序bug,又或者是不同版本jar包的同名類沖突問題等等,也有可能是訪問量太高導(dǎo)致日志將磁盤打爆,又或者是機器負(fù)載過高導(dǎo)致大量線程阻塞,又或者是鎖競爭過于激烈導(dǎo)致進程僵死,或者是數(shù)據(jù)庫連接池用完,JVM頻繁GC等等。
另外也有可能是由于物理環(huán)境問題,比如網(wǎng)線被拔掉,光纖被挖斷,機房停電,硬件設(shè)備損壞等等,導(dǎo)致故障的原因可能千奇百怪,很難一一枚舉,對于變更所導(dǎo)致的故障,能做的是讓測試用例盡可能全面的覆蓋到每一個細節(jié),包括依賴項,項目設(shè)計階段多考慮風(fēng)險,按照流程來發(fā)布,但是也不能因噎廢食,使得發(fā)布流程沉重僵化,對新的業(yè)務(wù)需求響應(yīng)緩慢,實際上這也是一個很難拿捏的度。
此外就是要建立起完善的監(jiān)控系統(tǒng),包括異常日志收集分析,業(yè)務(wù)流程全鏈路校驗,機器運行狀態(tài)檢測(負(fù)載、qps、磁盤、內(nèi)存、網(wǎng)絡(luò)、運行水位),歷史數(shù)據(jù)的分析,異常報警等,對于服務(wù)化的架構(gòu),還需要完善服務(wù)治理,包括強弱依賴管理,調(diào)用關(guān)系(誰調(diào)用了誰,誰被誰調(diào)用了),調(diào)用頻次,異常狀況等,這實際上是一個體系化的工作,也是一個比較基礎(chǔ)的工作,有了這些之后,你才能夠及時的感知到系統(tǒng)的異常狀況,及時定位問題,修復(fù)問題。
構(gòu)建一個網(wǎng)站時,可以選擇開源或自主研發(fā),前者因萬一選用的開源方案在將來才發(fā)現(xiàn)某一些特性不滿足,就得推倒重來,而后者則似乎有重復(fù)造輪子的嫌疑,對此你怎么看?
賢哥:這個問題得辯證來看,使用開源能夠降低很大的工作量,但是也會存在潛在的風(fēng)險,特別是一些未得到廣泛驗證的技術(shù),即便是使用的十分廣泛的如Struts、SSL,也時不時會爆出一些驚人的漏洞,對于小公司來說,使用開源的技術(shù)能夠快速的構(gòu)建出一個勘用的網(wǎng)站,即便是在使用開源軟件的過程中遇到問題,切換的成本可能也不會很高,但是對于大公司而言,切換的成本可能會變得非常的高,因為業(yè)務(wù)和依賴關(guān)系實在是太復(fù)雜,一旦大規(guī)模使用,影響的范圍可能非常廣,因此在做選擇之前不得不非常之慎重,當(dāng)然,我們也會有一些比較特殊的需求,開源軟件無法滿足,或者說是走在了開源的前面,這些工具、中間件就需要自己動手開發(fā)了。
另外就是開源的軟件有些特性實際上與我們的期望有很大的差距,而他們本身的架構(gòu)可能又不是那么方便擴展,但是這些特性對于我們來說又十分的關(guān)鍵,比如Hadoop,它的MapReduce、HDFS、Hive提供一整套海量數(shù)據(jù)的分析解決方案,但是底層的權(quán)限控制做的很弱,因此我們不得不花了很大的精力開發(fā)出一套替代方案,又花費很大的精力將原來Hadoop上的數(shù)據(jù)和Job遷移到新平臺。對于開源技術(shù)的選擇,我們更傾向于選擇一些社區(qū)比較活躍比較成熟的軟件,最好是有一些比較成規(guī)模的成功案例的,這樣的風(fēng)險會小一些,畢竟對于一家成熟的電商網(wǎng)站來說,穩(wěn)定大于一切,系統(tǒng)的不可用時間是跟成交金額直接關(guān)聯(lián)的,分分秒秒過去的時間,就是實實在在的金錢。
對于較為核心的應(yīng)用所引入的開源技術(shù),我們也會花費較大的精力深入地去了解,做一些bugfix,避免踩到一些坑。
另外一點就是大公司的很多場景可能是非常特殊的,比如高并發(fā)場景下的MySAL數(shù)據(jù)庫行鎖,大對象常駐內(nèi)存時的JVM的內(nèi)存回收,一些軟件可能為了滿足通用的需求,犧牲了一些特殊場景下的性能。因此,對于我們來說,了解這些后,也是有一定的優(yōu)化空間的,包括從實現(xiàn)上去規(guī)避,或者是去改造開源軟件,而做這些的前提就是對開源軟件的了解。
一般網(wǎng)站面臨的問題就是負(fù)載的問題,當(dāng)人數(shù)多,導(dǎo)致速度慢是主要解決的問題,對此你有什么建議?
賢哥:相較于傳統(tǒng)企業(yè)來說,大部分互聯(lián)網(wǎng)企業(yè)都會面臨的一個很大的挑戰(zhàn),隨著用戶規(guī)模的不斷擴大,系統(tǒng)的壓力會越來越大,而在創(chuàng)業(yè)初期,系統(tǒng)的架構(gòu)設(shè)計往往是一切從簡甚至根本沒有架構(gòu),快速迭代,優(yōu)先滿足業(yè)務(wù),而受市場環(huán)境的影響業(yè)務(wù)往往是多變的,因此往往會背下“技術(shù)債”,業(yè)務(wù)邏輯高度耦合,系統(tǒng)不可擴展,代碼結(jié)構(gòu)臃腫,此時不得不進行重構(gòu)。
“分布式”是應(yīng)對大流量核心思想,首先,系統(tǒng)得做好準(zhǔn)備,支持?jǐn)U展,尤其是在數(shù)據(jù)、模型層面,因為數(shù)據(jù)的拆分、擴容、數(shù)據(jù)遷移最麻煩最費時間,稍有不慎,還可能導(dǎo)致數(shù)據(jù)不一致,造成的損失也有可能是無法挽回的,方案設(shè)計必須得慎之又慎,在數(shù)據(jù)拆分遷移的同時,新的數(shù)據(jù)正在源源不斷的寫入,老的數(shù)據(jù)也常常會面臨高并發(fā)的更新,因此,業(yè)界經(jīng)常將數(shù)據(jù)拆分?jǐn)U容比喻成是在給一架高速飛行的飛機換引擎,這也是整個擴容過程中,最復(fù)雜,技術(shù)含量最高,最有挑戰(zhàn)的任務(wù)。
再就是集中式應(yīng)用的業(yè)務(wù)邏輯拆分,原先團隊規(guī)模小,業(yè)務(wù)量也小,可能會在少數(shù)幾個應(yīng)用上堆了很多代碼和業(yè)務(wù)邏輯,而隨著公司規(guī)模的增長,業(yè)務(wù)迅速發(fā)展,團隊規(guī)模越來越大,集中式的應(yīng)用維護將會變得十分困難,這既包括開發(fā)部署,筆者曾經(jīng)開發(fā)過一個應(yīng)用,改幾行代碼,本地編譯打包需要10幾分鐘,本地部署又需要十幾分鐘,這極大的降低了開發(fā)的效率,另外這樣的巨無霸工程也會占用很多服務(wù)器資源,而單機的硬件資源又不可能無限升級,這也會是一個問題,再者就是耦合的業(yè)務(wù)邏輯也不便于復(fù)用,得四處重復(fù)造輪子,浪費資源,這又引申出另一塊,也就是企業(yè)內(nèi)部的服務(wù)化。
SOA架構(gòu)包括時下流行的微服務(wù)理念,解決的是企業(yè)內(nèi)部資源復(fù)用的問題,避免信息孤島和重復(fù)造輪子,提高系統(tǒng)可維護性,降低業(yè)務(wù)試錯以及系統(tǒng)構(gòu)建成本,提升企業(yè)競爭力。通用的統(tǒng)一的SOA通信標(biāo)準(zhǔn),包括通信協(xié)議、序列化反序列化方式,能夠簡化SOA架構(gòu)的實現(xiàn),服務(wù)的自動注冊、路由、軟負(fù)載能降低運維成本,隨著服務(wù)的增加,單靠人工來進行服務(wù)治理越來越困難,又衍生了服務(wù)治理系統(tǒng),對服務(wù)的調(diào)用,依賴,異常等信息進行統(tǒng)一的管理。當(dāng)應(yīng)用變得無狀態(tài)之后,擴容就非常方便了,通過負(fù)載均衡軟硬件設(shè)施,或者是SOA的軟負(fù)載機制,可以根據(jù)需要十分方便的增減機器擴充容量,而這種能力幾乎是線性的(在一定規(guī)模下)。當(dāng)然,大部分的場景以及技術(shù)解決方案,國外的Yahoo、Google、Facebook、Linkin 、Twitter…,國內(nèi)的BAT,這些知名的互聯(lián)網(wǎng)企業(yè),實際上很大程度上已經(jīng)充當(dāng)先驅(qū),后來的追隨者,只需要緊隨前人的腳步,驀直前行,架構(gòu)的風(fēng)險已經(jīng)被大大的降低。
架構(gòu)師的技能或素養(yǎng),架構(gòu)師到底要不要寫代碼?
成為一名架構(gòu)師需要哪些的技能或素養(yǎng)?
賢哥:以下僅代表個人觀點,設(shè)計符合要求的系統(tǒng)是架構(gòu)師的基本技能,功能、可用性、可擴展性,以及團隊能力、項目執(zhí)行風(fēng)險、運行環(huán)境都需要綜合考慮,架構(gòu)師的功力更多體現(xiàn)在技術(shù)的綜合運用上,因此對于項目所需要的技術(shù)細節(jié)的了解必須是全面的,這樣才能夠?qū)⒆詈线m的技術(shù)用在最需要的地方,并且還需要有技術(shù)的前瞻性,通過經(jīng)驗以及積累發(fā)現(xiàn)可能潛在的風(fēng)險,對于問題的理解,不能夠僅停留在表面,邏輯思維和抽象思維能力是一個架構(gòu)師的重要素質(zhì)。
當(dāng)然,作為架構(gòu)師還需要一個非常重要的技能,就是充分的溝通,完成系統(tǒng)的設(shè)計只是萬里長征的第一步,設(shè)計思想需要充分的傳達給團隊中,并且從團隊中得到相應(yīng)的反饋,對方案進行調(diào)整,不斷完善,只有在團隊中所有人都了解領(lǐng)悟了你的設(shè)計之后,后續(xù)的推進包括項目的實施才能夠變得順暢,細節(jié)是魔鬼,在后續(xù)的執(zhí)行過程中,可能會面臨各種問題,涉及到的方案調(diào)整,溝通協(xié)調(diào)是不可避免的,作為架構(gòu)師來說,需要有充分的準(zhǔn)備,好的架構(gòu)師能夠帶領(lǐng)團隊高歌猛進,而不稱職的架構(gòu)師最終會導(dǎo)致矛盾重重,對于合作的團隊來說,需要確認(rèn)可能的風(fēng)險,包括接口,時間節(jié)點,兼容性,對接可能遇到的技術(shù)問題,對于可能遇到的風(fēng)險,架構(gòu)師必須了然于胸,提前準(zhǔn)備,從容應(yīng)對。
Linus Torvalds說,
Talk is cheap, show me the code.
但是我想說的是,
Talk is not cheap, talk is important too!
很多人會問,架構(gòu)師到底要不要寫代碼,首先,個人認(rèn)為,架構(gòu)師是需要寫代碼的,無奈時間是有限的,項目的規(guī)模越大,所需要思考的細節(jié)點越多,自然而然花費的時間越多;除此之外,作為架構(gòu)師的你還需要傳播布道,告訴所有人你理解的架構(gòu)是什么樣子,告訴大家怎么做如何做,核心的目標(biāo)是什么,核心的風(fēng)險是什么;架構(gòu)師還需要協(xié)調(diào)各個依賴的關(guān)聯(lián)系統(tǒng),告訴其他人你要做一件什么事情,需要其他人怎么配合,做這件事的價值以及其他人為何要配合你,這同樣需要花費大量的時間,那么,在剩下不多的時間里,架構(gòu)師能寫的代碼可能不多,但是,為了讓你設(shè)計的系統(tǒng)不脫離現(xiàn)實,你必須寫代碼,必須Review核心關(guān)鍵代碼,確保整體架構(gòu)的思路得到貫徹,確保你的設(shè)計是易于實施的,確保潛在的風(fēng)險得到妥善的控制,特別是在有新技術(shù)引入的情況下,原型驗證是必不可少的步驟。有種觀點認(rèn)為,架構(gòu)師必須是代碼貢獻最多的,一個人寫代碼,自然不需統(tǒng)一思想,但是實際上這很難做到,作為架構(gòu)師你得記住,不是你一個人在奮斗,不要讓自己成為團隊的瓶頸,但是,我同樣也不贊成架構(gòu)師完全不編碼,不親身體驗過,有的風(fēng)險是很難事先做出判斷的,何況技術(shù)本身也在發(fā)展,今天的經(jīng)驗放在明天不一定有效,作為程序員的最基本技能,編碼是你學(xué)習(xí)和積累的最直接的方式。
架構(gòu)師也是一個普通人,一天只有24小時,需要花費很多時間進行方案設(shè)計,技術(shù)合理性思考,原型驗證,還需要花費大量的時間給團隊傳達設(shè)計思想和目標(biāo),為何這樣設(shè)計,這樣設(shè)計有什么好處,不這樣設(shè)計會有什么樣的問題,人是最復(fù)雜的生物,程序員都是非常有個性并且非常聰明的,統(tǒng)一思想統(tǒng)一目標(biāo)是一個非常艱巨的任務(wù),一千個人心中有一千個哈姆雷特,同樣,做一件事情可能也有不同的方法,方法太多有時候并不是好事,作為架構(gòu)師,需要找出最合適的方法,并讓它得到大家認(rèn)可,這并非是把個人目標(biāo)轉(zhuǎn)化為團隊目標(biāo)的過程,而是不斷地溝通不斷的改進演化之后,在大家充分參與的前提下找到的最適合當(dāng)前業(yè)務(wù)場景的方案。
對未來你有著怎樣的規(guī)劃和期許?
賢哥:技術(shù)這條路注定不是坦途,碼農(nóng)大多數(shù)時候的生活是枯燥無味的,并且這又是一個學(xué)無止境的行業(yè),技術(shù)的更新?lián)Q代非常快,失敗的糾結(jié),苦思冥想的無奈,成功的喜悅,其中的酸甜苦辣,我想只有真正的碼農(nóng)才能體會。
近期來看,應(yīng)該會繼續(xù)專注于直播,阿里在電商領(lǐng)域積累了豐富的經(jīng)驗,但是對于直播來說還屬于一個有待成熟的領(lǐng)域,還有很大的提升空間,技術(shù)挑戰(zhàn)也是比較大的,后續(xù)希望能夠做一些事情,降低直播的門檻,降低資源的消耗,提高服務(wù)的穩(wěn)定性。
就跟《戰(zhàn)爭之王》這部電影里尤里·奧洛夫(Yuri Orlov)的經(jīng)典臺詞所說的一樣,人總想在有生之年做件大事,只是暫時還沒想好要做什么,誠然,我不會跟尤里一樣去販賣軍火,社會的發(fā)展和變化太快,很難預(yù)料自己五年之后會專注于什么,從事哪方面的工作,但是,作為一個熱愛技術(shù),喜歡專研的人,應(yīng)該還是會是做跟技術(shù)、跟工程能扯上點關(guān)系的事情。
最后,想給看這篇文章的讀者說些什么?
賢哥:當(dāng)初畢業(yè)找工作的時候,說實話也沒想過說一份工作會干這么長時間,而且后面可能還要繼續(xù)做下去很長時間,實際上畢業(yè)的第一份工作非常重要,因為當(dāng)你開始工作之后,你將不再是一張白紙,而你后續(xù)再去找工作的時候,前面的工作經(jīng)歷將會是很重要的參考,第一份工作將很大程度影響你后續(xù)工作的大方向,后續(xù)再想要轉(zhuǎn)型,可所付出的努力和冒的風(fēng)險可能更大。
選擇有時候很重要,首先得清楚自己喜歡做什么樣的工作,因為做自己喜歡做的事情,你更愿意付出,不會覺得辛苦,更不會覺得痛苦,而是樂在其中,工作是一件長期的事情,因此,值得你好好想想自己到底喜歡做什么。
另外就是看后續(xù)的成長空間,一滴水到了一杯奶中,水就變成了奶,一滴奶到了一杯水中,奶就變成了水,有可能某個公司A給你的offer多了1-2K,而公司B卻能夠提供給你一個更大的舞臺去發(fā)揮,去成長,給你提供一套系統(tǒng)的培訓(xùn)和成長體系,并且周圍都是業(yè)界大牛,此時的選擇,考驗著你的智慧。
短期的1-2K,從長遠來看,實際上真的不算什么,但是損失可能是長期的發(fā)展空間,那有人說,工資給的高不說明更重視么,話雖沒錯,但是去到一個沒有發(fā)展空間的公司,或者已經(jīng)是夕陽產(chǎn)業(yè),也許你確實很優(yōu)秀,可能你的高度就代表了公司最高的高度,那么你的空間在哪,這實際上是一個雞頭鳳尾的抉擇問題,選擇一個更有空間更有潛力的公司,可能剛開始你在團隊中并不是那么出色,但是,認(rèn)真工作幾年后,你再出去跟同齡人比,區(qū)別還是蠻大的,并且,優(yōu)秀、成熟的公司會有一套相對公平的評價機制,總的來講,會讓足夠優(yōu)秀并且給公司創(chuàng)造更多價值的人,得到相應(yīng)的回報,所以也不用擔(dān)心回報的問題。實際上HR也不傻,你得到的回報可能是經(jīng)濟上的回報+成長空間的總和,而兩部分加起來,大部分公司給出的價位應(yīng)該是差不多的。
機會是總是留給有準(zhǔn)備的人,選擇很重要,堅持有時候也很重要,做事情得要能沉的下心,不要怕困難,人生就像騎單車,想保持平衡就得往前走。
轉(zhuǎn)載于:https://my.oschina.net/u/3985214/blog/2877303
總結(jié)
以上是生活随笔為你收集整理的专访阿里王贤:我所理解的网站架构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MYSQL深度分页的常见优化方案
- 下一篇: Html中加入文字和图片