我们有一个Azure Cloud Serivce,它有多个实例。这些实例可能存在致命状态,此时我们希望触发实例重启。
我们试过打电话:
RoleEnvironment.RequestRecycle();
但根据Azure门户网站的说法,该实例将继续保持正常运行状态,而不会有任何重新启动的迹象。
我们甚至试图通过发出以下命令将其置于错误状态:
Environment.FailFast("Failed.");
但这似乎也没有触发重启(至少根据Azure门户网站而言)。
我们是否应该在Azure门户中看到这种情况,如果是这样,可能会阻止它重新启动?
更多详情
基本上,作为我们逻辑的一部分,我们正在旋转一个执行一些繁重处理的单独线程,并且此处理有一个超时,此时我们需要重新启动以终止线程并释放所有线程消耗资源。我理所当然地知道我们会更正确地处理线程并取消它,但这不是一个选项。所以我们只想重新启动。
简化版看起来像这样:
var mainTask = Task.Run(() => DoHeavyProcessing());
var timeoutTask = Task.Delay(TimeSpan.FromMinutes(10));
if (Task.WaitAny(mainTask, timeoutTask) == 1)
{
RoleEnvironment.RequestRecycle();
}
但同样,RequestRecycle()
似乎没有触发重启。
答案 0 :(得分:4)
所以我们对此做了一些进一步的测试,发现 - 至少基于我们遇到的情况 - RequestRecyle
不重新启动Cloud Service VM ,而只是回收虚拟机中的角色实例。
与Environment.FailFast
相同 - 它正在回收角色实例,而不是完全重启。
所以净效果是相同的,如果不是更好一点,因为这可能比完全重启更快。
对于那些寻求完全重启的人(在我们的情况下不是必需的),可能需要进行shell关闭:
Process.Start("shutdown","/r /t 0");
答案 1 :(得分:0)
我会在你的项目中添加一个处理程序来捕获OnStop事件以检查是否正在请求回收。此外,如果您查看MSDN page for RequestRecycle,如果请求失败,它可以抛出异常,因此也可以捕获并记录它。
我可以想象,如果你的底层代码真的粉碎了循环请求正在排队的计算资源,并且可能需要一些时间来触发。因此,最好从实例外部控制此操作,并使用Azure服务器管理API强制实例重新启动。也许登录到队列,如果实例/作业仍在记录,则在定义的时间段之后,然后终止该实例。
请注意,长时间运行的密集进程实际上可能会导致未安排的实例回收,因为Azure Fabric可能会将主机标记为运行状况不佳并重新启动它。