在 运行 Azure 函数中检测 update/redeployment
Detecting update/redeployment inside running Azure function
WebJobs SDK supports 将 CancellationToken
参数传递给 SDK 用来通知 运行ning 函数主机关闭的函数。我注意到,如果 app/function 被新版本替换,运行ning 函数不会收到通知。如果函数设计为 运行 的时间较长,这就是一个问题,因为您最终可能会在不知情的情况下拥有 "old" 逻辑 运行ning。
例如,如果您创建一个简单的函数,它将 运行 永远(或直到被取消):
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 门户中),你会看到函数被重新编译但是运行ning 函数实例不会停止,将继续执行以前版本的代码,直到您手动禁用它。
是否有某种方法可以检测 运行ning 函数内的重新部署?
当 Function App 主机关闭时,Azure Functions 支持 WebJobs SDK CancellationToken
模型 down/restarting。但是,在上面的场景中,您只是更新函数代码本身, 不会 触发主机重启,这就是令牌未被取消的原因。作为优化,我们只在绝对必要时才重启主机,在简单代码更新的情况下,我们可以保留主机 运行,并在任何新调用中使用新代码。
这适用于 Function 调用不存在的正常 Function 场景 "forever"。我会说 while(true)
函数是一种反模式 - 函数不是为那种类型的东西设计的,你可能会以更好的方式完成你的场景。在相关说明中,还将在 GA 之前为函数执行设置一些时间限制(可配置)。
WebJobs SDK supports 将 CancellationToken
参数传递给 SDK 用来通知 运行ning 函数主机关闭的函数。我注意到,如果 app/function 被新版本替换,运行ning 函数不会收到通知。如果函数设计为 运行 的时间较长,这就是一个问题,因为您最终可能会在不知情的情况下拥有 "old" 逻辑 运行ning。
例如,如果您创建一个简单的函数,它将 运行 永远(或直到被取消):
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 门户中),你会看到函数被重新编译但是运行ning 函数实例不会停止,将继续执行以前版本的代码,直到您手动禁用它。
是否有某种方法可以检测 运行ning 函数内的重新部署?
当 Function App 主机关闭时,Azure Functions 支持 WebJobs SDK CancellationToken
模型 down/restarting。但是,在上面的场景中,您只是更新函数代码本身, 不会 触发主机重启,这就是令牌未被取消的原因。作为优化,我们只在绝对必要时才重启主机,在简单代码更新的情况下,我们可以保留主机 运行,并在任何新调用中使用新代码。
这适用于 Function 调用不存在的正常 Function 场景 "forever"。我会说 while(true)
函数是一种反模式 - 函数不是为那种类型的东西设计的,你可能会以更好的方式完成你的场景。在相关说明中,还将在 GA 之前为函数执行设置一些时间限制(可配置)。