防止Azure在处理时停止工作

时间:2012-01-27 22:31:21

标签: c# azure azure-worker-roles

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

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

如果无法做到这一点,那么如何针对那些需要花费大量时间并且不能分成较小块的操作进行规划呢?您是否只需回滚先前所做的任何更改,然后重试该任务?

1 个答案:

答案 0 :(得分:4)

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

以下是缓解措施的建议。假设你的任务是队列驱动的。让我们假装你的消息看起来像PROCESSWIDGET|123

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

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

有关UpdateMessage()方法的详细信息,请参阅this MSDN page