豆瓣的架構—專訪豆瓣網站的技術總監洪強寧

suzhouclark發表於2009-03-01
豆瓣的架構—專訪豆瓣網站的技術總監洪強寧[@more@]

本刊記者:好,現在開始,豆瓣是一個非常著名的Web2.0網站,你們的開發語言選擇的是Python,我想問的是,為什麼選擇Python?

洪強寧:我們選擇Python的理由是它是動態語言,具有動態語言的優點,比如開發特別迅速。我們做的是一個Web2.0的網站,這種 網站的特點就是always beta,使用者的需求在隨時發生變化,我們也不斷發現新的價值。所以網站的結構和程式會不斷變化,如果用Java做,你的開發量比較大,你就難以做出迅速 地改變。Python的特點就是開發迅速,你可以在一兩個小時,就做出一個功能。或者說已¾¬上線了,使用者反映需要某一功能,也可以比較快地做出來。


本刊記者:這就是TDD,敏捷開發的思路,和傳統的方式有些不同。但是會有另一方面的問題,Python的程式設計師好找嗎?在國內會Python的要比會Java程式設計師少的多。

洪強寧:對,確實是。在中國用Python的人確實不多,也給我們尋找開發任何人員帶來困難。不過從另一方面說,也有好處,因為沒有一個學校去教 Python,會Python的人都是自己學的,也就是說他知道自己需要什麼技術,而且能夠透過自學掌握它,包括Python的資料中文比較少,需要學習 者接觸第一手資料,這都使得Python程式設計師的平均水平,要比使用其他熱門語言的平均水平要高。另一方面Python也越來越流行,在國外比較流行的動 態語言有Perl,和Python,現在Python已經超過了Perl。


本刊記者:不過,在Web開發這方面有許多選擇,比如,Java,.NET,和PHP,在這個格局裡Python還是比較弱勢。

洪強寧:對,當然,它是新興語言。在未來,我相信,至少在在Web2.0網站開發方面,它會有自己的一個位置。


本刊記者:還有問一個問題,Python與Perl比較怎麼樣?因為Python的物件導向的特性好一些,程式碼看起來更容易理解一些吧,我以前是用 Perl寫程式的,覺得Perl的程式程式碼看起來比較亂。

洪強寧:對,Perl 是write once風格的,一個人寫完了,過一段時間,可能自己都不能看懂,它確實很強大,但比較適合當作個人工具使用,不太適合團隊的開發。Python的哲學是 解決問題的最好方式只有一種,這樣同樣的功能,每個人寫出來的程式樣子應該差不太多,比較易於理解,更適合團隊開發。


本刊記者:還有一個問題,,有一種說法,認為Python比較慢,在效能方面會不會有問題?

洪強寧:這個問題可以分兩個方面說,首先,說Python慢,這是和編譯語言比,比如與C,C++,Java比,在動態語言中,它並不慢,它比Ruby要 快,它和Perl效能相當。如果選擇動態語言的話,Python並不是很慢。另一方面,如果做網站開發,語言的不是速度的瓶頸,比如我把我們現在用 Python寫的程式全部用C寫,程式當然會快一點,但是改變不是很大。Web網站一般會有很多對IO的操作,比如對資料庫的訪問,對硬碟的訪問響應使用者 的請求,80%,90%你的時間都花在IO上,語言的速度,相對而言,不是那麼重要。也可以這樣說,網站的效能主要取決於架構設計的是否合理。因為網站需 要響應大量的併發的請求,如果你的設計的不好,即使你用C寫的,也可能無法應付。所以更多的考慮是在架構設計上,要使架構體系不會產生速度瓶頸。


本刊記者:那您能簡要地介紹一下豆瓣的架構嗎?

洪強寧:關於豆瓣的系統架構圖,首先我們在Web server上做個劃分,把網站內容分為動態內容和靜態內容。在豆瓣上所有的html都是動態內容,圖片都是靜態內容。分成兩個Web 服務可以做不同的調優。 對動態內容,我們用的是nginx和lighttpd的混合,nginx做負載的平衡,lighttpd透過 SCGi 與application server相連,application server是基於 quixote這個框架寫的。

application server拿到使用者的請求,分析使用者的url,並且利用外部的資源,比如資料庫,組合成一個html,返回。從資料庫存取會比較慢,資料庫有大量的 IO,我們使用cache,我們使用的是Memcached,這是一個分散式的記憶體的cache,比如你可以用很多機器,每個機器有兩個G的記憶體,我們自 己開發了client端來使用它,另外如果使用者有搜尋請求,我們會用搜尋引擎。Xapian是一個C++寫的開源的搜尋引擎,我們透過Web service去訪問它。其他,我們還提供了另外的Web service介面響應使用者的請求,比如要訪問某個檔案。spread是我們最近加了一部分,使用者有的請求可以採用這樣的非同步服務。

