刷新所有Azure实例上的数据

Mis*_*ook 6 azure azure-storage

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

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

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

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

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

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

Stu*_*art 5

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

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


Dav*_*gon 2

除了斯图尔特的答案之外,让我谈谈您提出的技术:

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

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