2

我没有运气试图找出更改 ASP.Net Web 角色的实例计数如何影响当前正在处理的请求。

这是场景:

  1. 一个 ASP.Net 站点部署了 6 个实例
  2. 通过控制台,我将实例数减少到 4

如果当前正在处理请求,Azure 是否足够聪明,不会从池中删除实例,或者它只是在请求中杀死它们?

我已经通过 azure doco、goolge 和许多发给 MS 技术支持的电子邮件,没有一个能够回答这个看似简单的问题。我知道由关机等触发的事件,但这在网站场景中并没有真正帮助,因为现场人员正在等待他们的响应请求。

4

2 回答 2

3

您无法选择要终止的实例。这主要是由于 Windows Azure 的实例分配方案,您的实例被分成不同的故障域(意味着数据中心的不同区域 - 不同的机架等)。如果您要选择要终止的实例,这可能会使您处于剩余实例处于同一故障域中的状态,这将使 SLA 无效。

话虽如此:当您的角色实例关闭时,您会收到一个事件(OnStop() 事件)。如果您捕获此事件,您可以执行实例清理以准备关闭 VM。我不记得此时您是否已退出负载均衡器,但您始终可以使用简单的 PowerShell 命令 (Set-RoleInstanceStatus -Busy) 强制退出。这样,您的 asp.net 实例将停止接收请求,并且您可以更轻松地以优雅的方式关闭。

编辑:对不起 - 没有完全解决你的所有问题。由于您要捕获 OnStop(),因此您可能必须实现一种机制来确保在该实例中没有处理任何内容。由于您没有使用负载平衡器,并且假设您的请求处理得相当快(2-5 秒),您不必等待很长时间来清除剩余的请求。可能有一个性能计数器要检查,以查看正在处理多少活动请求。

于 2011-05-10T00:38:00.247 回答
2

只是为了补充大卫的回答:当您离开负载平衡器时,会发生 OnStop 事件。对于 Web 应用程序,在您与 LB 断开连接后,直到实例关闭,通常有足够的时间来清除所有请求。但是,对于长时间运行或有状态的连接(可能是工作角色),在某些情况下会突然断开连接。虽然 OnStop 方法将您从 LB 中移除,但它不会终止打开的连接。它只是阻止您获得新的连接。对于 Web 应用程序,这通常足以完成请求(如果需要,您也可以在 OnStop 中延迟关闭,如果您真的想这样做)。

于 2011-05-10T01:09:33.737 回答