Cache WorkerRole可以添加到自己的缓存中吗?

时间:2014-02-15 14:56:54

标签: c# azure azure-worker-roles azure-caching

我在Azure中有一个Cache WorkerRole。我计划覆盖角色的OnStart行为以预先填充我的缓存并使用我自己的调度程序从worker角色本身填充缓存。这是不可扩展的,我知道这一点,但我不需要它。

所以,我的问题是,这甚至可能吗?我知道我可以覆盖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 个答案:

答案 0 :(得分:1)

我快速尝试了这一点,并且通过将Nuget包Microsoft.WindowsAzure.Caching添加到托管专用缓存的Worker角色,它工作得很好。 NuGet包添加了上面的autoDiscover元素,我只是将标识符更新为角色的名称。我重写OnStart并将项目添加到缓存中,就像在其他任何地方一样(问题中的行将使您可以访问默认缓存)。

我能够从我已添加到项目中的Web角色中读取缓存中的数据。

尽管如此,请注意。您已经提到OnStart上的worker角色加载本身就是一个扩展问题,而且它有点像。在初始部署期间,您无法保证角色和实例如何联机的顺序。这意味着在缓存集群准备好之前,缓存的消费者(Web角色等)可能是可用的。他们需要知道如何处理从缓存中获取空值或者找不到他们想要的内容。这就是Cache Aside模式被大量使用的原因。换句话说,不要错误地认为以这种方式预先填充缓存将确保在请求时数据存在于缓存中。可能会发生任何可能导致这种情况失败的事情。如果缓存的使用者不知道如何从缓存之外的其他内容获取数据,则可能会导致状况不佳。

此外,如果您有多个专用缓存工作实例,则每次启动或回收时都会尝试运行此代码。确保这些调用是幂等的,并且如果您的缓存中的值会缓慢变化,那么您不会无意中用“启动”值覆盖它们。