依新鮮度區隔

2008 年 6 月 24 日

媒體網站最大的問題之一,就是處理大量的流量。媒體的重點在於吸引眼球,但如果一次湧入太多人氣,效能低落會造成問題,並損害你的聲譽。這個問題會因為網路流量的爆發性質而更加惡化。你可能會以可控的速度巡航,然後突然遇到一個大新聞,導致流量大幅激增。我們的客戶之一在幾分鐘內就看到流量激增了兩個數量級。

在運算中,加速存取相同資訊的通用解決方案是使用快取。如果你持續要求我的首頁,網路伺服器會在記憶體中建立快取,因此重複的請求可以避免觸及磁碟。

為我的網站保留快取很簡單,因為這個頁面(就像我的整個網站一樣)是完全靜態的。然而,大多數媒體網站都包含許多動態內容。你可能不認為一般的報紙網站有太多商業邏輯,但一旦你開始查看廣告連結、相關新聞、特別專題等,事情就會變得更有趣。一篇關於法國的旅遊報導可能會連結到法國美食的文章,以及知道加拿大網路瀏覽器對盧瓦爾河谷的假期有興趣的廣告。個人化讓情況更糟,我個人化的偏好應該會產生一份關於濃郁紅酒的個人化特色清單。這種邏輯本身就很複雜,它會讓每次請求產生大量的運算,最重要的是,它會破壞大多數快取策略。

解決這個問題的方法,是將頁面分割成幾個區段,每個區段都有類似的新鮮度判斷。關於盧瓦爾旅遊的文章可以相對靜態,只會在更正錯誤時變更。以「法國」和「盧瓦爾」標籤為基礎的相關文章清單會更常變更,但可能只會每隔幾天變更一次。如果我們適當地安排好這件事,要求包含這兩項的頁面可能會從快取中收集所有內容。

我見過最常見的做法是在網路伺服器上形成快取,並在頁面被點閱時組裝頁面區段。像 Sitemesh 這樣的工具是採用這種方法的理想選擇。當您撰寫 18 世紀盧瓦爾河美食的頁面時,您會包含相關文章等區段的呼叫。當您收到實際的網路請求時,網路伺服器會擷取頁面,並從個別片段組裝頁面。其中大部分可以在網路伺服器中快取,避免點閱後端網域邏輯和資料庫。

一個有趣的可能性是進一步使用網路中存在的許多快取。大多數對此網頁的呼叫甚至不會到達我的網路伺服器,因為我的網頁會在過程中快取多次。如果您動態建立網頁並在伺服器上組裝網頁,您必須點閱才能傳送網頁。另一種方法是在用戶端組裝網頁,然後從其自己的 URL 中繪製每個區段。每個區段都可以快取在不同的地方,並使用不同的快取政策。

這如何運作?我們可能會將靜態文章內容儲存在 URL 中的 XHTML 中,例如 http://gallifreyTimes/travel/18-century-loire-delights。在該檔案中,我們想要透過查詢標記為「盧瓦爾河」和「法國」的文章來插入一些相關文章。在靜態頁面中,我們放入一個簡單的「a」標籤。

  <a class = "relatedLinks" href = "relatedLinks/france+loire">Related Links</a>

在靜態頁面的標頭中,我們將其連結到個別程式庫檔案中的一些 javascript。當我們下載盧瓦爾河文章時,javascript 會執行並掃描文章中具有正確類別的元素:在本例中,是具有「relatedLinks」類別的「a」元素。(behavior 程式庫 是執行此操作的好方法。)當它找到元素時,它會使用元素中的資訊來綜合該區段的 URL。在本例中,它會使用元素的 href 屬性中的內容來產生類似 http://gallifreyTimes/relatedArticles/france+loire 的 URL。一旦取得該 URL,它就會取得內容並使用它來取代原始的「a」元素。由於相關文章清單是透過 URL 處理,因此在該 URL 上的其他取得會導致網際網路上的快取升溫,因此很有可能擷取頁面可能永遠不會在原始伺服器上造成點閱。

使用 Javascript 替換佔位元件以提供更多內容的這項技術是一種 漸進式增強。我找到的漸進式增強說明,重點在於針對瀏覽器功能有限的情況,增加無障礙功能。這個範例也有這樣的優點。如果我使用沒有 javascript 的瀏覽器瀏覽網頁,我仍然可以取得有用的連結。漸進式增強背後的基本概念是,在基本的瀏覽器上提供有用的基本網頁,然後我們使用 javascript 等技術來新增更多精美的功能。

在快取的脈絡中,價值在於每個漸進式增強都會織入一塊具有不同新鮮度規則的 HTML。原始網頁是靜態的,相關連結每天變更,但兩者都可以獨立快取並交織在一起。只要我小心地按照新鮮度規則將網頁分段,我就可以執行各種其他元素。因此,我可以透過讓 javascript 從 http 會話中取得使用者 ID,使用它來建構類似 http://gallifreyTimes/personalWeather/martinfowler 的 URL,擷取內容(通常會快取在我的硬碟中),並將其織入網頁,進而根據使用者的個人資料,在每個網頁中包含個人化的天氣預報。