大部分人對于BAT的技術(shù)有一種莫名的崇拜感,覺得只有非常牛逼和天才才能做出現(xiàn)在的這些系統(tǒng)娇豫,但經(jīng)過前面兩篇博文的分析,我們可以看到其實(shí)并沒有什么神秘的力量和魔力融合在技術(shù)里面,而是業(yè)務(wù)的不斷發(fā)展推動技術(shù)的不斷發(fā)展辉浦,一步一個腳印,持續(xù)幾年甚至十幾年的發(fā)展茎辐,才能達(dá)到當(dāng)前技術(shù)復(fù)雜度宪郊、先進(jìn)性掂恕、牛逼度。
拋開BAT各自差異很大的業(yè)務(wù)弛槐,站在技術(shù)的角度來看懊亡,其實(shí)BAT的技術(shù)架構(gòu)基本是一樣的,再將視角放大乎串,你會發(fā)現(xiàn)整個互聯(lián)網(wǎng)行業(yè)的技術(shù)發(fā)展店枣,最后都是殊途同歸。
如果你正處于一個創(chuàng)業(yè)公司叹誉,或者正在成為另一個BAT的路上而拼搏鸯两,那么深入理解這種技術(shù)模式(或者叫技術(shù)結(jié)構(gòu)、技術(shù)架構(gòu))长豁,對于自己的發(fā)展钧唐、公司的發(fā)展都大有裨益,你將不會再迷茫匠襟,你也不再會心里打鼓逾柿,CTO將對你刮目相看,CEO將奉你為神明 :)
架構(gòu)師筑基
閑話不多說宅此,有圖有真相机错,看看互聯(lián)網(wǎng)的標(biāo)準(zhǔn)技術(shù)架構(gòu)是什么樣子:
上面這張圖基本上一網(wǎng)打盡了互聯(lián)網(wǎng)技術(shù)公司的技術(shù)點(diǎn),不同的公司只是在具體的技術(shù)實(shí)現(xiàn)上稍有差異父腕,但不會跳出這個框架的范疇弱匪。
接下來我將逐一介紹每個技術(shù)點(diǎn),包括為什么會有這些技術(shù)點(diǎn)璧亮,這些技術(shù)點(diǎn)的主要場景是什么萧诫,這些技術(shù)點(diǎn)將如何發(fā)展。
存儲層技術(shù)剖析
高性能
1. SQL
即關(guān)系數(shù)據(jù)枝嘶。前幾年NoSQL火了一陣子帘饶,很多人都理解為NoSQL是完全拋棄關(guān)系數(shù)據(jù),全部采用非關(guān)系型數(shù)據(jù)群扶,但事實(shí)經(jīng)過幾年的試驗(yàn)后及刻,大家發(fā)現(xiàn)關(guān)系數(shù)據(jù)不可能完全拋棄,NoSQL不是No SQL竞阐,而是Not Only SQL缴饭,即NoSQL是SQL的補(bǔ)充。
所以互聯(lián)網(wǎng)行業(yè)也必須依賴關(guān)系數(shù)據(jù)骆莹,考慮到Oracle太貴颗搂,還需要專人維護(hù),一般情況下互聯(lián)網(wǎng)行業(yè)都是用MySQL幕垦、PostgreSQL這類開源數(shù)據(jù)庫丢氢。這類數(shù)據(jù)庫的特點(diǎn)是開源免費(fèi)傅联,拿來就用;但缺點(diǎn)是性能相比商業(yè)數(shù)據(jù)庫要差較多疚察。隨著互聯(lián)網(wǎng)業(yè)務(wù)的發(fā)展蒸走,性能要求越來越高,必然要面對一個問題:將數(shù)據(jù)拆分到多個數(shù)據(jù)庫實(shí)例才能滿足業(yè)務(wù)的性能需求(其實(shí)Oracle也一樣稍浆,只是時間早晚的問題)载碌。
數(shù)據(jù)庫拆分滿足了性能的要求,但帶來了復(fù)雜度的問題:數(shù)據(jù)如何拆分衅枫、數(shù)據(jù)如何組合嫁艇。這個復(fù)雜度的問題解決起來并不是那么容易,如果每個業(yè)務(wù)都去實(shí)現(xiàn)一遍弦撩,重復(fù)造輪子將導(dǎo)致投入浪費(fèi)步咪、效率降低,業(yè)務(wù)開發(fā)想快都快不起來益楼。
所以互聯(lián)網(wǎng)公司流行的做法是發(fā)展到一定階段后猾漫,就會將這部分功能獨(dú)立成中間件,例如百度的DBProxy感凤、淘寶的TDDL悯周。不過這部分的要求很高,將分庫分表做到自動化和平臺化陪竿,不是一件容易的事情禽翼,所以一般是很牛逼的公司才會做。典型的有:百度的DBProxy族跛、淘寶TDDL闰挡。
如下是淘寶TDDL的結(jié)構(gòu)圖:
2. NoSQL
NoSQL首先體現(xiàn)在數(shù)據(jù)結(jié)構(gòu)上與傳統(tǒng)的SQL的不同,例如典型的Memcached的Key-value結(jié)構(gòu)礁哄、Redis的復(fù)雜數(shù)據(jù)結(jié)構(gòu)长酗、MongoDB的文檔數(shù)據(jù)結(jié)構(gòu);其次NoSQL無一例外的都會將性能作為自己的一大買點(diǎn)桐绒。
NoSQL的這兩個特點(diǎn)很好的彌補(bǔ)了關(guān)系數(shù)據(jù)庫的不足夺脾,因此在互聯(lián)網(wǎng)行業(yè)NoSQL的應(yīng)用基本上是基礎(chǔ)要求,要是你聽到一個號稱自己是互聯(lián)網(wǎng)公司卻連NoSQL都沒用掏膏,那基本上可以判斷是掛羊頭賣狗肉類型的劳翰。
由于NoSQL方案一般都會自己本身就提供集群的功能,例如Memcached的一致性hash集群馒疹、Redis 3.0的集群,因此NoSQL在剛開始應(yīng)用的時候很方便乙墙,不像SQL分庫分表那么復(fù)雜颖变。一般公司也不會在開始的時候就考慮將NoSQL包裝成存儲平臺生均,但如果公司發(fā)展很大,例如Memcached的節(jié)點(diǎn)有上千甚至幾千的時候腥刹,NoSQL集群就很有意義了:首先是集中管理能夠大大提升運(yùn)維效率马胧;其次是集中管理可以大大提升資源利用效率,2000臺機(jī)器衔峰,如果利用率能提升10%佩脊,就是減少200臺機(jī)器,一年幾十萬就節(jié)省出來了垫卤。
所以威彰,NoSQL發(fā)展到一定規(guī)模后,一般都是走集群路線穴肘,當(dāng)然要發(fā)展到這個階段歇盼,一般也是很牛逼的公司才會這么做。
典型的有:Twitter的Twemproxy评抚,豆瓣的BeansDB豹缀、騰訊TTC。
如下是Twemproxy的結(jié)構(gòu)圖:
3. 小文件存儲
除了關(guān)系型的業(yè)務(wù)數(shù)據(jù)外慨代,互聯(lián)網(wǎng)行業(yè)還有很多用于展示的數(shù)據(jù)邢笙,例如淘寶的商品圖片、商品描述侍匙;Facebook的用戶圖片氮惯,新浪微博的一條微博內(nèi)容等等。這些數(shù)據(jù)具有3個典型特征:一是數(shù)據(jù)小丈积,一般在1M一下筐骇;二是數(shù)量巨大,F(xiàn)acebook 2013年就達(dá)到了每天上傳3.5億張的照片江滨;三是訪問量巨大铛纬,F(xiàn)acebook每天的訪問量超過10億。
由于互聯(lián)網(wǎng)行業(yè)基本上每個業(yè)務(wù)都會有大量的小數(shù)據(jù)唬滑,如果每個業(yè)務(wù)都自己去考慮如何設(shè)計(jì)海量存儲和海量訪問告唆,效率自然會低,重復(fù)造輪子晶密,投入浪費(fèi)擒悬,自然而然的想法就是將小文件存儲做成統(tǒng)一的和業(yè)務(wù)無關(guān)的平臺。
和SQL和NoSQL不同的是稻艰,小文件存儲不一定需要公司或者業(yè)務(wù)規(guī)模很大懂牧,基本上可以認(rèn)為業(yè)務(wù)在起步階段就可以考慮做小文件統(tǒng)一存儲。得益于開源運(yùn)動的發(fā)展和最近幾年大數(shù)據(jù)的火爆,在開源方案的基礎(chǔ)上封裝一個小文件存儲平臺并不是太難的事情僧凤。例如HBase畜侦、Hadoop、Hypertable躯保、FastDFS等都可以作為小文件存儲的底層平臺旋膳,只需要在這些開源方案三再包裝一下基本上就可以用了。
典型的有:淘寶的TFS途事、京東JFS验懊、Facebook的Haystack。
如下是淘寶TFS的架構(gòu):
開發(fā)層技術(shù)剖析
開源框架源碼解析
1. 開發(fā)框架
在系列文章的第2篇《BAT解密:業(yè)務(wù)如何驅(qū)動技術(shù)發(fā)展》中我們深入分析了互聯(lián)網(wǎng)業(yè)務(wù)發(fā)展的一個特點(diǎn):復(fù)雜性越來越高尸变。復(fù)雜性增加的典型現(xiàn)象就是系統(tǒng)越來越多义图,不同的系統(tǒng)由不同的小組開發(fā)。如果每個小組用不同的開發(fā)框架和技術(shù)振惰,將會帶來很多問題歌溉,典型的問題有:
技術(shù)人員之間沒有共同的技術(shù)語言,交流合作少
每類技術(shù)都需要投入大量的人力和資源和熟練精通
不同團(tuán)隊(duì)之間人員無法快速流動骑晶,人力資源不能高效的利用
所以痛垛,互聯(lián)網(wǎng)公司都會指定一個大的技術(shù)方向,然后使用統(tǒng)一的開發(fā)框架桶蛔,例如Java相關(guān)的開發(fā)框架SSH匙头、SpringMVC、Play仔雷、Ruby的Ruby on Rails蹂析、PHP的ThinkPHP、Python的Django等等碟婆。使用統(tǒng)一的開發(fā)框架能夠解決上面提到的各種問題电抚,大大提升組織和團(tuán)隊(duì)的開發(fā)效率。
對于框架的選擇竖共,有一個總的原則:優(yōu)選成熟的框架蝙叛,避免盲目追逐新技術(shù)!為什么呢公给?
首先借帘,成熟的框架資料文檔齊備,各種坑基本上都有人踩過了淌铐,遇到問題很容易通過搜索解決
其次肺然,成熟的框架受眾更廣,招聘時更加容易招聘到合適的人才
第三腿准,成熟的框架更加穩(wěn)定际起,不會出現(xiàn)大的變動,適合長期發(fā)展
以我親身經(jīng)歷的一個反例為例:我們使用了Play 1作為Java開發(fā)框架,因?yàn)樗禽p量級的Java開發(fā)框架加叁,但沒想到Play 2直接改為Scala語言開發(fā)倦沧,Play 1的架構(gòu)演進(jìn)停滯唇撬,而我們又不能切換為Play 2它匕,結(jié)果就導(dǎo)致只能一直用Play 1,有新的需求只能自己開發(fā)窖认。
2. 服務(wù)器
開發(fā)框架只是負(fù)責(zé)完成業(yè)務(wù)功能的開發(fā)豫柬,真正能夠運(yùn)行起來,給用戶提供服務(wù)扑浸,還需要服務(wù)器配合烧给。
獨(dú)立開發(fā)一個成熟的web服務(wù)器,成本非常高喝噪;且業(yè)界又有那么多成熟的開源web服務(wù)器础嫡,所以互聯(lián)網(wǎng)行業(yè)基本上都是拿來主義,挑選一個流行的開源服務(wù)器即可酝惧。牛逼一點(diǎn)的公司榴鼎,可能會在開源服務(wù)器的基礎(chǔ)上,結(jié)合自己的業(yè)務(wù)特點(diǎn)做二次開發(fā)晚唇,例如淘寶的Tengine巫财,但一般公司基本上只需要將開源服務(wù)器摸透,優(yōu)化一下參數(shù)哩陕,調(diào)整一下配置就差不多了平项。
選擇一個服務(wù)器主要和開發(fā)語言相關(guān),例如:Java的有Tomcat悍及、Jboss闽瓢、Resin等,PHP/Python的用Nginx心赶,當(dāng)然最保險(xiǎn)的就是用Apache了扣讼,什么語言都支持。
有的人可能擔(dān)心Apache的性能之類的問題园担,其實(shí)不用過早擔(dān)心這個届谈,等到你的業(yè)務(wù)真的發(fā)展到Apache撐不住的時候再考慮切換也可以,那時候你有的是錢弯汰,有的是人艰山,有的是時間。
3. 容器
容器是最近幾年年才開始火起來的咏闪,其中以Docker為代表曙搬,在BAT級別的公司已經(jīng)有較多的應(yīng)用,例如騰訊:騰訊萬臺規(guī)模的Docker應(yīng)用實(shí)踐;新浪微博:微博紅包:大規(guī)模Docker集群實(shí)踐經(jīng)驗(yàn)分享等等纵装。
傳統(tǒng)的虛擬化技術(shù)是虛擬機(jī)征讲,解決了跨平臺的問題,但由于虛擬機(jī)太龐大橡娄,啟動慢诗箍,運(yùn)行時太占資源,在互聯(lián)網(wǎng)行業(yè)并沒有大規(guī)模的應(yīng)用挽唉;而Docker的容器技術(shù)滤祖,雖然沒有跨平臺,但啟動快瓶籽,幾乎不占資源匠童,推出后立刻就火起來了,預(yù)計(jì)Docker類的容器技術(shù)將是技術(shù)發(fā)展的主流方向塑顺。
千萬不要以為Docker只是一個虛擬化或者容器技術(shù)汤求,它將在很大程度上改變我們目前的技術(shù)形勢:
運(yùn)維方式會發(fā)生革命性的變化:Docker啟動快,幾乎不占資源严拒,隨時啟動和停止扬绪,基于Docker打造自動化運(yùn)維、智能化運(yùn)維將成為主流方式
設(shè)計(jì)模式會發(fā)生本質(zhì)化的變化:啟動一個新的容器實(shí)例代價如此低糙俗,將鼓勵設(shè)計(jì)思路朝“微服務(wù)”的方向發(fā)展勒奇。
例如一個傳統(tǒng)的網(wǎng)站包括登錄注冊、頁面訪問巧骚、搜索等功能赊颠,沒有用容器的情況下,除非有特別大的訪問量劈彪,否則這些功能開始時都是集成在一個系統(tǒng)里面的竣蹦;有了容器技術(shù)后,一開始設(shè)計(jì)就可以將這些功能按照服務(wù)的方式設(shè)計(jì)沧奴,避免后續(xù)訪問量增大時又要重構(gòu)系統(tǒng)痘括。
微服務(wù)
團(tuán)隊(duì)協(xié)作開發(fā)
設(shè)計(jì)模式:設(shè)計(jì)模式是工作經(jīng)驗(yàn)的結(jié)晶
工程化
B2C商城項(xiàng)目實(shí)戰(zhàn)
轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)文章