更改Azure中asp.net Web角色的实例计数时的影响

时间:2011-05-09 22:09:46

标签: asp.net azure azure-web-roles

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

见下面的情景:

  1. 部署ASP.Net站点,包含6个实例
  2. 通过控制台,我将instancecount减少到4
  3. azure是否足够智能,如果当前正在处理请求,或者只是在请求中杀死它们,则不会从池中删除实例?

    我经历过天蓝色的doco,goolge和一些电子邮件到MS技术支持,但没有一个能够回答这个看似简单的问题。我知道由关闭等触发的事件但在网站场景中并没有真正帮助,而现场人员正在等待他们的回复请求。

2 个答案:

答案 0 :(得分:3)

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

话虽如此:当您的角色实例关闭时,您会收到一个事件(OnStop()事件)。如果捕获此事件,则可以进行实例清理以准备VM关闭。我不记得你现在是否已经从负载均衡器中取出,但你总是可以使用简单的PowerShell命令(Set-RoleInstanceStatus -Busy)强迫自己。这样你的asp.net实例就会停止接收请求,你可以更加轻松地以优雅的方式关闭。

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

答案 1 :(得分:2)

只是为了添加David的答案:OnStop事件发生在您关闭负载均衡器时。对于Web应用程序,通常有足够的时间在从LB断开连接之后排除所有请求,直到实例关闭。但是,对于长时间运行或有状态连接(可能是工作者角色),在某些情况下会突然断开连接。虽然OnStop方法将您从LB中删除,但它不会终止打开的连接。它只是阻止你获得新的连接。对于Web应用程序,通常需要足够的时间来完成请求(如果您确实需要,可以在OnStop中根据需要延迟关闭。)