更新時(shí)間:2019-10-12 10:03:26 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2379次
大部分人對(duì)于BAT的技術(shù)有一種莫名的崇拜感,覺(jué)得只有非常牛逼和天才才能做出現(xiàn)在的這些系統(tǒng),但經(jīng)過(guò)前面兩篇博文的分析,我們可以看到其實(shí)并沒(méi)有什么神秘的力量和魔力融合在技術(shù)里面,而是業(yè)務(wù)的不斷發(fā)展推動(dòng)技術(shù)的不斷發(fā)展,一步一個(gè)腳印,持續(xù)幾年甚至十幾年的發(fā)展,才能達(dá)到當(dāng)前技術(shù)復(fù)雜度、先進(jìn)性、厲害度。
拋開(kāi)BAT各自差異很大的業(yè)務(wù),站在技術(shù)的角度來(lái)看,其實(shí)BAT的技術(shù)架構(gòu)基本是一樣的,再將視角放大,你會(huì)發(fā)現(xiàn)整個(gè)互聯(lián)網(wǎng)行業(yè)的技術(shù)發(fā)展,最后都是殊途同歸。
如果你正處于一個(gè)創(chuàng)業(yè)公司,或者正在成為另一個(gè)BAT的路上而拼搏,那么深入理解這種技術(shù)模式(或者叫技術(shù)結(jié)構(gòu)、技術(shù)架構(gòu)),對(duì)于自己的發(fā)展、公司的發(fā)展都大有裨益,你將不會(huì)再迷茫,你也不再會(huì)心里打鼓,CTO將對(duì)你刮目相看,CEO將奉你為神明:)
接下來(lái)小編將逐一介紹每個(gè)技術(shù)點(diǎn),包括為什么會(huì)有這些技術(shù)點(diǎn),這些技術(shù)點(diǎn)的主要場(chǎng)景是什么,這些技術(shù)點(diǎn)將如何發(fā)展。
即關(guān)系數(shù)據(jù)。前幾年NoSQL火了一陣子,很多人都理解為NoSQL是完全拋棄關(guān)系數(shù)據(jù),全部采用非關(guān)系型數(shù)據(jù),但事實(shí)經(jīng)過(guò)幾年的試驗(yàn)后,大家發(fā)現(xiàn)關(guān)系數(shù)據(jù)不可能完全拋棄,NoSQL不是NoSQL,而是NotOnlySQL,即NoSQL是SQL的補(bǔ)充。
所以互聯(lián)網(wǎng)行業(yè)也必須依賴(lài)關(guān)系數(shù)據(jù),考慮到Oracle太貴,還需要專(zhuān)人維護(hù),一般情況下互聯(lián)網(wǎng)行業(yè)都是用MySQL、PostgreSQL這類(lèi)開(kāi)源數(shù)據(jù)庫(kù)。這類(lèi)數(shù)據(jù)庫(kù)的特點(diǎn)是開(kāi)源免費(fèi),拿來(lái)就用;但缺點(diǎn)是性能相比商業(yè)數(shù)據(jù)庫(kù)要差較多。隨著互聯(lián)網(wǎng)業(yè)務(wù)的發(fā)展,性能要求越來(lái)越高,必然要面對(duì)一個(gè)問(wèn)題:將數(shù)據(jù)拆分到多個(gè)數(shù)據(jù)庫(kù)實(shí)例才能滿(mǎn)足業(yè)務(wù)的性能需求(其實(shí)Oracle也一樣,只是時(shí)間早晚的問(wèn)題)。
數(shù)據(jù)庫(kù)拆分滿(mǎn)足了性能的要求,但帶來(lái)了復(fù)雜度的問(wèn)題:數(shù)據(jù)如何拆分、數(shù)據(jù)如何組合。這個(gè)復(fù)雜度的問(wèn)題解決起來(lái)并不是那么容易,如果每個(gè)業(yè)務(wù)都去實(shí)現(xiàn)一遍,重復(fù)造輪子將導(dǎo)致投入浪費(fèi)、效率降低,業(yè)務(wù)開(kāi)發(fā)想快都快不起來(lái)。
所以互聯(lián)網(wǎng)公司流行的做法是發(fā)展到一定階段后,就會(huì)將這部分功能獨(dú)立成中間件,例如百度的DBProxy、淘寶的TDDL。不過(guò)這部分的要求很高,將分庫(kù)分表做到自動(dòng)化和平臺(tái)化,不是一件容易的事情,所以一般是很牛逼的公司才會(huì)做。典型的有:百度的DBProxy、淘寶TDDL。
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無(wú)一例外的都會(huì)將性能作為自己的一大買(mǎi)點(diǎn)。
NoSQL的這兩個(gè)特點(diǎn)很好的彌補(bǔ)了關(guān)系數(shù)據(jù)庫(kù)的不足,因此在互聯(lián)網(wǎng)行業(yè)NoSQL的應(yīng)用基本上是基礎(chǔ)要求,要是你聽(tīng)到一個(gè)號(hào)稱(chēng)自己是互聯(lián)網(wǎng)公司卻連NoSQL都沒(méi)用,那基本上可以判斷是掛羊頭賣(mài)狗肉類(lèi)型的。
由于NoSQL方案一般都會(huì)自己本身就提供集群的功能,例如Memcached的一致性hash集群、Redis3.0的集群,因此NoSQL在剛開(kāi)始應(yīng)用的時(shí)候很方便,不像SQL分庫(kù)分表那么復(fù)雜。一般公司也不會(huì)在開(kāi)始的時(shí)候就考慮將NoSQL包裝成存儲(chǔ)平臺(tái),但如果公司發(fā)展很大,例如Memcached的節(jié)點(diǎn)有上千甚至幾千的時(shí)候,NoSQL集群就很有意義了:首先是集中管理能夠大大提升運(yùn)維效率;其次是集中管理可以大大提升資源利用效率,2000臺(tái)機(jī)器,如果利用率能提升10%,就是減少200臺(tái)機(jī)器,一年幾十萬(wàn)就節(jié)省出來(lái)了。
所以,NoSQL發(fā)展到一定規(guī)模后,一般都是走集群路線(xiàn),當(dāng)然要發(fā)展到這個(gè)階段,一般也是很牛逼的公司才會(huì)這么做。
典型的有:Twitter的Twemproxy,豆瓣的BeansDB、騰訊TTC。
小文件存儲(chǔ)
除了關(guān)系型的業(yè)務(wù)數(shù)據(jù)外,互聯(lián)網(wǎng)行業(yè)還有很多用于展示的數(shù)據(jù),例如淘寶的商品圖片、商品描述;Facebook的用戶(hù)圖片,新浪微博的一條微博內(nèi)容等等。這些數(shù)據(jù)具有3個(gè)典型特征:一是數(shù)據(jù)小,一般在1M一下;二是數(shù)量巨大,F(xiàn)acebook2013年就達(dá)到了每天上傳3.5億張的照片;三是訪(fǎng)問(wèn)量巨大,F(xiàn)acebook每天的訪(fǎng)問(wèn)量超過(guò)10億。
由于互聯(lián)網(wǎng)行業(yè)基本上每個(gè)業(yè)務(wù)都會(huì)有大量的小數(shù)據(jù),如果每個(gè)業(yè)務(wù)都自己去考慮如何設(shè)計(jì)海量存儲(chǔ)和海量訪(fǎng)問(wèn),效率自然會(huì)低,重復(fù)造輪子,投入浪費(fèi),自然而然的想法就是將小文件存儲(chǔ)做成統(tǒng)一的和業(yè)務(wù)無(wú)關(guān)的平臺(tái)。
和SQL和NoSQL不同的是,小文件存儲(chǔ)不一定需要公司或者業(yè)務(wù)規(guī)模很大,基本上可以認(rèn)為業(yè)務(wù)在起步階段就可以考慮做小文件統(tǒng)一存儲(chǔ)。得益于開(kāi)源運(yùn)動(dòng)的發(fā)展和最近幾年大數(shù)據(jù)的火爆,在開(kāi)源方案的基礎(chǔ)上封裝一個(gè)小文件存儲(chǔ)平臺(tái)并不是太難的事情。例如HBase、Hadoop、Hypertable、FastDFS等都可以作為小文件存儲(chǔ)的底層平臺(tái),只需要在這些開(kāi)源方案三再包裝一下基本上就可以用了。
典型的有:淘寶的TFS、京東JFS、Facebook的Haystack。
在系列文章的第2篇《BAT解密:業(yè)務(wù)如何驅(qū)動(dòng)技術(shù)發(fā)展》中我們深入分析了互聯(lián)網(wǎng)業(yè)務(wù)發(fā)展的一個(gè)特點(diǎn):復(fù)雜性越來(lái)越高。復(fù)雜性增加的典型現(xiàn)象就是系統(tǒng)越來(lái)越多,不同的系統(tǒng)由不同的小組開(kāi)發(fā)。如果每個(gè)小組用不同的開(kāi)發(fā)框架和技術(shù),將會(huì)帶來(lái)很多問(wèn)題,典型的問(wèn)題有:
技術(shù)人員之間沒(méi)有共同的技術(shù)語(yǔ)言,交流合作少
每類(lèi)技術(shù)都需要投入大量的人力和資源和熟練精通
不同團(tuán)隊(duì)之間人員無(wú)法快速流動(dòng),人力資源不能高效的利用
所以,互聯(lián)網(wǎng)公司都會(huì)指定一個(gè)大的技術(shù)方向,然后使用統(tǒng)一的開(kāi)發(fā)框架,例如Java相關(guān)的開(kāi)發(fā)框架SSH、SpringMVC、Play、Ruby的RubyonRails、PHP的ThinkPHP、Python的Django等等。使用統(tǒng)一的開(kāi)發(fā)框架能夠解決上面提到的各種問(wèn)題,大大提升組織和團(tuán)隊(duì)的開(kāi)發(fā)效率。
對(duì)于框架的選擇,有一個(gè)總的原則:優(yōu)選成熟的框架,避免盲目追逐新技術(shù)!為什么呢?
首先,成熟的框架資料文檔齊備,各種坑基本上都有人踩過(guò)了,遇到問(wèn)題很容易通過(guò)搜索解決
其次,成熟的框架受眾更廣,招聘時(shí)更加容易招聘到合適的人才
第三,成熟的框架更加穩(wěn)定,不會(huì)出現(xiàn)大的變動(dòng),適合長(zhǎng)期發(fā)展
以我親身經(jīng)歷的一個(gè)反例為例:我們使用了Play1作為Java開(kāi)發(fā)框架,因?yàn)樗禽p量級(jí)的Java開(kāi)發(fā)框架,但沒(méi)想到Play2直接改為Scala語(yǔ)言開(kāi)發(fā),Play1的架構(gòu)演進(jìn)停滯,而我們又不能切換為Play2,結(jié)果就導(dǎo)致只能一直用Play1,有新的需求只能自己開(kāi)發(fā)。
服務(wù)器
開(kāi)發(fā)框架只是負(fù)責(zé)完成業(yè)務(wù)功能的開(kāi)發(fā),真正能夠運(yùn)行起來(lái),給用戶(hù)提供服務(wù),還需要服務(wù)器配合。
獨(dú)立開(kāi)發(fā)一個(gè)成熟的web服務(wù)器,成本非常高;且業(yè)界又有那么多成熟的開(kāi)源web服務(wù)器,所以互聯(lián)網(wǎng)行業(yè)基本上都是拿來(lái)主義,挑選一個(gè)流行的開(kāi)源服務(wù)器即可。牛逼一點(diǎn)的公司,可能會(huì)在開(kāi)源服務(wù)器的基礎(chǔ)上,結(jié)合自己的業(yè)務(wù)特點(diǎn)做二次開(kāi)發(fā),例如淘寶的Tengine,但一般公司基本上只需要將開(kāi)源服務(wù)器摸透,優(yōu)化一下參數(shù),調(diào)整一下配置就差不多了。
選擇一個(gè)服務(wù)器主要和開(kāi)發(fā)語(yǔ)言相關(guān),例如:Java的有Tomcat、Jboss、Resin等,PHP/Python的用Nginx,當(dāng)然最保險(xiǎn)的就是用Apache了,什么語(yǔ)言都支持。
有的人可能擔(dān)心Apache的性能之類(lèi)的問(wèn)題,其實(shí)不用過(guò)早擔(dān)心這個(gè),等到你的業(yè)務(wù)真的發(fā)展到Apache撐不住的時(shí)候再考慮切換也可以,那時(shí)候你有的是錢(qián),有的是人,有的是時(shí)間。
容器
容器是最近幾年年才開(kāi)始火起來(lái)的,其中以Docker為代表,在BAT級(jí)別的公司已經(jīng)有較多的應(yīng)用,例如騰訊:騰訊萬(wàn)臺(tái)規(guī)模的Docker應(yīng)用實(shí)踐;新浪微博:微博紅包:大規(guī)模Docker集群實(shí)踐經(jīng)驗(yàn)分享等等。
傳統(tǒng)的虛擬化技術(shù)是虛擬機(jī),解決了跨平臺(tái)的問(wèn)題,但由于虛擬機(jī)太龐大,啟動(dòng)慢,運(yùn)行時(shí)太占資源,在互聯(lián)網(wǎng)行業(yè)并沒(méi)有大規(guī)模的應(yīng)用;而Docker的容器技術(shù),雖然沒(méi)有跨平臺(tái),但啟動(dòng)快,幾乎不占資源,推出后立刻就火起來(lái)了,預(yù)計(jì)Docker類(lèi)的容器技術(shù)將是技術(shù)發(fā)展的主流方向。
千萬(wàn)不要以為Docker只是一個(gè)虛擬化或者容器技術(shù),它將在很大程度上改變我們目前的技術(shù)形勢(shì):
運(yùn)維方式會(huì)發(fā)生革命性的變化:Docker啟動(dòng)快,幾乎不占資源,隨時(shí)啟動(dòng)和停止,基于Docker打造自動(dòng)化運(yùn)維、智能化運(yùn)維將成為主流方式
設(shè)計(jì)模式會(huì)發(fā)生本質(zhì)化的變化:?jiǎn)?dòng)一個(gè)新的容器實(shí)例代價(jià)如此低,將鼓勵(lì)設(shè)計(jì)思路朝“微服務(wù)”的方向發(fā)展。
例如一個(gè)傳統(tǒng)的網(wǎng)站包括登錄注冊(cè)、頁(yè)面訪(fǎng)問(wèn)、搜索等功能,沒(méi)有用容器的情況下,除非有特別大的訪(fǎng)問(wèn)量,否則這些功能開(kāi)始時(shí)都是集成在一個(gè)系統(tǒng)里面的;有了容器技術(shù)后,一開(kāi)始設(shè)計(jì)就可以將這些功能按照服務(wù)的方式設(shè)計(jì),避免后續(xù)訪(fǎng)問(wèn)量增大時(shí)又要重構(gòu)系統(tǒng)。
如何學(xué)習(xí)呢?有沒(méi)有Java架構(gòu)師學(xué)習(xí)視頻教程?咨詢(xún)動(dòng)力節(jié)點(diǎn)官網(wǎng)在線(xiàn)老師:回復(fù)“Java架構(gòu)師資源”
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743