基于目标的缩放

基于目标的缩放可为客户提供快速直观的缩放模型,目前支持以下绑定扩展:

基于目标的缩放取代了之前的 Azure Functions 增量缩放模型,作为这些扩展类型的默认值。 过去,增量缩放以每次一个新实例的速率,最多添加或删除一个辅助角色,并且制定何时缩放的决策流程十分繁琐。 相比之下,基于目标的缩放允许一次纵向扩展四个实例,且基于以下简单的基于目标的公式制定缩放决策:

公式图示:所需实例 = 每个实例的事件源长度/目标执行次数。

在此公式中,事件源长度是指必须处理的事件数每个实例默认的目标执行次数值来自 Azure Functions 扩展使用的 SDK。 不需要对基于目标的缩放进行任何更改即可使用。

注意事项

使用基于目标的缩放时需考虑下列事项:

  • 消耗计划Flex 消耗计划弹性高级计划上的函数应用默认启用基于目标的缩放。 在专用(应用服务)计划中运行时,不支持事件驱动的缩放。
  • 从 Functions 运行时版本 4.19.0 开始,默认启用基于目标的缩放。
  • 使用基于目标的缩放时,仍遵循缩放限制。 有关详细信息,请参阅限制横向扩展
  • 为了根据指标实现最准确的缩放,请对每个函数应用只使用一个基于目标的触发器函数。 还应考虑在 Flex 消耗计划中运行,该计划提供按函数缩放
  • 当同一函数应用中的多个函数同时请求横向扩展时,将使用这些函数的总和来确定所需实例中的更改。 请求横向扩展的函数会替代请求横向缩减的函数。
  • 如果存在横向缩减请求而没有任何横向扩展请求,则会使用最大横向缩减值。

选择退出

消耗计划或高级计划上托管的函数应用默认启用基于目标的缩放。 要禁用基于目标的缩放并回退为增量缩放,请将以下应用设置添加到函数应用:

应用设置
TARGET_BASED_SCALING_ENABLED 0

自定义基于目标的缩放

可以通过调整每个实例的目标执行次数,根据应用的工作负载将缩放行为设置为更加激进或更加保守。 每个扩展都有不同设置,可用于设置每个实例的目标执行次数

下表汇总了每个实例的目标执行次数host.json值以及默认值所使用的 值:

分机 host.json 值 默认值
事件中心 (Extension v5.x+) extensions.eventHubs.maxEventBatchSize 100*
事件中心 (Extension v3.x+) extensions.eventHubs.eventProcessorOptions.maxBatchSize 10
事件中心(如已定义) extensions.eventHubs.targetUnprocessedEventThreshold 不适用
服务总线(Extension v5.x+、单一分派) extensions.serviceBus.maxConcurrentCalls 16
服务总线(Extension v5.x+、基于单一分派会话) extensions.serviceBus.maxConcurrentSessions 8
服务总线(Extension v5.x+、批处理) extensions.serviceBus.maxMessageBatchSize 1000
服务总线(Functions v2.x+、单一分派) extensions.serviceBus.messageHandlerOptions.maxConcurrentCalls 16
服务总线(Functions v2.x+、基于单一分派会话) extensions.serviceBus.sessionHandlerOptions.maxConcurrentSessions 2000
服务总线(Functions v2.x+、批处理) extensions.serviceBus.batchOptions.maxMessageCount 1000
存储队列 extensions.queues.batchSize 16

* 默认的 maxEventBatchSizev6.0.0Microsoft.Azure.WebJobs.Extensions.EventHubs 包中已更改。 在早期版本中,此值为 10。

对于某些绑定扩展,每个实例的目标执行数是使用某个函数属性设置的:

扩展 函数触发器设置 默认值
Apache Kafka lagThreshold 1000
Azure Cosmos DB maxItemsPerInvocation 100

若要了解详细信息,请参阅支持的扩展配置示例

已启用运行时缩放监视的高级计划

当启用了运行时缩放监视时,将由扩展本身来处理动态缩放。 这是因为缩放控制器无权访问受虚拟网络保护的服务。 启用运行时缩放监视后,你需要将扩展包升级到这些最低版本,以解锁额外的基于目标的缩放功能:

扩展名称 所需的最低版本
Apache Kafka 3.9.0
Azure Cosmos DB 4.1.0
事件中心 5.2.0
服务总线 5.9.0
存储队列 5.1.0

动态并发支持

基于目标的缩放引入了更快的缩放,并且使用每个实例的目标执行次数的默认值。 使用服务总线、存储队列或 Kafka 时,还可以启用动态并发。 在此配置中,动态并发功能会自动决定每个实例的目标执行次数值。 它从有限的并发开始,并标识一段时间内的最佳设置。

支持的扩展

在 host.json 文件中配置基于目标的缩放的方式取决于具体是哪种扩展类型。 本部分提供了当前支持基于目标的缩放的扩展的配置详细信息。

服务总线队列和主题

服务总线扩展支持三种执行模型,由服务总线触发器的 IsBatchedIsSessionsEnabled 属性确定。 IsBatchedIsSessionsEnabled 的默认值是 false

执行模型 IsBatched IsSessionsEnabled 每个实例的目标执行次数所使用的设置
单一分派处理 false false maxConcurrentCalls
单一分派处理(基于会话) false true maxConcurrentSessions
批处理 true false maxMessageBatchSize 或 maxMessageCount

注意

缩放效率:对于服务总线扩展,请使用资源的管理权限,以实现最有效的缩放。 使用侦听权限缩放还原为增量缩放时,因为队列或主题长度不能用于通知缩放决策。 若要详细了解如何在服务总线访问策略中设置权限,请参阅共享访问授权策略

