我在Azure中有一个网络作业,托管在一个不用于任何用途的应用程序服务上。我目前正在从Visual Studio部署我的网络作业,但这将在未来发生变化,因为它还没有投入生产。这是一个.NET Core 3.1应用程序的网络作业,可以编译成EXE,但这对这个问题来说并不重要(我知道Azure函数,但这也不是我问题的一部分(。
网络作业是由队列触发的连续网络作业。我已将其设置为同时运行10个批次。我在网上寻找答案,但我发现答案不清楚。
我的问题是:假设我有3个工作在运行。然后我部署了EXE文件的新版本。这似乎没有问题。但是,正在运行的工作会发生什么呢?他们会一直跑到最后吗?还是会失败并停止?我还没有完全解决这个问题,我想在这里问一下,以防有人对此有帮助。
如果有帮助的话,我的队列相关配置是这样的:
.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddAzureStorage(a =>
{
a.BatchSize = 10;
a.NewBatchThreshold = 5;
a.MaxDequeueCount = 1;
a.MaxPollingInterval = TimeSpan.FromSeconds(20);
});
})
谢谢!
但是正在运行的作业会发生什么?他们会一直跑到最后吗?还是会失败并停止?
当使用WebJobs SDK的WebJob从队列中提取消息时,它会以10分钟的租约获取该消息如果作业进程在处理消息时终止,则租约将在10分钟后到期,消息将返回队列。如果重新启动WebJob,它将再次拾取该消息只有当功能成功完成时,才会删除该消息。
因此,如果作业终止并立即重新启动,就像在重新部署的情况下一样,可能需要长达10分钟的时间才能重新拾取消息。此外,正因为如此,建议您自己保存状态,或者使函数成为幂等函数。
在WebJobs Dashboard中,您将看到对同一消息的两次调用。其中一个将被标记为"从未完成",因为函数执行从未完成。
不幸的是,没有现成的解决方案可以防止作业在部署期间运行。您必须创建自己的逻辑,通知(通过队列消息?(部署即将启动,然后中止主机。主机中止将等待任何现有功能停止,并阻止新功能启动。然而,如果您有多个webjob实例,这是一个非常棘手的情况,因为其中只有一个实例会收到通知。