检测运行Azure功能内的更新/重新部署

时间:2016-06-16 08:06:51

标签: azure-webjobssdk azure-functions

WebJobs SDK supportsCancellationToken参数传递给SDK使用的函数,以通知正在运行的主机关闭功能。我注意到,如果app / function被新版本替换,则不会通知正在运行的函数。如果功能被设计为运行更长的时间,这是一个问题,因为你可能最终会遇到#34; old"逻辑运行而不知道它。

例如,如果您创建一个将永久运行(或直到取消)的简单函数:

using System;
using System.Threading;

public static async Task Run(string input, TraceWriter log, CancellationToken token)
{
    while (!token.IsCancellationRequested) 
    {    
        token.ThrowIfCancellationRequested();
        log.Info($"Input: {input}");
        await Task.Delay(2000, token).ConfigureAwait(false);
    }
}

如果你运行它,然后以某种方式更新代码并重新部署(或保存,如果你在Azure Functions门户中),你会看到该函数被重新编译但运行函数实例未停止,并将继续执行以前版本的代码,直到您手动禁用它。

有没有办法在正在运行的函数中检测重新部署?

1 个答案:

答案 0 :(得分:1)

当Function App主机关闭/重新启动时,Azure Functions确实遵循WebJobs SDK CancellationToken模型。但是,在上面的场景中,您只需更新功能代码本身,将不会触发主机重启,这就是令牌未被取消的原因。作为优化,我们只在绝对必要时重新启动主机,并且在简单代码更新的情况下,我们可以保持主机运行,并且只需在任何新调用上使用新代码。

这适用于函数调用不会永远存在的正常函数场景#34;我说while(true)函数是一种反模式 - 函数不是为这种类型的东西设计的,你可以用更好的方式完成你的场景。在相关的说明中,还将为GA之前的函数执行设置一些时间限制(可配置)。