2010-09-24 151 views
33

我要尋找最高效的方式來安排的數據高速緩存和數據高速緩存工廠AppFabric緩存電話的使用,每頁面加載400和700之間的高速緩存獲得(和幾乎沒有任何放) 。看起來,使用單個靜態DataCacheFactory(或可能是一對循環設置中的一對)是一條可行的路線。AppFabric緩存 - 正確使用DataCacheFactory和數據高速緩存

我稱GetCache(「cacheName」)爲每個數據高速緩存對象請求,還是我做一個靜態的時候數據高速緩存工廠被初始化,並使用所有的電話?

我必須處理異常,檢查故障代碼並試圖重試?

我必須考慮競爭當多個線程試圖使用緩存店,並希望在同一項目(通過鍵)?

是否有某種文檔其中適當探討這種設計和使用?


一些信息,我已經從論壇迄今收集:

http://social.msdn.microsoft.com/Forums/en-AU/velocity/thread/98d4f00d-3a1b-4d7c-88ba-384d3d5da915

「創建工廠包括連接到羣集,可能需要一些時間,但一旦你。有工廠對象和緩存要使用,你可以簡單地重複使用這些對象做puts和進入緩存,你應該會看到更快的性能上班「。

http://social.msdn.microsoft.com/Forums/en-US/velocity/thread/0c1d7ce2-4c1b-4c63-b525-5d8f98bb8a49

「創建單一DataCacheFactory(單身)比創建多個DataCacheFactory更多的表演。你不應該爲每個調用創建DataCacheFactory,就會有性能損失。」

「請嘗試在單例中封裝循環法算法(具有3/4/5個工廠實例)並比較加載測試結果。」

http://blogs.msdn.com/b/velocity/archive/2009/04/15/pushing-client-performance.aspx

「你可以增加客戶的數量增加緩存吞吐量。但有時,如果你想有較小的集客戶和增加吞吐量,一招是使用多個DataCacheFactory實例; DataCacheFactory實例創建到服務器的連接(如果有3個服務器,它將創建3個連接),並將來自數據緩存的所有請求都複用到這些連接上。因此,如果put/get卷非常高,這些TCP連接可能會成爲瓶頸,因此一種方法是創建多個DataCacheFactory實例,然後使用它們的操作。「


這裏到目前爲止使用了什麼......屬性被調用,並且如果返回值不爲null,則執行操作。

private static DataCache Cache 
{ 
    get 
    { 
     if (_cacheFactory == null) 
     { 
      lock (Sync) 
      { 
       if (_cacheFactory == null) 
       { 
        try 
        { 
         _cacheFactory = new DataCacheFactory(); 
        } 
        catch (DataCacheException ex) 
        { 
         if (_logger != null) 
         { 
          _logger.LogError(ex.Message, ex); 
         } 
        } 
       } 
      } 
     } 

     DataCache cache = null; 

     if (_cacheFactory != null) 
     { 
      cache = _cacheFactory.GetCache(_cacheName); 
     } 

     return cache; 
    } 
} 

請參閱Microsoft AppFabric的論壇這樣一個問題:http://social.msdn.microsoft.com/Forums/en-AU/velocity/thread/e0a0c6fb-df4e-499f-a023-ba16afb6614f

+0

沒有在論壇上回答這個現在。檢查上面的鏈接。 – CRice 2010-11-11 02:04:32

回答

15

下面是從論壇帖子的答案:

嗨。對不起,延遲響應, ,但我想說,這些都是偉大的 問題,並可能會有用 其他人。

除非您要求不同的 配置,否則不應該需要比每個線程的一個DataCacheFactory更多 。例如,如果您 編程與 DataCacheFactoryConfiguration類配置 DataCacheFactory, 那麼你可能要創建一個 啓用本地緩存和另一 說沒有。在這種情況下,您將 使用不同的DataCacheFactory對象 ,具體取決於您的場景中需要的配置 。但其他 比配置的差異,你 不應該看到一個性能增益由 創建多個DataCacheFactory。

在同一受試者,有一個 MaxConnectionsToServer設置(在 DataCacheFactoryConfiguration或 應用程序配置文件作爲 的dataCacheClient 元素的屬性或者 編程)。這確定了每個DataCacheFactory的 已打開到緩存集羣。如果 您有高吞吐量要求 以及可用的CPU /網絡 帶寬,增加此設置爲 3或更高可以增加吞吐量。 我們不建議增加這個 無緣無事或值 太高,您的需求。您應該 更改該值,然後測試您的 方案以觀察結果。我們 希望在未來有更多的關於 的官方指導。