資料庫是這樣的,兩個MySQL做成一對,一個master ,一個 slave,根據應用劃分,使得load不會太高。這個圖上»¬的是兩對,實際上有三對。還有一個slave,一方面作為備份,一方面用作資料探勘,因為不能對線上的資料做直接操作。

對於靜態部分,我們也是用nginx,你注意到豆瓣現在有日記的貼圖功能系統,使用者可能上傳很多圖片,我們採用的方案是用了mogile FS ,這是一個分散式的檔案系統,同時可以做備份,保持高可用性,可以提高很大的IO。

關於application server,它都是用Python寫的。我們是用的MVC方式,Controller我們用的是quixote ,它接受使用者的請求,根據這個URL去找到Model的某個具體的函式來執行,它是一個dispatcher,當中會判斷使用者的許可權等。然後再傳給 View,View根據模版進行渲染,形成網頁。View的模版,我們以前是用的是PTL,PTL很高效,最近引用了mako,這是一個比較現代的開源的 模版,用它寫出的程式碼比較好維護,比PTL好維護一些.。同時,在使用mako的同時,我們的工程師做了很多加速的工作,現在mako的程式碼有很多是豆瓣 的人寫的。

你如果注意過Python的Web開發框架的話,你會發現Python的有三個比較著名的框架,Django,Pylons,TurboGears,Pylons預設的模版就是Mako。

下面的就是Model,業務模組,核心是類是User,因為Web2.0是以人為本,我們肯定會有一個User。只有人也做不了事情,還要有物。豆瓣的物,就是Subject,比如書,比如評論,比如小組等。

與資料庫進行連結,我們一個很輕量級的與資料庫進行連結,這也是一個開源專案,SQL Farm Manager。這個Web service,豆瓣中有很多用的都是Web service。


本刊記者:好,還想問您一個問題,Web2.0會不會也在架構設計中也有所體現呢 ?

洪強寧: Web2.0使用者的反覆的操作非常多,你需要一個非常流暢的體現。這需要一些技術來實現,比如Ajax;豆瓣花了很多錢很多精力,來提高效能,比如買好的 機器,使用Gentoo Linux,為什麼使用Gentoo Linux,因為它方便調優。還有,大量的使用cache。在資料庫調優方面,我們也花了很大的精力。

另一方面,Web 2,0是使用者提供資料的,使用者有很多寫操作。這樣很多1.0最佳化方法在2.0中行不通。豆瓣在資料庫上用的是分庫的方式。除此之外我們還嘗試了一些其他的方法。


本刊記者:我現在想問張貝南一個問題,您能否談一下Web2.0社群網站和傳統的社群網站的區別?比如天涯論壇,和豆瓣的區別。

張貝南:先說一下Web 2.0 的概念,傳統網站,使用者到這些網站,只是看資訊,這些資訊是怎麼來的呢,比如像Google,它是抓來的,或者像新浪這樣的入口網站,是使用者給你編好的。 你到這樣的網站,只是獲取資訊,你不能創造資訊,也不能決定它放的位置。按照業界的理解,Web 2.0相對於Web 1.0,它是以使用者為中心的,或者說是以使用者創造內容為主,並且可以決定展現方式。你剛才說的傳統的社群,在某種程度上,也可以說是2.0的,因為它也由 使用者提供內容。不過早期的BBS,網站以內容作分類,比如體育,軍事,文學等。使用者不能形成自己的分類。在豆瓣,使用者可以對任何一個話題進行討論,這完全 是使用者自主的。這還只是關係到豆瓣的小組的功能,如果拿天涯論壇和豆瓣做比較的話,豆瓣與天涯這樣的BBS不同還在於,它首先有一個物的概念,比如書,音 樂,和電影。


本刊記者:我也發現了這點。這樣的組織方式,給人的感覺會非常不同。比如我們要查詢對餘華的小說《活著》的評論,在豆瓣就比較容易 找到認真,有質量的評論。而在傳統的BBS上,你只能用查詢的方式,搜尋“活著”這個詞,找出的東西,也可能還不是談論《活著》這本小說的,而只是其中的 文字包含了“活著”這個詞,而且有很多無意義的吵架帖。豆瓣的組織方式,讓人感覺很嚴肅,雅氣。不過,我也發現了一個或許有些不便的地方,比如,我要在討 論德里達的小組回帖,在一般的BBS可以匿名,或具有一個ID就行了,但在豆瓣,我要首先參加德里達這個小組。

張貝南:對,是這樣的。豆瓣更關心的是人群,就是對同一話題和事物有興趣的人群,而不是帖子,這與傳統的BBS確實有一些區別。


本刊記者:好,就到這裡。謝謝你們兩位能夠接受我的採訪,分享你們的經驗與思想。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9697/viewspace-1017921/,如需轉載,請註明出處,否則將追究法律責任。

相關文章