【问题标题】:Refreshing Data on all Azure Instances刷新所有 Azure 实例上的数据
【发布时间】:2011-09-17 22:10:06
【问题描述】:

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

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

一个想法是编写一个自定义客户端程序来调用 Web 角色上的 Web 服务,传入一个角色 ID 进行更新。如果端点是角色 ID,则实例会自行刷新。如果没有,客户端会再次尝试,直到所有实例都报告它们已刷新。这是一个好方法还是 Azure 中有内置方法可以做到这一点?

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

没有大量数据,因此我可以将其放入 Azure 缓存中。但是,我担心使用缓存的网络延迟。 Azure 缓存能很好地处理这个问题吗?

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

【问题讨论】:

    标签: azure azure-storage


    【解决方案1】:

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

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

    【讨论】:

    • 您将如何以编程方式更新配置?我似乎没有找到相对简单的方法(除了调用 Azure API)。
    【解决方案2】:

    除了 Stuart 的回答,让我谈谈您提出的技术:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 2013-02-11
      • 2022-10-13
      • 2017-09-14
      • 2018-10-24
      • 2015-09-24
      • 1970-01-01
      相关资源
      最近更新 更多