基于目标的缩放
基于目标的缩放可为客户提供快速直观的缩放模型,目前支持以下绑定扩展:
- Apache Kafka
- Azure Cosmos DB
- Azure 事件中心
- Azure 队列存储
- Azure 服务总线(队列和主题)
基于目标的缩放取代了之前的 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 |
* 默认的 maxEventBatchSize
在 v6.0.0 的 Microsoft.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 文件中配置基于目标的缩放的方式取决于具体是哪种扩展类型。 本部分提供了当前支持基于目标的缩放的扩展的配置详细信息。
服务总线队列和主题
服务总线扩展支持三种执行模型,由服务总线触发器的 IsBatched
和 IsSessionsEnabled
属性确定。 IsBatched
和 IsSessionsEnabled
的默认值是 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
属性是 maxEventBatchSize
和 maxBatchSize
。 但如果选择微调基于目标的缩放,则可以定义一个用于替代的单独参数 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}");
}
}
}
}
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}");
}
后续步骤
若要了解详细信息,请参阅以下文章: