防止Azure在处理时停止工作

She*_*els 5 c# azure azure-worker-roles

这可能是一个简单的问题,但我还没有看到直接的答案.假设我正在使用Azure辅助角色来执行某种长时间运行的任务,比如一个需要一个小时的任务.现在说MS决定工作者角色需要对其进行一些维护,并尝试将其关闭30分钟.

有没有办法让Azure等到该角色完成运行以进行维护?我确实看到了这个OnStop方法,但似乎你只能在关闭之前让事情延迟一段时间.

如果这是不可能的,那么你如何计划这个需要花费相当多时间并且不能分成更小块的操作呢?您是否只需回滚先前所做的任何更改,然后重试该任务?

Dav*_*gon 4

您可以处理Stopping事件来延迟实例关闭(在正常关闭模式下)。在崩溃情况下,您无法真正阻止关闭......

这里有一个缓解建议。假设您的任务是队列驱动的。让我们假设您的消息看起来像这样PROCESSWIDGET|123

您在工作实例中读取队列消息并开始处理。您实际上可以一路修改队列消息,并记录您的进度。因此,在这个虚构的示例中,假设有 4 个步骤来完成长达一小时的任务,每个步骤需要 15 分钟。每个步骤完成后,您可以更新消息,附加检查点状态。完成第一个任务后,您立即更新消息,现在它看起来像PROCESSWIDGET|123|STEP2

现在...出了问题,虚拟机实例由于某种原因终止了。队列消息最终再次变得可见,另一个工作实例读取它,并看到附加了下一步要执行的消息。假设您已将中间文件存储在 Blob 存储(或其他一些持久存储)中,您可以从上次中断的位置继续,而不是从头开始重新处理。

有关该方法的详细信息,请参阅此 MSDN 页面UpdateMessage()