我没有运气试图找出ASP.Net Web角色的实例计数如何影响当前正在处理的请求。
见下面的情景:
azure是否足够智能,如果当前正在处理请求,或者只是在请求中杀死它们,则不会从池中删除实例?
我经历过天蓝色的doco,goolge和一些电子邮件到MS技术支持,但没有一个能够回答这个看似简单的问题。我知道由关闭等触发的事件但在网站场景中并没有真正帮助,而现场人员正在等待他们的回复请求。
答案 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中根据需要延迟关闭。)