常常在論壇里看到大家為編程語言孰優(yōu)孰劣爭個你死我活,很多想從事計(jì)算機(jī)和互聯(lián)網(wǎng)技術(shù)的人還在為選擇什么樣的計(jì)算機(jī)技術(shù)而猶豫不決,今天跟大家一起探討一下,我們該怎么考慮這個問題?另外,應(yīng)大家的要求,談一下我看到的在大型的互聯(lián)網(wǎng)技術(shù)公司里,需要什么樣的技術(shù)。
技術(shù)不一定要最好的,能滿足用戶需求就好
相信很多人都用過諸如265網(wǎng)址導(dǎo)航之類的站點(diǎn),很多做技術(shù)人的對此不屑一顧,不就一個簡單的導(dǎo)航頁面嗎,有什么了不起的;但是你可知道這個站點(diǎn)可是很多中國網(wǎng)民每天必上的網(wǎng)站!它通過網(wǎng)址的分類導(dǎo)航方式,讓那些記不住英文域名和不清楚互聯(lián)網(wǎng)上有什么好玩的人,快速的到達(dá)目的地,就是這樣一個看似簡單的網(wǎng)站,卻能在Alexa全球網(wǎng)站排名2000多,而且被谷歌高價(jià)收購。
所以,今天想跟各位做技術(shù)的人分享一個觀點(diǎn),也是一個非常淺顯的道理,就是人類社會的所有科學(xué)技術(shù),最終是為使人類更好的生活服務(wù)的;對于任何想掌握互聯(lián)網(wǎng)技術(shù)和軟件編程技術(shù)的人來講,考慮問題的出發(fā)點(diǎn)是,現(xiàn)在人們在使用互聯(lián)網(wǎng)和軟件時(shí)碰到了什么問題,而不是首先考慮哪門技術(shù)更強(qiáng)悍、用的人更多,“簡單就是美”,“未必最好,合適就好”也是軟件系統(tǒng)設(shè)計(jì)的一些重要原則。
構(gòu)建大型互聯(lián)網(wǎng)站點(diǎn),需要什么樣的技術(shù)?
如之前所述,需要什么樣的技術(shù),關(guān)鍵在于我們要了解作為大型互聯(lián)網(wǎng)站點(diǎn),它要為用戶提供優(yōu)質(zhì)的軟件系統(tǒng)體驗(yàn),面臨著什么樣的問題和挑戰(zhàn)。希望通過今天的分享,對于那些想從事軟件和互聯(lián)網(wǎng)技術(shù)的新人,有一些啟發(fā),能挑選到適合自己的技術(shù)路子。
我現(xiàn)在服務(wù)的這家公司,現(xiàn)在面臨的挑戰(zhàn)是每天有上幾千萬用戶、上億次的頁面訪問、幾十個G的數(shù)據(jù)插入,面對如此龐大的訪問量和數(shù)據(jù)吞吐量,如何保證網(wǎng)站快速、穩(wěn)定,讓用戶擁有良好的訪問體驗(yàn),是這個階段的主要挑戰(zhàn),而要解決這種挑戰(zhàn),光靠某種優(yōu)秀的編程語言是解決不了的,這個階段往往需要多種技術(shù)參與解決,那下面就談?wù)剺?gòu)建大型網(wǎng)站的一些常用技術(shù)和思想:
1、緩存技術(shù):主要分為前端緩存技術(shù)和后端數(shù)據(jù)緩存技術(shù)
前端緩存技術(shù),主要是把一些用戶經(jīng)常訪問但更新又不太頻繁的頁面(或者頁面中的某一部分,比如一些大型論壇中壇子分類導(dǎo)航部分)進(jìn)行緩存,在用戶每次訪問到這些頁面時(shí)可以直接從緩存里加載信息,這樣做既提高了用戶訪問速度,又減輕了對后端服務(wù)器的訪問壓力,常用的前端緩存技術(shù)有Squid、ESI(Edge Side Includes)等;后端數(shù)據(jù)緩存技術(shù),主要是針對數(shù)據(jù)庫做的緩存,隨著用戶訪問量的增加,數(shù)據(jù)庫的鏈接開銷和運(yùn)算量越來越大,這個時(shí)候可以把一些用戶訪問頻繁的數(shù)據(jù),放到本地內(nèi)存,用戶請求進(jìn)來先到本地內(nèi)存里拿數(shù)據(jù),只有內(nèi)存里找不到數(shù)據(jù)時(shí)才會請求數(shù)據(jù)庫,這樣可以大大降低數(shù)據(jù)庫壓力。
2、CDN(Content Delivery Network)內(nèi)容分發(fā)網(wǎng)絡(luò)技術(shù)
這是一種網(wǎng)站內(nèi)容的分發(fā)技術(shù),通過CDN技術(shù),可以將網(wǎng)站內(nèi)容發(fā)布到離用戶最近的網(wǎng)絡(luò)。一家大型網(wǎng)站往往在全球通過不同的電信運(yùn)營商(在中國主要為電信和網(wǎng)通)托管上千個機(jī)房,通過CDN技術(shù),可以讓用戶每次在訪問網(wǎng)站時(shí),由離用戶最近的、最匹配的運(yùn)營商的節(jié)點(diǎn)為用戶供內(nèi)容。比如你家在東北,使用電信網(wǎng)絡(luò),訪問在杭州的一家網(wǎng)站,在這個網(wǎng)站沒有使用CDN技術(shù)之前,你要訪問到這家網(wǎng)站的內(nèi)容,你發(fā)出一個請求可能需要經(jīng)過山東、江蘇、浙江等幾個省市的電信、網(wǎng)通的的交換機(jī)、路由器,最終到達(dá)杭州;但有了CDN技術(shù)后,你的請求發(fā)出后,它會在東北找一個離你最近的節(jié)點(diǎn)響應(yīng)你的請求,這樣可以大大縮短響應(yīng)時(shí)間和減少網(wǎng)絡(luò)出錯的機(jī)會。CDN主要用到的技術(shù)為Web Cache技術(shù)和DNS負(fù)載均衡技術(shù)。
3、集群技術(shù):主要分為前端WebServer的集群和后端DB數(shù)據(jù)庫集群。
通過集群技術(shù),讓多臺計(jì)算機(jī)完成同一個工作,以提高網(wǎng)站的性能和可用性。通常一個網(wǎng)站一天有幾百個用戶、上萬次的頁面請求、少量的數(shù)據(jù)庫讀寫時(shí),基本上用一臺廉價(jià)的PCServer就可以撐得住,人數(shù)再多點(diǎn)時(shí)可以換臺好點(diǎn)的設(shè)備基本上也能撐得住,另外這個時(shí)候由于用戶數(shù)不大,服務(wù)器偶爾停幾次機(jī),影響面也不大;但是如果有一天網(wǎng)站訪問的用戶達(dá)到千萬、頁面請求次數(shù)上億,有頻繁的數(shù)據(jù)讀寫時(shí),一臺性能再好的服務(wù)器,也往往撐不住這么巨大的訪問量,這個時(shí)候通過對單臺設(shè)備硬件升級進(jìn)行做垂直擴(kuò)展(增加內(nèi)存、CPU等)用處已經(jīng)不大,另外即使單臺設(shè)備能撐得住這么大的用戶訪問,但卻無法避免設(shè)備出故障,在這種訪問量下,設(shè)備出1秒鐘的故障往往都是不可接受的,畢竟訪問用戶數(shù)太大了,這個時(shí)候就要考慮利用集群技術(shù),做水平擴(kuò)展,通過不斷的增加設(shè)備,用多臺設(shè)備提供同樣的計(jì)算服務(wù)來分擔(dān)用戶的請求,大大提高了計(jì)算效率,也避免了某個單點(diǎn)出故障網(wǎng)站便不能提供服務(wù)的問題,網(wǎng)站可用性大大提高。
大型網(wǎng)站,webserver跟DB物理上是分開部署的(一般我們平常做程序練習(xí)時(shí)才會部署在同一臺計(jì)算機(jī)上),這樣的好處是二者相互不影響,避免應(yīng)用出問題時(shí),數(shù)據(jù)庫也受影響;它們的分開,就意味著我們既可以做web server的集群,也可以做DB的集群,在早期數(shù)據(jù)庫一般是集中式的,多臺webserver訪問一臺數(shù)據(jù)庫,但是隨著webserver的不停增加,數(shù)據(jù)庫鏈接開銷越來越大,單臺DB往往撐不住這么多的請求,這時(shí)候就要考慮DB的集群了,像MySql數(shù)據(jù)庫,對集群支持的就非常不錯。
要構(gòu)建web服務(wù)器集群,涉及到的關(guān)鍵技術(shù)有:負(fù)載均衡技術(shù)(包括硬件負(fù)載和軟件負(fù)載)、Session、cookie的復(fù)制和保持技術(shù)(主要解決在分布式環(huán)境里,在不同的服務(wù)器間,用戶的臨時(shí)請求信息能得以保持,而不至于請求分發(fā)到不同的服務(wù)器上造成數(shù)據(jù)丟失的問題);數(shù)據(jù)庫的集群,往往跟特定的數(shù)據(jù)庫集群技術(shù)有關(guān),這個需要對特定的數(shù)據(jù)庫進(jìn)行研究。
4、數(shù)據(jù)庫的分庫、分表和讀寫分離技術(shù)
分庫技術(shù),不是所有的數(shù)據(jù)庫對集群支持的很好,隨著數(shù)據(jù)量的增加,數(shù)據(jù)庫的空間和表的空間越來越大,讀寫速度也會越來越慢,如果數(shù)據(jù)庫不支持集群的話,就要考慮另一種替代方案——數(shù)據(jù)庫的分庫、分表策略,把同一個數(shù)據(jù)庫,拆成幾個結(jié)構(gòu)完全相同的數(shù)據(jù)庫,把同一張表,拆成幾張結(jié)構(gòu)完全相同的表,程序可以按照某種規(guī)則直接到特定的庫和表里進(jìn)行讀寫,這樣可以大大提高數(shù)據(jù)庫的響應(yīng)時(shí)間。實(shí)現(xiàn)數(shù)據(jù)庫的分庫、分表,除了要對數(shù)據(jù)庫動手術(shù)意外,往往也要對程序進(jìn)行調(diào)整,這個時(shí)候往往會去實(shí)現(xiàn)一個DAL框架,由它負(fù)責(zé)在接到web服務(wù)器請求后,按照某種規(guī)則路由到特定的庫(表)進(jìn)行數(shù)據(jù)讀寫和合并。
讀寫分離技術(shù),采用這個技術(shù)的原因,是很多大型網(wǎng)站統(tǒng)計(jì)發(fā)現(xiàn),數(shù)據(jù)庫的讀寫比例相差懸殊,比如ebay的讀寫比例為260:1,這也就意味著在這樣網(wǎng)站中,數(shù)據(jù)庫主要工作在忙著應(yīng)付用戶查詢,而不是寫入,而我們知道,由于數(shù)據(jù)庫的鎖機(jī)制和事務(wù)性一致策略,在執(zhí)行插入和更新操作時(shí),讀取速度會變慢;基于這個原因,很多大型站點(diǎn)會采用讀寫分離技術(shù),讓主庫處理事務(wù)性查詢,讓從庫處理SELECT查詢,這樣的話可以大大提高數(shù)據(jù)庫的響應(yīng)速度,如果你對這部分感興趣的話,可以研究一下Oracle 的logicalstandby、MySql的Replication、MysqlProxy。
5、J2EE技術(shù)
J2EE是一套全然不同于傳統(tǒng)應(yīng)用開發(fā)的技術(shù)架構(gòu),它是使用java技術(shù)開發(fā)企業(yè)級應(yīng)用的一種事實(shí)的工業(yè)標(biāo)準(zhǔn),是Java技術(shù)不斷適應(yīng)和促進(jìn)企業(yè)級應(yīng)用過程中的產(chǎn)物,由于后面還會對JAVA技術(shù)跟大家做分享,今天就不對J2EE技術(shù)在這里展開詳細(xì)討論了,大家感興趣的話,后面可以持續(xù)關(guān)注我的文章。
上面這些是我接觸到的大型互聯(lián)網(wǎng)站點(diǎn)的一些重要技術(shù),時(shí)間的關(guān)系,不能一一列全,通篇看下來,并沒有提到到用什么樣的編程語言去構(gòu)建這樣大型的互聯(lián)網(wǎng)站點(diǎn),今天也就是想通過這篇文章的分享,讓大家轉(zhuǎn)變一個固有的觀念, 技術(shù)能力的高低,不在于你掌握的編程語言難度的高低和功能是否強(qiáng)大,而在于你對現(xiàn)實(shí)問題的了解程度、處理問題的方法和手段的多寡以及處理問題的速度 ,等你掌握了一門編程語言以后,你會發(fā)覺差不多花前面語言一般的時(shí)間就可以掌握一門新的語言,這也說明了語言不是阻擋你技術(shù)進(jìn)步的門檻。