0

我在 Azure 中有一个网络作业,托管在一个不用于任何用途的应用服务上。我目前正在从 Visual Studio 部署我的网络作业,但这将在未来发生变化,因为它不在生产中。这是一个编译为 EXE 的 .NET Core 3.1 应用程序 webjob,但这与这个问题无关(我知道 Azure Functions,但这也不是我的问题的一部分)。

webjob 是由队列触发的连续 webjob。我已将其设置为同时运行 10 个批次。我在网上找了答案,但我发现答案不清楚。

我的问题是:假设我有 3 个工作正在运行。然后我部署新版本的 EXE 文件。这似乎没有问题。但是正在运行的作业会发生什么?他们会一直跑到最后吗?还是会失败并停止?我还没有完全解决这个问题,我想在这里问一下,以防有人对此有帮助。

我的队列相关配置是这样的,如果有帮助的话:

.ConfigureWebJobs(b =>
    {
        b.AddAzureStorageCoreServices();
        b.AddAzureStorage(a =>
        {
            a.BatchSize = 10;
            a.NewBatchThreshold = 5;
            a.MaxDequeueCount = 1;
            a.MaxPollingInterval = TimeSpan.FromSeconds(20);
        });
    })

谢谢!

4

1 回答 1

1

但是正在运行的作业会发生什么?他们会一直跑到最后吗?还是会失败并停止?

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

因此,如果作业终止并立即重新启动,例如在重新部署的情况下,可能需要长达 10 分钟才能再次选择消息。此外,因此,建议您自己保存状态或使函数具有幂等性。

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

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

于 2020-09-24T06:30:54.613 回答