一旦你有一個DataCacheFactory,你 不需要調用GetCache() 多次獲得多個 數據高速緩存的對象。每次調用 GetCache()對於同一個緩存上的 同一個工廠返回的數據緩存對象的返回值是相同的 。此外,一旦您擁有DataCache對象,則不需要 繼續爲其調用DataCacheFactory 。只需存儲DataCache 對象並繼續使用它。 但是,不要讓 DataCacheFactory對象處置。 與DataCacheFactory對象綁定的DataCache對象的生命期爲 。

您絕對不應該擔心 與Get請求的爭用。然而, 與Put/Add請求,如果多個數據緩存 客戶端同時更新 相同的密鑰可能會有 爭用。在這種情況下,您將 得到一個異常,錯誤代碼爲 ERRCA0017,RetryLater和ES0005的Keyleatched的子狀態 。但是,如果發生這些錯誤,您可以輕鬆添加異常處理和 重試邏輯,以再次嘗試更新 。 這可以通過具有各種子狀態值的RetryLater代碼 完成。有關 的更多信息,請參閱 http://msdn.microsoft.com/en-us/library/ff637738.aspx。 通過使用GetAndLock()和PutAndUnlock()API,您還可以使用悲觀鎖定 。如果您使用此方法,則您有責任對 確保所有緩存客戶端使用 保守鎖定。 Put()調用將 消除之前由GetAndLock()鎖定的 的對象。

我希望這會有所幫助。就像我說的,我們 希望能很快得到這種類型的指導到 一些正式的內容。但是,在此之前在論壇 之前分享它最好是 。謝謝!

賈森·羅斯

+2

MaxConnectionsToServer是一個強大的配置設置。它提供了並行性而沒有明確的編碼。一定要實現邏輯來捕獲DataCacheExceptions,然後查找RetryLater或Timeout的ErrorCode進行重試,因爲衝突可能更頻繁地發生。 – andrewbadera 2011-06-18 04:30:18

4

我稱GetCache( 「cacheName」)爲 每個數據高速緩存對象請求,或做 我做一個靜態的時間 DataCache工廠已初始化,並且 將其用於所有調用?

我想應該是真的答案;嘗試兩種方法並查看是否有差異,但是對於每次調用Get時,一個靜態DataCache在我看來比對GetCache的相應調用更有意義。

「推送客戶端性能」文章指出,DataCacheFactory實例的數量可以最大限度地提高性能,超過這個限制,內存開銷會對您產生負面影響 - 這是一種遺憾,他們沒有給出任何指導方針(甚至一個經驗法則)這個點可能在哪裏。

我還沒有遇到任何有關最大化性能的文檔 - 我認爲AppFabric對於這些指導方針還未被發現,但仍然太新。我確實在Pro AppFabric book的目錄中看過一些內容,但似乎更多地關注AppFabric的工作流程(都柏林)而不是緩存(Velocity)。

有一件事我會說,雖然:有沒有可能讓你緩存'chunkier'對象,這樣你可以撥打更少的電話Get?您可以緩存集合而不是單個對象,然後在客戶端上解壓集合? 700緩存獲取每頁加載似乎對我來說是一個巨大的數字!

+0

是的,這是一個龐大的數字,但我爲一個討厭的系統添加了一個緩存提供程序,並且無法真正改變它的核心緩存需求。感謝您的評論,但它突出顯示了我的具體問題沒有太多有用的信息。 – CRice 2010-09-26 23:01:40

+2

關於從緩存中提取大量項目,是否查看了標記和區域功能?如果沒有閱讀關於這個主題的博客文章:http://blogs.msdn。com/b/skaufman/archive/2010/04/22/tagging-objects-in-the-appfabric-cache.aspx – Rohland 2010-09-28 08:02:34

+1

@Rohland標籤和區域可能是一種簡化一些代碼的方法, cache.Get,但我不確定他們會提供顯着的性能優勢,因爲我認爲代碼仍然會從每個頁面的緩存中提取相同數量的項目,即我認爲您仍然會遇到同樣的瓶頸。 – PhilPursglove 2010-09-28 14:03:17