你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

基于目标的缩放

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

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

Illustration of the equation: desired instances = event source length / target executions per instance.

每个实例默认的目标执行次数值来自 Azure Functions 扩展使用的 SDK。 不需要对基于目标的缩放进行任何更改即可使用。

注意事项

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

  • 消耗计划或高级计划中的函数应用默认启用基于目标的缩放,但你可以选择退出。在专用(应用服务)计划上运行时,不支持事件驱动的缩放。
  • 默认情况下,函数应用运行时 4.19.0 或更高版本上会启用基于目标的缩放。
  • 使用基于目标的缩放时,functionAppScaleLimit 站点设置仍然有效。 有关详细信息,请参阅限制横向扩展
  • 为了根据指标实现最准确的缩放,请对每个函数应用只使用一个基于目标的触发器函数。
  • 当同一函数应用中的多个函数同时请求横向扩展时,将使用这些函数的总和来确定所需实例中的更改。 请求横向扩展的函数会替代请求横向缩减的函数。
  • 如果存在横向缩减请求而没有任何横向扩展请求,则会使用最大横向缩减值。

选择退出

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

应用设置
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}");
}

后续步骤

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