更新Azure Cloud Service的单个实例

时间:2015-06-10 17:51:47

标签: wcf azure azure-cloud-services

我在Azure中托管了一个云服务。由于它使用的数据量,我们有一个每小时的过程,告诉服务将数据缓存到内存中。为了更新缓存,我们使用一个名为" RefreshData"的公开方法。我们在本地服务器上的计划任务上调用。

最近我更新了云服务以在2个实例上运行(这意味着它在1个虚拟机上运行,​​现在运行在2个虚拟机上)。

我现在注意到的是,我们的数据不再自动刷新到最新数据。这里似乎发生了什么:

  1. 在本地服务器上的小时内触发运行命令可执行文件的计划任务
  2. exe调用http://myCloudService.cloudapp.net/service.svc,获取响应,并启动RefreshData方法
  3. 收到刷新请求的实例是" random",表示只告知2个实例中的1个刷新数据。因此,有时使用我们服务的用户会获得最新数据,有时可能会持续几个小时。
  4. 因此,如果我有一个响应IP的云服务,但有2个实例在运行"在它后面"对于单独的IP,如何调用此请求并确保两者都根据需要进行更新?

    PS - 我知道Azure有那个"负载均衡器"工具现在可用,如果需要我非常适合使用一个实例作为我的主要工具并让第二个实例作为故障转移,如果这是一个可用的选项吗?

2 个答案:

答案 0 :(得分:3)

您当前的解决方案是过度工作的大时间。您有一个外部服务只是为了触发Azure服务中的定期事件。如果您的ISP出现故障并且暂时无法从一个连接到另一个连接怎么办?

一个更好的方法是每个实例向自己发送一个HTTP请求 - 有效http://localhost/service.svc这将消除对外部服务的依赖,并解决通过负载均衡器并到达每个实例的问题

我假设你有一个网络角色。根据{{​​3}}的不同,你可以从那里开始单独的线程,或者只是在里面运行Sleep()的无限循环,然后从那里发送那些HTTP请求。

答案 1 :(得分:2)

您有几个选择:

  1. 为什么您的云服务本身不负责按计划刷新自己的数据?为什么他们必须被告知要从外部做这件事?在角色实例中使用计划任务或计时器本身是最简单,最可靠的方法。
  2. 使用InstanceInputEndpoint,以便每个实例都获得唯一的端口号。然后,您的预定任务将拨打两个电话,一个拨打http://myCloudService.cloudapp.net:81/service.svc,一个拨打http://myCloudService.cloudapp.net:82/service.svc
  3. 设置实例级公共IP地址(http://azure.microsoft.com/blog/2014/10/22/instance-level-public-ip-address/)。您的计划任务将进行两次调用,一次调用http:// {instanceIP1} /service.svc,另一次调用http:// {instanceIP2} /service.svc。
  4. 使用您现在使用的相同配置,其中负载均衡器后面的随机实例获取刷新命令,然后在内部该实例将使用InternalEndpoints与其他实例通信。