Azure Functions 预热触发器

本文介绍了如何在 Azure Functions 中使用预热触发器。 当添加实例来缩放正在运行的函数应用时,会调用预热触发器。 使用预热触发器,你可以定义在启动函数应用的新实例时运行的函数。 你可以使用预热触发器来预加载自定义依赖项,使你的函数能够准备就绪,以便立即开始处理请求。 预热触发器的一些操作可能包括在应用开始接收流量之前打开连接、加载依赖项或运行任何其他自定义逻辑。

使用预热触发器时需考虑下列事项:

  • 预热触发器不适用于按消耗计划运行的应用。
  • Functions 运行时版本 1.x 不支持预热触发器。
  • 默认情况下,在所有开发环境中都提供对预热触发器的支持。 无需手动安装包或注册扩展。
  • 每个函数应用只能有一个预热触发器函数,并且在实例已经运行后无法对其进行调用。
  • 只有在执行横向扩展操作期间才会调用预热触发器,在重启或其他非缩放启动期间不会调用。 确保逻辑可以在不依赖预热触发器的情况下加载所有必需的依赖项。 延迟加载是实现此目的的一个好模式。
  • 预热触发器创建的依赖项应与应用中的其他函数共享。 若要了解详细信息,请参阅静态客户端
  • 如果使用内置身份验证(也称为 Easy Auth),则应启用“仅限 HTTPS”以便调用预热触发器。

示例

可使用以下 C# 模式之一来创建 C# 函数:

  • 进程内类库:编译的 C# 函数,该函数在与 Functions 运行时相同的进程中运行。
  • 独立工作进程类库:编译的 C# 函数,该函数在独立于运行时的工作进程中运行。 需要独立工作进程才能支持在 LTS 和非 LTS 版 .NET 和 .NET Framework 上运行的 C# 函数。
  • C# 脚本:主要在 Azure 门户中创建 C# 函数时使用。

下面的示例展示了一个 C# 函数,该函数在向应用添加新实例时在每个新实例上运行。

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

namespace SampleApp
{
    public static class Warmup
    {
        [Function(nameof(Warmup))]
        public static void Run([WarmupTrigger] object warmupContext, FunctionContext context)
        {
            var logger = context.GetLogger(nameof(Warmup));
            logger.LogInformation("Function App instance is now warm!");
        }
    }
}

下面的示例展示了一个预热触发器,该触发器将在向应用添加新实例时运行。

@FunctionName("Warmup")
public void warmup( @WarmupTrigger Object warmupContext, ExecutionContext context) {
    context.getLogger().info("Function App instance is warm.");
}

下面的示例展示了一个带有预热触发器的 JavaScript 函数,该触发器会在添加到应用的每个新实例上运行:

const { app } = require('@azure/functions');

app.warmup('warmupTrigger1', {
    handler: (warmupContext, context) => {
        context.log('Function App instance is warm.');
    },
});

下面的示例展示了一个带有预热触发器的 TypeScript 函数,该触发器会在添加到应用的每个新实例上运行:

import { app, InvocationContext, WarmupContext } from "@azure/functions";

export async function warmupFunction(warmupContext: WarmupContext, context: InvocationContext): Promise<void> {
    context.log('Function App instance is warm.');
}

app.warmup('warmup', {
    handler: warmupFunction,
});

function.json 文件如下所示:

{
    "bindings": [
        {
            "type": "warmupTrigger",
            "direction": "in",
            "name": "warmupContext"
        }
    ]
}

PowerShell 示例代码挂起。

下面的示例展示了 function.json 文件中的一个预热触发器和一个 Python 函数,该函数在向应用添加新实例时在每个新实例上运行。

函数必须命名为 warmup(不区分大小写),并且每个应用只能有一个预热函数。

function.json 文件如下所示:

{
    "bindings": [
        {
            "type": "warmupTrigger",
            "direction": "in",
            "name": "warmupContext"
        }
    ]
}

有关详细信息,请参阅配置

下面是 Python 代码:

import logging
import azure.functions as func


def main(warmupContext: func.Context) -> None:
    logging.info('Function App instance is warm.')

特性

进程内独立工作进程 C# 库都使用 WarmupTrigger 特性来定义函数。 C# 脚本改为使用 function.json 配置文件。

使用 WarmupTrigger 属性来定义该函数。 此特性没有参数。

批注

预热触发器不需要注释。 只需为 FunctionName 注释使用名称 warmup(不区分大小写)。

配置

无需在传递给 app.warmup() 方法的 options 对象上设置任何属性。

配置

下表解释了在 function.json 文件中设置的绑定配置属性。

“function.json”属性 说明
type 必需 - 必须设置为 warmupTrigger
direction 必需 - 必须设置为 in
name 必需 - 函数代码中使用的变量名称。 建议将 warmupContext 中的 name 用于绑定参数。

有关完整示例,请参阅示例部分

使用情况

以下注意事项适用于在 C# 中使用预热函数:

  • 必须使用 warmup 属性将函数命名为 Function(不区分大小写)。
  • 不需要返回值属性。
  • 使用 Microsoft.Azure.Functions.Worker.Extensions.Warmup
  • 可以将对象实例传递给函数。

必须使用 FunctionName 注释将函数命名为 warmup(不区分大小写)。

有关常规使用建议,请参阅页面顶部的注意事项列表。

function.json 中的函数类型必须设置为 warmupTrigger

后续步骤