部署webjob时“正在进行”的作业会发生什么?

时间:2015-01-20 10:02:39

标签: azure azure-webjobs

主题说这一切真的:)说我有一个非常繁忙的Azure连续webjob正在从一个天蓝色的队列处理:

    public static void ProcessQueue([QueueTrigger("trigger")] Info info)
    { .... }

如果我重新部署webjob,我可以看到任何当前正在执行的作业似乎已中止(我看到" Never Finished"状态)。我释放后该作业是重播还是永远丢失了?

此外,有一种很好的方法可以确保在部署webjobs时没有正在运行的作业,或者由开发人员编写解决方案(例如每次运行时检查的配置标志)。< / p>

由于

1 个答案:

答案 0 :(得分:7)

当使用WebJobs SDK的WebJob从队列中获取消息时,它会以10分钟的租约获取它。如果作业进程在处理消息时死亡,则租约将在10分钟后到期,并且消息将返回队列中。如果WebJob重新启动,它将再次选择该消息。仅当函数成功完成时才会删除该消息。

因此,如果作业死亡并立即重新启动,就像重新部署一样,最多可能需要10分钟才能再次选择该消息。此外,因此,建议您自己保存状态或使函数具有幂等性。

在WebJobs仪表板中,您将看到对同一消息的两次调用。其中一个将被标记为Never Finished,因为函数执行从未完成。

不幸的是,没有开箱即用的解决方案来防止在部署期间运行作业。您必须创建自己的逻辑,通知(通过队列消息?)部署是关于开始,然后中止主机。主机中止将等待任何现有功能停止并阻止新功能启动。但是,如果您有多个webjob实例,这是一个非常棘手的情况,因为只有其中一个实例会收到通知。