2008-11-22 24 views
2

我最近完成了一項中期traficked網站(峯值60K點擊/小時)的發展,然而,該網站只需要更新一次一分鐘 - 而達到所需性能可由一個單詞概括:「緩存」。性能優化對高交互式網站

對於像SO這樣的網站,網站上的數據總是在變化,我會想象一種不同的方法是必需的。

頁面的緩存時間可能需要很短或不存在的,並且需要在所有的網絡服務器很快將會傳播更新,讓所有的用戶及時更新。

我的猜測是,你需要一個分佈式緩存控制是幾秒鐘的順序更新的數據和頁面的服務,也許數據庫進行調解寫入上述分佈式緩存?

那些更有經驗的人可以介紹一些他們採用的確保高度互動的網站如SO的關鍵架構/設計原則嗎?

回答

3

絕大多數網站的讀取次數多於寫入次數。每次寫入數千甚至數百萬次讀取並不罕見。

因此,任何縮放解決方案都取決於將讀取的縮放與寫入的縮放分開。通常,縮放讀取操作非常便宜且容易,縮放寫入操作複雜且成本高昂。

縮放讀取最直接的方法是一次緩存整個頁面,並在一定的秒數後過期。如果你看看流行的網站Slashdot。你可以看到這是他們擴展網站的方式。不幸的是,這種緩存策略可能會導致最終用戶的反直覺行爲。

我假設你的問題是你不想要這種原始的緩存。就像你提到的那樣,你需要更新緩存。

這並不像聽起來那麼可怕。關鍵要認識到的是從服務器的的角度來看。 Stackoverflow不會一直更新。它很少更新。可能每秒鐘一次或兩次。一秒鐘到電腦幾乎是永恆的。

此外,更新往往發生在緩存中不相互依賴的項目。以堆棧溢出爲例。我想象每個問題頁面被分開緩存。大多數問題可能在前十五分鐘內平均每分鐘更新一次,然後大概在一小時後更新一次。

因此,在大多數應用程序中,您幾乎不需要擴展寫入。他們之間的距離非常短,您可以讓一臺服務器執行寫入操作;實際更新緩存實際上是一個完美可行的解決方案。除非您的流量非常高,否則您將很少同時對同一個緩存項目執行併發更新。

那麼你如何設置?我的首選解決方案是將每個頁面分別緩存到磁盤,然後讓許多網站負責人從一些互相訪問的空間中提供這些靜態頁面。

當需要完成寫操作時,它只能從一臺服務器完成,並且會更新該特定緩存的html頁面。每個服務器都擁有它自己的緩存子集,因此沒有單點故障。更新過程是精心設計的,以便事務確保沒有兩個請求不會在完全相同的時間寫入文件。

我發現這種設計已經達到了我們迄今爲止所需的所有縮放比例要求。但是,這將取決於網站的性質和負載的性質,以確定這是否適合您的項目。

3

你可能會感興趣this article,它描述了維基媒體服務器的結構。非常有啓發性!

該文章鏈接到this pdf - 一定不要錯過它。

+0

謝謝,我來看看。 – Ben 2008-11-22 20:28:13