单一分派处理

在此模型中,每次调用函数都会处理一条消息。 maxConcurrentCalls 设置控制每个实例的目标执行次数。 具体设置取决于“服务总线”扩展的版本。

如下所示,修改 host.json 设置 maxConcurrentCalls

{
    "version": "2.0",
    "extensions": {
        "serviceBus": {
            "maxConcurrentCalls": 16
        }
    }
}

单一分派处理(基于会话)

在此模型中,每次调用函数都会处理一条消息。 但是,每个实例根据“服务总线”主题或队列的活动会话数租用一个或多个会话。 具体设置取决于“服务总线”扩展的版本。

如下所示,修改 host.json 设置 maxConcurrentSessions 以设置每个实例的目标执行次数

{
    "version": "2.0",
    "extensions": {
        "serviceBus": {
            "maxConcurrentSessions": 8
        }
    }
}

批处理

在此模型中,每次调用函数都会处理一批消息。 具体设置取决于“服务总线”扩展的版本。

如下所示,修改 host.json 设置 maxMessageBatchSize 以设置每个实例的目标执行次数

{
    "version": "2.0",
    "extensions": {
        "serviceBus": {
            "maxMessageBatchSize": 1000
        }
    }
}

事件中心

对于 Azure 事件中心,Azure Functions 根据分布于事件中心所有分区的未处理事件数量进行缩放。 默认情况下,每个实例的目标执行次数使用的 host.json 属性是 maxEventBatchSizemaxBatchSize。 但如果选择微调基于目标的缩放,则可以定义一个用于替代的单独参数 targetUnprocessedEventThreshold,在不更改批次设置的情况下设置每个实例的目标执行次数。 如果已设置 targetUnprocessedEventThreshold,将未处理事件总数除以此值,可确定实例数,该数值之后向上舍入为创建均衡分区分布的辅助角色实例计数。

注意

由于“事件中心”是已分区的工作负载,因此“事件中心”的目标实例计数的上限为事件中心的分区数量。

具体设置取决于“事件中心”扩展的版本。

如下所示,修改 host.json 设置 maxEventBatchSize 以设置每个实例的目标执行次数

{
    "version": "2.0",
    "extensions": {
        "eventHubs": {
            "maxEventBatchSize" : 100
        }
    }
}

如下所示,当在 host.json 中定义时,targetUnprocessedEventThreshold 用作每个实例的目标执行次数,而不是 maxEventBatchSize

{
    "version": "2.0",
    "extensions": {
        "eventHubs": {
            "targetUnprocessedEventThreshold": 153
        }
    }
}

存储队列

如果“存储”扩展的版本是 v2.x+,则修改 host.json 设置 batchSize,以设置每个实例的目标执行次数

{
    "version": "2.0",
    "extensions": {
        "queues": {
            "batchSize": 16
        }
    }
}

注意

缩放效率:对于存储队列扩展,具有 visibilityTimeout 的消息仍由存储队列 API 按事件源长度计算。 这可能会导致函数应用过度缩放。 请考虑使用服务总线队列计划的消息、限制横向扩展或不对解决方案使用 visibilityTimeout。

Azure Cosmos DB

Azure Cosmos DB 使用函数级属性 MaxItemsPerInvocation。 设置此函数级属性的方式取决于使用哪种函数语言。

如果是已编译的 C# 函数,请在触发器定义中设置 MaxItemsPerInvocation,如以下进程内 C# 函数示例所示:

namespace CosmosDBSamplesV2
{
    public static class CosmosTrigger
    {
        [FunctionName("CosmosTrigger")]
        public static void Run([CosmosDBTrigger(
            databaseName: "ToDoItems",
            collectionName: "Items",
            MaxItemsPerInvocation: 100,
            ConnectionStringSetting = "CosmosDBConnection",
            LeaseCollectionName = "leases",
            CreateLeaseCollectionIfNotExists = true)]IReadOnlyList<Document> documents,
            ILogger log)
        {
            if (documents != null && documents.Count > 0)
            {
                log.LogInformation($"Documents modified: {documents.Count}");
                log.LogInformation($"First document Id: {documents[0].Id}");
            }
        }
    }
}

注意

由于 Azure Cosmos DB 是已分区的工作负载,因此数据库的目标实例计数上限为容器中物理分区的数量。 若要详细了解 Azure Cosmos DB 缩放,请参阅物理分区租用所有权

Apache Kafka

Apache Kafka 扩展使用函数级属性 LagThreshold。 对于 Kafka,所需实例数是通过将使用者滞后时间总计除以 LagThreshold 设置算出的。 当滞后时间一定时,减小滞后时间阈值会增加所需实例数。

设置此函数级属性的方式取决于使用哪种函数语言。 此示例将阈值设置为 100

如果是已编译的 C# 函数,请在触发器定义中设置 LagThreshold,如 Kafka 事件中心触发器的进程中 C# 函数的以下示例所示:

[FunctionName("KafkaTrigger")]
public static void Run(
    [KafkaTrigger("BrokerList",
                  "topic",
                  Username = "$ConnectionString",
                  Password = "%EventHubConnectionString%",
                  Protocol = BrokerProtocol.SaslSsl,
                  AuthenticationMode = BrokerAuthenticationMode.Plain,
                  ConsumerGroup = "$Default",
                  LagThreshold = 100)] KafkaEventData<string> kevent, ILogger log)
{            
    log.LogInformation($"C# Kafka trigger function processed a message: {kevent.Value}");
}

后续步骤

若要了解详细信息,请参阅以下文章: