更新 Azure 云服务的单个实例
Update individual instance of Azure Cloud Service
我在 Azure 中托管了一个云服务。由于它使用的数据量,我们有一个每小时的进程,告诉服务将数据缓存到内存中。为了更新缓存,我们使用了一个名为 "RefreshData" 的公开方法,我们在本地服务器上的计划任务上调用该方法。
最近我在 2 个实例上将云服务更新为 运行(这意味着它在 1 个 VM 上 运行ning,现在在 2 个上 运行ning)。
我现在注意到的是我们的数据不再自动刷新到最新数据。这里似乎发生的是:
- 运行 一个命令可执行文件的计划任务在本地服务器上的整点触发
- exe 调用 http://myCloudService.cloudapp.net/service.svc,获得响应,并启动 RefreshData 方法
- 收到刷新请求的实例是 "random",这意味着 2 个实例中只有 1 个被告知刷新数据。因此,有时使用我们服务的用户会获得最新数据,有时可能会过时长达几个小时。
因此,如果我有一个响应 IP 的云服务,但有 2 个实例 运行ning "behind it" 具有单独的 IP,我如何调用此请求并确保两者都得到根据需要更新?
PS - 我知道 Azure 现在可以使用 "load balancer" 工具,如果需要的话,我非常乐意使用一个实例作为我的主要实例,并将第二个实例用作故障转移,如果这是一个合理的选择吗?
您当前的解决方案设计过度了。你有一个外部服务只是为了在你的 Azure 服务中触发一个周期性事件。如果您的 ISP 发生故障并且您暂时无法从一个连接到另一个怎么办?
一个更好的方法是让每个实例向自己发送一个 HTTP 请求 - 有效 http://localhost/service.svc 这将消除对外部服务的依赖,并解决通过负载平衡器到达的问题每个实例。
我假设您有网络角色。根据你的 RoleEntryPoint.Run() 做什么,你可以从那里开始单独的线程,或者只是 运行 一个内部有 Sleep()
的无限循环,然后从那里发送那些 HTTP 请求。
您有几个选择:
- 为什么您的云服务本身不负责按计划刷新自己的数据?为什么必须从外部告诉他们这样做?在角色实例本身内部使用计划任务或计时器将是最简单和最可靠的方法。
- 使用 InstanceInputEndpoint 以便每个实例获得唯一的端口号。然后您的计划任务将进行两次调用,一次调用 http://myCloudService.cloudapp.net:81/service.svc and one to http://myCloudService.cloudapp.net:82/service.svc.
- 设置实例级别 public IP 地址 (http://azure.microsoft.com/blog/2014/10/22/instance-level-public-ip-address/)。您的计划任务将进行两次调用,一次调用 http://{instanceIP1}/service.svc,一次调用 http://{instanceIP2}/service.svc.
- 使用您现在使用的相同配置,其中负载均衡器后面的随机实例获取刷新命令,然后在内部该实例将使用 InternalEndpoints 与其他实例通信。
我在 Azure 中托管了一个云服务。由于它使用的数据量,我们有一个每小时的进程,告诉服务将数据缓存到内存中。为了更新缓存,我们使用了一个名为 "RefreshData" 的公开方法,我们在本地服务器上的计划任务上调用该方法。
最近我在 2 个实例上将云服务更新为 运行(这意味着它在 1 个 VM 上 运行ning,现在在 2 个上 运行ning)。
我现在注意到的是我们的数据不再自动刷新到最新数据。这里似乎发生的是:
- 运行 一个命令可执行文件的计划任务在本地服务器上的整点触发
- exe 调用 http://myCloudService.cloudapp.net/service.svc,获得响应,并启动 RefreshData 方法
- 收到刷新请求的实例是 "random",这意味着 2 个实例中只有 1 个被告知刷新数据。因此,有时使用我们服务的用户会获得最新数据,有时可能会过时长达几个小时。
因此,如果我有一个响应 IP 的云服务,但有 2 个实例 运行ning "behind it" 具有单独的 IP,我如何调用此请求并确保两者都得到根据需要更新?
PS - 我知道 Azure 现在可以使用 "load balancer" 工具,如果需要的话,我非常乐意使用一个实例作为我的主要实例,并将第二个实例用作故障转移,如果这是一个合理的选择吗?
您当前的解决方案设计过度了。你有一个外部服务只是为了在你的 Azure 服务中触发一个周期性事件。如果您的 ISP 发生故障并且您暂时无法从一个连接到另一个怎么办?
一个更好的方法是让每个实例向自己发送一个 HTTP 请求 - 有效 http://localhost/service.svc 这将消除对外部服务的依赖,并解决通过负载平衡器到达的问题每个实例。
我假设您有网络角色。根据你的 RoleEntryPoint.Run() 做什么,你可以从那里开始单独的线程,或者只是 运行 一个内部有 Sleep()
的无限循环,然后从那里发送那些 HTTP 请求。
您有几个选择:
- 为什么您的云服务本身不负责按计划刷新自己的数据?为什么必须从外部告诉他们这样做?在角色实例本身内部使用计划任务或计时器将是最简单和最可靠的方法。
- 使用 InstanceInputEndpoint 以便每个实例获得唯一的端口号。然后您的计划任务将进行两次调用,一次调用 http://myCloudService.cloudapp.net:81/service.svc and one to http://myCloudService.cloudapp.net:82/service.svc.
- 设置实例级别 public IP 地址 (http://azure.microsoft.com/blog/2014/10/22/instance-level-public-ip-address/)。您的计划任务将进行两次调用,一次调用 http://{instanceIP1}/service.svc,一次调用 http://{instanceIP2}/service.svc.
- 使用您现在使用的相同配置,其中负载均衡器后面的随机实例获取刷新命令,然后在内部该实例将使用 InternalEndpoints 与其他实例通信。