主题确实说明了一切:) 假设我有一个非常繁忙的 Azure 连续 Web 作业,正在从 azure 队列进行处理:
public static void ProcessQueue([QueueTrigger("trigger")] Info info)
{ .... }
如果我重新部署网络作业,我可以看到任何当前正在执行的作业似乎都已中止(我看到“从未完成”状态)。该工作在我释放后会重播还是会永远丢失?
此外,是否有一种很好的方法来确保在部署 webjobs 时没有作业正在运行,或者是否由开发人员编写解决方案(例如每次运行时检查的配置标志)。
谢谢
最佳答案
当使用 WebJobs SDK 的 WebJob 从队列中获取消息时,它会以 10 分钟的租约获取该消息。如果作业进程在处理消息时终止,则租约将在 10 分钟后到期,并且消息将返回到队列中。如果 WebJob 重新启动,它将再次选择该消息。仅当该功能成功完成时,该消息才会被删除。
因此,如果作业终止并立即重新启动(例如重新部署的情况),则可能需要长达 10 分钟才能再次选取消息。此外,因此,建议您自己保存状态或使函数幂等。
在 WebJobs 仪表板中,您将看到同一消息的两次调用。其中之一将被标记为Never Finished
,因为函数执行从未完成。
不幸的是,没有现成的解决方案可以防止作业在部署期间运行。您必须创建自己的逻辑来通知(通过队列消息?)部署即将开始,然后中止主机。主机中止将等待任何现有功能停止并阻止新功能启动。但是,如果您有多个 Webjob 实例,这是一种非常棘手的情况,因为只有其中一个实例会收到通知。
关于azure - 部署 Web 作业时, "in-progress"作业会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28042485/