2014-02-15 86 views
0

我在Azure中有一個Cache WorkerRole。我打算重寫角色的OnStart行爲來預先填充緩存並使用我自己的調度程序從worker角色本身中填充緩存。這是不可擴展的,我知道這一點,但我並不需要它。緩存WorkerRole可以添加到它自己的緩存中嗎?

所以,我的問題是,這甚至有可能嗎?我知道我可以重寫OnStart,但是如何訪問緩存?從我的其他角色,我將配置在web.config,只是做:

DataCacheFactory cacheFactory = new DataCacheFactory(); 
DataCache cache = cacheFactory.GetDefaultCache(); 

但會改變的Web.config產生任何問題?我會這樣做嗎?

<localCache isEnabled="true" sync="TimeoutBased" objectCount="100000" ttlValue="300" /> 

或者,我會做:

<autoDiscover isEnabled="true" identifier="CacheRoleName" /> 

任何人這樣做之前,並就如何設置這有什麼建議?

回答

1

我試過這個真的很快,它通過將Nuget包Microsoft.WindowsAzure.Caching添加到託管專用高速緩存的工作者角色來工作得很好。 NuGet包添加了上面的autoDiscover元素,並且我簡單地將標識符更新爲角色的名稱。我重寫了OnStart,並將項目添加到緩存中,就像您在其他任何地方一樣(您在問題中使用的行將讓您訪問默認緩存)。

我能夠從我已經添加到項目中的Web角色中讀取緩存中的數據。

雖然這裏有一個警告的字眼。你已經提到OnStart加載本身的worker角色是一個縮放問題,並且它有點。在初始部署期間,您無法保證角色和實例如何聯機的順序。這意味着高速緩存集羣準備就緒之前,高速緩存的使用者(Web角色等)可能可用。他們需要知道如何處理從緩存中獲取空值或找不到他們想要的內容。這就是爲什麼Cache Aside模式被大量使用。換句話說,不要認爲以這種方式預先填充緩存會確保數據在請求時存在於緩存中。任何可能發生的事情都會使事情變得不真實。如果緩存的使用者不知道如何從高速緩存以外的其他地方獲取數據,那麼最終可能會遇到不好的情況。另外,如果您有多個專用緩存工作者實例,則他們將在每次啓動或回收時嘗試運行此代碼。確保這些調用是冪等的,並且如果您的緩存中的值將緩慢更改,而不是無意中用「啓動」值覆蓋它們。

+0

所有的好建議。這僅僅是一個原型。需要快速且便宜地構建,而不是可擴展的,並且消費者具有明智的後備。這只是實現目標的一種快速(而且很髒)的方式。感謝您的評論,但:D – Faraday