Azure WebJob部署

问题描述

我在Azure中有一个Webjob,该Webjob托管在未用于任何应用程序的应用程序服务上。我目前正在从Visual Studio部署我的webjob,但是由于它不在生产中,因此将来会有所改变。这是一个可编译为EXE的.NET Core 3.1应用程序Webjob,但这与该问题无关(而且我知道Azure函数,但这也不属于我的问题)。

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);
        });
    })

谢谢!

解决方法

但是正在运行的作业会怎样?他们会继续跑到底吗?还是会失败并停止?

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

因此,如果作业终止并立即重新启动(如重新部署的情况),则可能最多需要10分钟才能再次选择该消息。另外,因此,建议您自己保存状态或使该函数幂等。

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

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