迅雷(XUNLEI)的工作原理揭密
迅雷(XUNLEI)如何搜索一個(gè)資源的多服務(wù)器版本?
-------實(shí)現(xiàn)一個(gè)類似迅雷的系統(tǒng)“福雷(FULEI)”
摘要:
當(dāng)你用迅雷下載東西時(shí),無論你是從迅雷資源頁(yè)點(diǎn)下載,還是從其它普通頁(yè)面點(diǎn)下載,你會(huì)發(fā)現(xiàn)它并不只用你的原始鏈接下載,它還搜索了一些其它服務(wù)器的相同資源,比起網(wǎng)絡(luò)螞蟻/網(wǎng)際快車之類的下載工具(這些都是純客戶端工具,而迅雷則有著服務(wù)器支持),大大增加成功下載的可能性和下載的速度,對(duì)比起P2P之類的下載軟件,又更干凈利落一些,那它是如何做到的呢?其實(shí)同baidu,google的基本原理是一樣的,只不過各自的技術(shù)又有側(cè)重而已,本文就個(gè)人經(jīng)驗(yàn)分析其實(shí)現(xiàn)渠道及基本原理,暫稱這個(gè)系統(tǒng)為福雷(FULEI),同本人名字有點(diǎn)諧音,呵呵,寫下此文,也不枉昨晚失眠的幾十分鐘。
搜索,視頻, 迅雷,p2p,下載,google,baidu,search,
?
轉(zhuǎn)載請(qǐng)注明出處及作者(http://blog.csdn.net/mudboy??? mudboy@csdn)
?
下載電影,音樂之類的大文件(相對(duì)于網(wǎng)頁(yè))相信是每一個(gè)年輕人最愛干的一件事之一了,在這個(gè)P2P下載軟件橫行的時(shí)代,為什么像迅雷這樣的客戶/服務(wù)器模式還能有那么大市場(chǎng)呢?我曾試過好幾款P2P下載軟件(如電騾,天網(wǎng)MAZE等),但沒用多久就被我卸載了,我不喜歡被人家不斷讀硬盤的感覺,因?yàn)樗鼈冊(cè)鴼Я宋乙粔K硬盤,而且占了我太多的上行帶寬,個(gè)人認(rèn)為,如果要用這類軟件,別裝在你的工作用機(jī)/學(xué)習(xí)用機(jī)上,而應(yīng)專門用一臺(tái)破機(jī)器去運(yùn)行它。使用迅雷還是一兩個(gè)月以前的事,因?yàn)樵诖酥?#xff0c;我主要還是用網(wǎng)際快車之類的軟件下載東西,這類軟件是純客戶端軟件,更多的無非是下載管理/斷點(diǎn)續(xù)傳/多線程下載之類的功能,下載速度基本上取決于資源鏈接服務(wù)器和網(wǎng)絡(luò)的速度,迅雷本身的客戶端功能同上述功能差不多,不同的只是它可以從迅雷自已的服務(wù)器中獲取其它服務(wù)器的相同資源信息,使單個(gè)資源可以從多個(gè)服務(wù)器/多線程/斷點(diǎn)續(xù)傳的下載,增加了資源成功下載的機(jī)率和速度,從我的使用過程看,很多資源的下載速度決不亞于P2P軟件,甚至還更快,但相對(duì)于P2P,人家不會(huì)從我的機(jī)器上下載內(nèi)容,更不會(huì)占用我的上行帶寬,可以放心的在工作機(jī)上使用。
迅雷的這個(gè)點(diǎn)子,的確是個(gè)好點(diǎn)子!其實(shí)仔細(xì)想想,這其實(shí)只是個(gè)中庸的點(diǎn)子而已,介于P2P和純客戶端下載軟件(如NETANTS,FLASHGET之類)之間的一個(gè)中庸點(diǎn)子,由此又驗(yàn)證了一句話:中庸在很多時(shí)候可能是最好的選擇。
我們的福雷要做同迅雷差不多的事,讀下文時(shí)可以暫將福字替換成迅。
談了這么多,還沒有談到一點(diǎn)技術(shù)性的內(nèi)容,真唐僧!
福雷做法的關(guān)鍵在哪里?在于當(dāng)用戶要下載一個(gè)資源時(shí),如何去找在其它服務(wù)器上的完全相同的資源!
回顧一下普通搜索引擎的做法:用Crawler沒日沒夜的下載網(wǎng)頁(yè),然后存儲(chǔ),索引(倒排表是很常用的做法),用戶搜索時(shí),它會(huì)根據(jù)索引找到符合的頁(yè)面,排序后,在本地服務(wù)器截取結(jié)果片段返回到客戶端。PDF/WORD等文檔的搜索也差不多,它們有個(gè)共同的特點(diǎn)是文件不太大,而且基本不太涉及版權(quán)問題,因而所有內(nèi)容在自己服務(wù)器上都有快照。
但對(duì)于視頻/音頻等較大的文件(動(dòng)則幾十兆上百兆到G級(jí)),如果按上述方式處理則會(huì)有一些問題,首先要爬完一個(gè)資源所消耗的代價(jià)太大,其次,即使下來了,也沒有太大的用處,你不能直接供用戶下載,這可能會(huì)遭遇訴訟,看看百度音樂搜索,以前搜出來的結(jié)果直接指向資源位置,現(xiàn)在還非得出一個(gè)對(duì)話框,將位置明示,生怕被人抓住把柄,個(gè)人認(rèn)為完全沒有必要,也許是為了應(yīng)付部分什么也不懂的官員,卻讓使用者感到不便。
既然是搜索,終歸需要先找到資源,這一點(diǎn)大家都一樣,基本的做法還是用Crawler,只不過,Crawler需要識(shí)別不同類型的資源區(qū)別對(duì)待,我們以視頻文件為例說明。
假如Crawler在工作的過程中標(biāo)識(shí)出了所有視頻文件的鏈接并交于特殊的處理程序處理,接下來的問題如何存儲(chǔ)和索引這些信息,剛才已經(jīng)說了,要下載整個(gè)視頻文件并不現(xiàn)實(shí),而有一些內(nèi)容是很容易得到的:資源鏈接,文件名/文件類型(擴(kuò)展名),大小,存儲(chǔ)這些信息是簡(jiǎn)單且必要的,
現(xiàn)在的關(guān)鍵問題是如何判斷文件的同價(jià)性?也就是說,如何知道這幾個(gè)文件是一樣的?存儲(chǔ)這個(gè)信息對(duì)我信至關(guān)重要,通過文件名?顯然不行,通過修改時(shí)間?作者?大小?等,都不太準(zhǔn)確,最常用的方法還是計(jì)算文件摘要,而計(jì)算文件摘要最常用的方法又是MD5(雖說MD5可以破解,但對(duì)于大眾化應(yīng)用,這種破解沒什么意義,而在非人為狀況下,MD5可以認(rèn)為是可靠的),但這又出現(xiàn)一個(gè)新的難題,計(jì)算摘要需要所在文件內(nèi)容,我們有以下選擇:
1、? 能不能在服務(wù)器上計(jì)算?(可惜視頻不像些開源軟件,下載鏈接中常有MD5摘要文件,這樣可以一并下來),而想在服務(wù)器上計(jì)算,是否有些異想天開?
2、? 下載所有內(nèi)容計(jì)算摘要,上面已經(jīng)說過這個(gè)問題
3、? 下載部分內(nèi)容計(jì)劃摘要,聽起來真不錯(cuò),又是一個(gè)中庸的想法,我現(xiàn)在越來越喜歡中庸了,沒錯(cuò),就是它,但下載哪部分內(nèi)容呢?我們可以根據(jù)文件大小利用一些簡(jiǎn)單的散列算法生成散列值,根據(jù)這些值在文件的不同部分讀取一定量的數(shù)據(jù),總數(shù)據(jù)量控制在K級(jí)別(同網(wǎng)頁(yè)差不多大小),然后將這些數(shù)據(jù)拼裝成整體存儲(chǔ)并生成其摘要。這種方法是可行的。首先,它的下載量不大,其次,根據(jù)該方法判文件的等價(jià)性同基準(zhǔn)方法(根據(jù)所有數(shù)據(jù)算摘要)比準(zhǔn)確率幾乎相同(證明過程我就不說了,實(shí)踐才是最好的標(biāo)誰(shuí))
利用摘要判斷文件等價(jià)性的方法有一個(gè)好處是可以忽略一些次要信息,比如文件名,創(chuàng)建時(shí)間,修改時(shí)間等,但文件類型,長(zhǎng)度和摘要?jiǎng)t是需要考慮的成份。也就是說,如果這三者一樣,則我們認(rèn)為文件是一樣的。
存儲(chǔ)完上述信息,至于如何索引,考慮的因素可能會(huì)多一些,最簡(jiǎn)單的就以摘要索引就行,這樣等價(jià)資源會(huì)被聚類到一起,但作為一個(gè)資源聚集點(diǎn),資源的描述信息也是要考慮進(jìn)去的,等下我們會(huì)專門談到這個(gè)問題。
上面已經(jīng)講完了主要內(nèi)容,我們看看當(dāng)我們利用福雷下載時(shí)它做了一些什么事情。
1、? 先看看普通的鏈接(非福雷鏈接)
a)???????? 用戶在任何一個(gè)網(wǎng)站想用其下載資源:http://blog.csdn.net/mudboy/movie/wanfang.rmvb
b)??????? 福雷客戶端將該連接發(fā)到福雷服務(wù)器,同時(shí),客戶端也不閑著,它會(huì)去該鏈接獲取文件的基本信息(大小等),并按上面所述的算法下載部分內(nèi)容并計(jì)算摘要。
c)??????? 服務(wù)端根據(jù)鏈接找自己服務(wù)器,看是否已被系統(tǒng)Crawler處理過,如果已被處理過,很簡(jiǎn)單,通過其摘要找到所有含有該資源的服務(wù)器鏈接發(fā)到客戶端。
d)??????? 客戶端為了保險(xiǎn)起見,會(huì)對(duì)比一下服務(wù)端的摘要和自己算出的摘要(避免文件在近期發(fā)生變動(dòng)),如果一至,OK,可以從服務(wù)端發(fā)過來的多服務(wù)器下載了。
e)???????? 如果不一樣的話,客戶端需將該信息發(fā)到服務(wù)端,告訴它文件有變,服務(wù)端會(huì)去更新該文件的相關(guān)信息(包括等價(jià)文件鏈接),這個(gè)過程可以短也可能長(zhǎng),由此同時(shí),客戶端會(huì)通過原始鏈接開始下載,服務(wù)端更新后,會(huì)陸續(xù)將確認(rèn)后的鏈接發(fā)到客戶端,客戶端從而可又可從新增的鏈接下載。
f)???????? 接c),如果服務(wù)端未找到原始鏈接呢?是不是意味著服務(wù)端就沒有其它鏈接呢?并不一定,此時(shí),客戶端將信息及摘要發(fā)到服務(wù)端,服務(wù)端可根據(jù)摘要數(shù)據(jù)去搜索,如果搜索到結(jié)果,則將這些結(jié)果鏈接發(fā)到客戶端,并將該原始鏈接加入到服務(wù)器索引中,從而同樣實(shí)現(xiàn)多服務(wù)器下載,如果沒搜索到,則只能從原始鏈接下載資源了。
g)??????? 在上一步中,如果服務(wù)器沒找到原始鏈接也沒找到等價(jià)文件,服務(wù)端會(huì)存儲(chǔ)該并索引該鏈接信息。
h)??????? 在上述過程中,對(duì)于福雷服務(wù)器沒有的原始鏈接,用戶可以在門戶去發(fā)布該資源,此時(shí),用戶就可以填入一些該資源的描述信息(這一步要都由公司人員去做,幾乎是不可能的),成千上萬(wàn)的網(wǎng)民這樣做,門戶內(nèi)容就豐富了(不僅有視頻,還有視頻的描述信息等其它一些元數(shù)據(jù),前面提到索引方式,如果加上這部分內(nèi)容的索引,又進(jìn)一步實(shí)現(xiàn)在基于關(guān)鍵字的搜索)這本身又有點(diǎn)WEB2.0的概念,由網(wǎng)友自發(fā)來聚集和編輯視頻信息。
2、? 再看看專用鏈接,比如,你通過雷區(qū)找到的資源,有一些鏈接類似如下形式:
thunder://QUFmdHA6BDCsdi/ry+L1Byaxfdif=
對(duì)于這類鏈接,其實(shí)相當(dāng)于一個(gè)映射而已,比如,在上一節(jié)的h)步驟中,用戶發(fā)布了一些資源,這個(gè)資源在福雷服務(wù)器中找到了一系列等價(jià)資源,這個(gè)搜索等價(jià)資源的過程是需要消耗服務(wù)器資源的(這個(gè)資源是指CPU/內(nèi)存等機(jī)器資源),這樣,可以專為該資源生成一個(gè)URL,該URL就對(duì)應(yīng)上述鏈接信息的索引以及用戶輸入的視頻元數(shù)據(jù)信息,這樣,用戶可以很容易通過關(guān)鍵字搜到該視頻,同時(shí)使用這類URL下載時(shí),沒有一個(gè)搜索等價(jià)資源的過程,直接就可以返回一系列服務(wù)器鏈接到客戶端,直接實(shí)現(xiàn)多服務(wù)器下載。
?
說了這么多,本來應(yīng)該畫個(gè)框架圖流程圖什么的,但愿說清楚了,有什么好的想法可以多交流。
?
總結(jié)
以上是生活随笔為你收集整理的迅雷(XUNLEI)的工作原理揭密的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 慎用AXIS2
- 下一篇: 慎用AXIS2(续)