RoleEnvironment.RequestRecycle() 不触发重启

RoleEnvironment.RequestRecycle() not triggering a reboot

我们有一个具有多个实例的 Azure 云服务。这些实例可能会进入致命状态,此时我们希望触发实例重启。

我们试过调用:

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() 似乎没有触发重启。

我会向您的项目添加一个处理程序来捕获 OnStop 事件以检查是否正在请求回收。此外,如果您查看 MSDN page for RequestRecycle 如果请求失败,它可能会抛出异常,因此也可能会捕获并记录它。

我可以想象,如果您的底层代码确实破坏了回收请求正在排队并且可能需要一些时间才能触发的计算资源。因此,您最好从实例外部控制它并使用 Azure 服务器管理 API 强制实例重新启动。如果实例/作业仍在记录,则可能会记录到队列并在定义的时间段后终止该实例。

请注意,长时间 运行 密集型进程实际上可能无论如何都会导致计划外的实例回收,因为 Azure Fabric 可能会将主机标记为不健康并重新启动它。

所以我们对此做了一些进一步的测试,并发现——至少根据我们所经历的——RequestRecyle不会重新启动Cloud Service VM,而只是在 VM 中回收角色实例。

Environment.FailFast 也是如此——它正在回收角色实例,而不是完全重新启动。

所以净效果是一样的,如果不是好一点的话,因为这可能比完全重启快一点。

对于那些寻求完全重启的人(这在我们的案例中没有必要),可能需要 shell 关机:

Process.Start("shutdown","/r /t 0");