主题说这一切真的:)说我有一个非常繁忙的Azure连续webjob正在从一个天蓝色的队列处理:
public static void ProcessQueue([QueueTrigger("trigger")] Info info)
{ .... }
如果我重新部署webjob,我可以看到任何当前正在执行的作业似乎已中止(我看到" Never Finished"状态)。我释放后该作业是重播还是永远丢失了?
此外,有一种很好的方法可以确保在部署webjobs时没有正在运行的作业,或者由开发人员编写解决方案(例如每次运行时检查的配置标志)。< / p>
由于
答案 0 :(得分:7)
当使用WebJobs SDK的WebJob从队列中获取消息时,它会以10分钟的租约获取它。如果作业进程在处理消息时死亡,则租约将在10分钟后到期,并且消息将返回队列中。如果WebJob重新启动,它将再次选择该消息。仅当函数成功完成时才会删除该消息。
因此,如果作业死亡并立即重新启动,就像重新部署一样,最多可能需要10分钟才能再次选择该消息。此外,因此,建议您自己保存状态或使函数具有幂等性。
在WebJobs仪表板中,您将看到对同一消息的两次调用。其中一个将被标记为Never Finished
,因为函数执行从未完成。
不幸的是,没有开箱即用的解决方案来防止在部署期间运行作业。您必须创建自己的逻辑,通知(通过队列消息?)部署是关于开始,然后中止主机。主机中止将等待任何现有功能停止并阻止新功能启动。但是,如果您有多个webjob实例,这是一个非常棘手的情况,因为只有其中一个实例会收到通知。