2010-12-09 166 views
0

我很好奇在Google App Engine或任何基於雲的應用程序中緩存的工作原理。由於不能保證請求被髮送到同一臺服務器,這是否意味着如果數據在服務器A上的第一個請求上被緩存,那麼在服務器B處理的第二個請求上,它將無法訪問緩存?在Google App Engine /雲託管中緩存

如果是這種情況(緩存只對本地服務器),請求使用緩存不是不太可能(取決於用戶數量)?例如。谷歌可能有數千臺服務器

回答

2

使用App引擎,您可以使用memcached進行緩存。這意味着緩存服務器將把數據保存在內存中(而不是每個應用程序服務器)。應用程序服務器(對於給定的應用程序)都會使用同一個緩存服務器(概念上講,可能會在分區之下進行分片或複製)。

應用程序服務器本身的內存中緩存可能不會非常有效,因爲這些緩存中有不止一個(儘管對於您的給定應用程序,只有少數實例處於活動狀態,但它並不遍佈整個谷歌的服務器),也是因爲谷歌可以隨時關閉它們(這對Java應用程序來說是一個真正的問題,需要一些時間來重新啓動,所以現在你可以付錢讓閒置的實例保持活着)。

除了這些性能/有效性問題,應用程序服務器上的內存緩存可能會導致一致性問題(當緩存不同步時每次刷新都會顯示不同的數據)。

+0

您是否有任何參考資料解釋App Engine拓撲結構,緩存服務器與應用程序服務器分開? – systempuntoout 2010-12-09 07:51:15

1

取決於您想實現的緩存類型。

如果您有複雜的內存中對象結構,需要時間從數據庫加載的數據進行重建,那麼在應用程序服務器本身上進行緩存可能會很有趣。在這種特定情況下,您可能需要緩存計算結果。如果結構很大,使用本地緩存比使用共享內存緩存更快。

如果在內存和數據庫之間具有一致的值是至關重要的,那麼每次使用緩存的值時,都可以使用數據存儲上存儲的值執行一些校驗和/時間戳檢查。將校驗和/時間戳存儲在一個小對象或全局緩存中可以加快這個過程。

使用全局內存緩存的一個主要問題是確保在「重新填充」它時有適當的同步,當值尚未存在或已被刷新時。如果您有多臺服務器在同一時間進行檢查並在緩存中重新填充值,則最終可能會有幾個不同的服務器同時進行重新填充。如果手術是同等效力的,這不是問題;如果不是,潛在的並且很難追蹤錯誤。

相關問題