2010-05-14 69 views
1

定義:資源=數據庫記錄的收集,再生=處理這些記錄,並輸出相應的HTML如何使用後臺作業緩存頁面?

當前流量:

  • 接收客戶端請求
  • 檢查資源在緩存
  • 如果沒有在高速緩存或緩存中過期,重新生成
  • 返回結果

問題在於再生步驟可以將單個服務器進程捆綁10-15秒。如果有幾個用戶請求相同的資源,那麼可能會導致多個進程同時重新生成完全相同的資源,每個進程需要10-15秒。

如果讓前端信號有一些後臺進程說「嗨,爲我重新生成這個資源」不是更好嗎?

但是,它會顯示給用戶什麼? 「重建」是不可接受的。所有資源必須提前緩存。這可能是一個問題,因爲數據庫幾乎會在文件系統上重複(太大而不適合內存)。有沒有辦法避免這種情況?不理想,但它似乎是唯一的出路。

但是接下來還有一個問題。如何讓相同的兩個進程同時請求資源的再生?當前端要求重新生成相同資源時,後臺進程可能會重新生成資源。

我正在使用PHP和Zend框架,以防萬一有人想提供特定於平臺的解決方案。不過它並不重要 - 我認爲這個問題適用於任何語言/框架。

謝謝!

+0

緩存的html用戶特定的或相同的所有用戶?緩存過期的標準是什麼?也許如果你提供一些細節,在你的特定情況下建議一些東西會更容易,因爲在這裏很難提出通用的解決方案。 – serg 2010-05-14 18:11:45

回答

2

使用Varnish您可以主動緩存頁面內容並使用寬限顯示陳舊的緩存內容(如果響應沒有及時回覆)。

啓用寬限期(清漆支持陳舊(但緩存)對象,而retriving從後端對象)

您可能需要調整刻度盤,以確定多長時間來服務陳舊的內容的最佳設置多長時間需要考慮陳舊的東西,但它應該適合你。更多關於Varnish performance wiki頁面。

1

我建議緩存在Web服務器級別而不是

1

我剛做這家最近的一對夫婦不同的東西,在每種情況下,基本是相同的應用程序 - 在這種情況下,信息可以預在使用前生成。

一個PHP作業定期運行(也許從 科雷),其生成的信息到 Memcached的,然後將其用於 可能數百次,直到 它再次重修。

雖然他們被緩存了定義良好的時期(60分鐘或1分鐘),但它們的再生頻率比這更高。因此,除非出現問題,否則它們將永遠不會從Memcache過期,因爲較新的版本會在它們過期之前被緩存。當然,你可以安排他們永不過期。

我也通過隊列做過類似的事情 - 你可以看到前面的問題我已經回答了有關「BeanstalkD」。

0

根據內容的jQuery.load()可能是一種選擇。 (我用了一個Twitter飼料)

步驟1
顯示進料的高速緩存版本。

步驟2
更新經由jQuery.load頁面上的內容()和高速緩存的結果。


這樣的頁面加載速度快,並顯示up2date的含量(x秒後offcourse)
但是,如果重建/加載整個頁面,這將不會提供一個很好的用戶體驗。

0

你描述了一些問題,也許一些一般的想法會有所幫助。

一個問題是您生成的內容太大而無法完全存儲,因此您只能緩存整個內容的一個子集,您將需要:一種用於唯一標識可生成的每個內容對象的方法,一種用於標識如果內容對象已經存在於緩存中,則用於在緩存中標記數據的策略爲陳舊以指示應該運行後臺再生,以及用於過期並替換緩存中的數據的策略。最終保持獨特內容標識的簡單性應該有助於提高性能,同時應該使用過期對象策略和過時對象標記來定義內容對象後臺再生的優先級。這些可能是對現有緩存方案的簡單更新,另一方面,使用專門用於解決此需求的軟件包可能會更有效,因爲這不是一個不常見的問題。

另一個問題是,你不想重複的工作重新生成內容。如果您有多個具有不同功能的並行生成引擎,這可能不會太糟糕,並且最好將任務排列到每個引擎,並在第一個生成器完成作業時從其他所有隊列中移除任務。考慮在再生過程中跟蹤對象狀態,以便多個後臺再生任務可以被激活而不會無意地重複工作。再一次,這可以代替現有的緩存系統或由專門的緩存軟件包處理。

的第三個問題是關於當客戶端請求未緩存並且需要重新生成數據做什麼。如果數據需要完全重新生成,您將陷入僵局,讓客戶端等待重新生成完成,以幫助您處理長時間的內容生成時間,從而確定將內容對象預取到緩存中的策略,但需要一種方法來識別內容對象。無論您希望爲客戶提供「再生」頁面,直到所需的內容可用,都取決於客戶的期望。如果內容再生無法從10-15秒改進,請考慮使用壓縮數據存檔的多級緩存。

充分利用成熟的網頁緩存軟件包可能會解決所有這些問題。Nick Gerakines提到了Varnish,它看起來非常適合您的需求。