刷新所有Azure实例上的数据

时间:2011-06-18 20:12:19

标签: azure azure-storage

刷新所有Azure实例中的数据的最佳方法是什么?

我有几个实例,每个实例都运行相同的Web角色。在角色启动时,数据从blob存储读取到本地存储。间歇性地,将对网站使用的数据进行新的更新。我希望能够以编程方式通知每个实例,以便将blob存储中的更新数据提供给实例的本地存储,以便每个实例都刷新。

一个想法是编写一个自定义客户端程序来调用Web角色上的Web服务,并传入角色ID进行更新。如果端点是角色ID,则实例将刷新自身。如果不是,则客户端再次尝试,直到所有实例报告它们都被刷新。这是一个很好的方法,还是在Azure中有内置方法来执行此操作?

我考虑过一个单独的线程,间歇性地检查刷新标志,但我担心我的实例会变得不同步。

没有大量数据,所以我可以把它放在Azure缓存中。但是,我担心使用缓存的网络延迟。 Azure缓存是否能很好地处理这个问题?

另一个想法是一个接一个地重启实例(在角色启动时执行刷新操作)。

2 个答案:

答案 0 :(得分:5)

我认为您可以这样做的一种可能方法是在配置设置中使用设置(例如时间戳) - 然后您可以以编程方式更新配置并使用RoleEnvironment.Changing事件来监控所有更改实例 - http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.serviceruntime.roleenvironment.changing.aspx

如果这样做,请确保在所有角色中拦截事件 - 并确保解析更改(查找Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironmentConfigurationSettingChange)并将false返回到Cancel参数以防止实例重新启动

答案 1 :(得分:2)

根据斯图尔特的回答,让我谈谈你提出的技巧:

  • 我认为客户端调用Web服务技术不实用,因为您现在已经添加了Web服务以及调用它的客户端驱动程序,并且您无法联系各个Web角色实例 - 负载均衡器会隐藏您的各个实例。
  • 您可以将数据存储在缓存中,但“现在”更新数据的唯一方法是使缓存中的项目失效。如果您将所有数据都放在一个具有众所周知密钥的缓存项中,那么它很容易过期。如果它跨越多个键,则您有一个更复杂的任务,并且您将无法以原子方式使项目过期(除非您清除整个缓存)。此外,缓存无论如何都会自行过期 - 如果发生这种情况,您必须处理重新加载。
  • 您可以在角色实例上使用后台线程,查找blob(可能包含单个zip文件),并在其ID更改时将zip文件复制到本地存储(您可以在blob中存储唯一ID)例如,元数据)。然后你可以定期检查(也许每分钟?)。
  • 重新启动的想法有好的一面和坏的一面。从好的方面来说,在角色实例仍在运行时,您将避免因更改本地内容而导致的副作用。不好的一面是角色实例在重启期间将离线几分钟。

斯图尔特建议使用配置设置是一个很好的建议。确保您可以在不破坏应用的情况下更新文件。如果无法安全地完成此操作,请不要处理Changing事件 - 只需让角色实例回收。