Zielbasierte Skalierung
Die zielbasierte Skalierung bietet ein schnelles und intuitives Skalierungsmodell für Kunden und wird derzeit für die folgenden Bindungserweiterungen unterstützt:
- Apache Kafka
- Azure Cosmos DB
- Azure Event Hubs
- Azure Queue Storage
- Azure Service Bus (Warteschlangen und Themen)
Zielbasierte Skalierung ersetzt das vorherige inkrementelle Skalierungsmodell von Azure Functions als Standard für diese Erweiterungstypen. Inkrementelle Skalierung hat maximal einen Worker bei jeder neuen Instanzrate mit komplexen Entscheidungen bezüglich der Skalierung hinzugefügt oder entfernt. Im Gegensatz dazu ermöglicht zielbasierte Skalierung das gleichzeitige Hochskalieren von vier Instanzen, und die Skalierungsentscheidung basiert auf einer einfachen zielbasierten Gleichung:
In dieser Gleichung bezieht sich die Ereignisquellenlänge auf die Anzahl der Ereignisse, die verarbeitet werden müssen. Die Standardwerte für Zielausführungen pro Instanz stammen aus den SDKs, die von den Azure Functions-Erweiterungen verwendet werden. Sie müssen keine Änderungen vornehmen, damit zielbasierte Skalierung funktioniert.
Überlegungen
Berücksichtigen Sie Folgendes, wenn Sie zielbasierte Skalierung verwenden:
- Die zielbasierte Skalierung ist standardmäßig für Funktions-Apps im Verbrauchstarif, im Flex-Verbrauchstarif und in Elastic Premium-Tarifen aktiviert. Die ereignisgesteuerte Skalierung wird nicht unterstützt, wenn sie auf dedizierten Tarifen (App Service) ausgeführt wird.
- Die zielbasierte Skalierung ist standardmäßig ab Version 4.19.0 der Functions-Laufzeit aktiviert.
- Wenn Sie die zielbasierte Skalierung verwenden, werden Skalierungsgrenzwerte weiterhin berücksichtigt. Weitere Informationen finden Sie unter Begrenzen des horizontalen Hochskalierens.
- Um eine möglichst genaue Skalierung basierend auf Metriken zu erzielen, verwenden Sie nur eine zielbasierte ausgelöste Funktion pro Funktions-App. Sie sollten auch die Ausführung in einem Flex-Verbrauchstarif in Betracht ziehen, der eine Skalierung pro Funktion bietet.
- Wenn mehrere Funktionen in derselben Funktions-App gleichzeitig eine horizontale Skalierung anfordern, wird eine Summe für diese Funktionen verwendet, um die Änderung in den gewünschten Instanzen zu bestimmen. Funktionen, die das Aufskalieren anfordern, setzen Funktionen außer Kraft, die das Abskalieren anfordern.
- Wenn keine Anforderung zum horizontalen Herunterskalieren vorhanden ist, Anforderungen jedoch horizontal skaliert werden, wird der Wert für das maximale Herunterskalieren verwendet.
Deaktivieren
Die zielbasierte Skalierung ist standardmäßig für Funktions-Apps aktiviert, die in einem Verbrauchsplan oder in Premium-Plänen gehostet werden. Um zielbasierte Skalierung zu deaktivieren und erneut inkrementelle Skalierung zu verwenden, fügen Sie der Funktions-App die folgende App-Einstellung hinzu:
App-Einstellung | Wert |
---|---|
TARGET_BASED_SCALING_ENABLED |
0 |
Anpassen von zielbasierter Skalierung
Sie können das Skalierungsverhalten basierend auf der Workload Ihrer App mehr oder weniger aggressiv gestalten, indem Sie die Zielausführungen pro Instanz anpassen. Jede Erweiterung verfügt über unterschiedliche Einstellungen, mit denen Sie die Zielausführungen pro Instanz festlegen können.
In dieser Tabelle werden die host.json
-Werte zusammengefasst, die für die Zielausführungen pro Instanz und verwendet werden, sowie die Standardwerte:
Durchwahl | host.json-Werte | Standardwert |
---|---|---|
Event Hubs (Erweiterung v5.x oder höher) | extensions.eventHubs.maxEventBatchSize | 100* |
Event Hubs (Erweiterung v3.x oder höher) | extensions.eventHubs.eventProcessorOptions.maxBatchSize | 10 |
Event Hubs (sofern definiert) | extensions.eventHubs.targetUnprocessedEventThreshold | – |
Service Bus (Erweiterung v5.x oder höher, Single Dispatch) | extensions.serviceBus.maxConcurrentCalls | 16 |
Service Bus (Erweiterung v5.x oder höher, sitzungsbasiert) | extensions.serviceBus.maxConcurrentSessions | 8 |
Service Bus (Erweiterung v5.x oder höher, Batchverarbeitung) | extensions.serviceBus.maxMessageBatchSize | 1000 |
Service Bus (Functions v2.x oder höher, Single Dispatch) | extensions.serviceBus.messageHandlerOptions.maxConcurrentCalls | 16 |
Service Bus (Functions v2.x oder höher, Single Dispatch, sitzungsbasiert) | extensions.serviceBus.sessionHandlerOptions.maxConcurrentSessions | 2000 |
Service Bus (Functions v2.x oder höher, Batchverarbeitung) | extensions.serviceBus.batchOptions.maxMessageCount | 1.000 |
Speicherwarteschlange | extensions.queues.batchSize | 16 |
* Der Standardwert maxEventBatchSize
wurde in Version 6.0.0 des Pakets Microsoft.Azure.WebJobs.Extensions.EventHubs
geändert. In früheren Versionen war dieser Wert 10.
Bei einigen Bindungserweiterungen wird die Zielausführung pro Instanz mithilfe eines Funktionsattributes festgelegt:
Erweiterung | Funktionstriggereinstellung | Standardwert |
---|---|---|
Apache Kafka | lagThreshold |
1.000 |
Azure Cosmos DB | maxItemsPerInvocation |
100 |
Weitere Informationen finden Sie in den Beispielkonfigurationen für die unterstützten Erweiterungen.
Premium-Plan mit aktivierter Überwachung von Laufzeitskalierung
Wenn die Überwachung der Laufzeitskalierung aktiviert ist, verarbeiten die Erweiterungen selbst die dynamische Skalierung. Dies liegt daran, dass der Skalierungscontroller keinen Zugriff auf Dienste hat, die durch ein virtuelles Netzwerk geschützt sind. Nachdem Sie die Überwachung der Laufzeitskalierung aktiviert haben, müssen Sie Ihre Erweiterungspakete auf diese Mindestversionen aktualisieren, um die zusätzliche zielbasierte Skalierungsfunktionalität zu entsperren:
Name der Erweiterung | Erforderliche Mindestversion |
---|---|
Apache Kafka | 3.9.0 |
Azure Cosmos DB | 4.1.0 |
Event Hubs | 5.2.0 |
Service Bus | 5.9.0 |
Speicherwarteschlange | 5.1.0 |
Unterstützung für dynamische Parallelität
Zielbasierte Skalierung führt zu einer schnelleren Skalierung und verwendet Standardwerte für Zielausführungen pro Instanz. Wenn Sie Service Bus, Storage-Warteschlangen oder Kafka verwenden, können Sie auch dynamische Parallelität aktivieren. In dieser Konfiguration wird der Wert für Zielausführungen pro Instanz automatisch durch das Feature für dynamische Parallelität bestimmt. Begonnen wird mit eingeschränkter Parallelität, dann wird im Laufe der Zeit die beste Einstellung identifiziert.
Unterstützte Erweiterungen
Wie Sie zielbasierte Skalierung in der Datei „host.json“ konfigurieren, hängt vom jeweiligen Erweiterungstyp ab. Dieser Abschnitt enthält die Konfigurationsdetails für die Erweiterungen, die derzeit zielbasierte Skalierung unterstützen.
Service Bus-Warteschlangen und -Themen
Die Service Bus-Erweiterung unterstützt drei Ausführungsmodelle, die durch die IsBatched
- und IsSessionsEnabled
-Attribute ihres Service Bus-Triggers bestimmt werden. Der Standardwert für IsBatched
und IsSessionsEnabled
ist false
.
Ausführungsmodell | IsBatched | IsSessionsEnabled | Für Zielausführungen pro Instanz verwendete Einstellung |
---|---|---|---|
Single Dispatch-Verarbeitung | false | false | maxConcurrentCalls |
Single Dispatch-Verarbeitung (sitzungsbasiert) | false | true | maxConcurrentSessions |
Batchverarbeitung | true | false | maxMessageBatchSize or maxMessageCount |
Hinweis
Skalierungseffizienz: Verwenden Sie für die Service Bus-Erweiterung Verwaltungsrechte für Ressourcen, um eine möglichst effiziente Skalierung zu erreichen. Mit Lauschrechten wird die Skalierung auf inkrementelle Skalierung zurückgesetzt, weil die Länge der Warteschlange oder des Themas nicht in Skalierungsentscheidungen einbezogen werden kann. Weitere Informationen zum Festlegen von Berechtigungen in Service Bus-Zugriffsrichtlinien finden Sie unter SAS-Autorisierungsrichtlinien.
Single Dispatch-Verarbeitung
In diesem Modell verarbeitet jeder Aufruf Ihrer Funktion eine einzelne Nachricht. Die maxConcurrentCalls
-Einstellung steuert die Zielausführungen pro Instanz. Die spezifische Einstellung hängt von der Version der Service Bus-Erweiterung ab.
Ändern Sie die host.json
-Einstellung maxConcurrentCalls
wie im folgenden Beispiel gezeigt:
{
"version": "2.0",
"extensions": {
"serviceBus": {
"maxConcurrentCalls": 16
}
}
}
Single Dispatch-Verarbeitung (sitzungsbasiert)
In diesem Modell verarbeitet jeder Aufruf Ihrer Funktion eine einzelne Nachricht. Abhängig von der Anzahl der aktiven Sitzungen für Ihr Service Bus-Thema bzw. Ihre -Warteschlange least jede Instanz jedoch mindestens eine Sitzung. Die spezifische Einstellung hängt von der Version der Service Bus-Erweiterung ab.
Ändern Sie die host.json
-Einstellung maxConcurrentSessions
, um Zielausführungen pro Instanz festzulegen, wie im folgenden Beispiel gezeigt:
{
"version": "2.0",
"extensions": {
"serviceBus": {
"maxConcurrentSessions": 8
}
}
}
Batchverarbeitung
In diesem Modell verarbeitet jeder Aufruf Ihrer Funktion einen Batch von Nachrichten. Die spezifische Einstellung hängt von der Version der Service Bus-Erweiterung ab.
Ändern Sie die host.json
-Einstellung maxMessageBatchSize
, um Zielausführungen pro Instanz festzulegen, wie im folgenden Beispiel gezeigt:
{
"version": "2.0",
"extensions": {
"serviceBus": {
"maxMessageBatchSize": 1000
}
}
}
Event Hubs
Für Azure Event Hubs wird Azure Functions basierend auf der Anzahl der nicht verarbeiteten Ereignisse skaliert, die auf alle Partitionen im Event Hub verteilt sind. Standardmäßig sind die für Zielausführungen pro Instanz verwendeten host.json
-Attribute maxEventBatchSize
und maxBatchSize
. Wenn Sie sich jedoch dafür entscheiden, zielbasierte Skalierung zu optimieren, können Sie einen separaten Parameter targetUnprocessedEventThreshold
definieren, der ein Überschreibung vornimmt, um Zielausführungen pro Instanz festzulegen, ohne die Batcheinstellungen zu ändern. Wenn targetUnprocessedEventThreshold
festgelegt ist, wird die Gesamtzahl der unverarbeiteten Ereignisse durch diesen Wert geteilt, um die Anzahl der Instanzen zu bestimmen, die auf eine Anzahl von Workerinstanzen aufgerundet wird, die eine ausgewogene Partitionsverteilung ergibt.
Hinweis
Da es sich bei Event Hubs um eine partitionierte Workload handelt, wird die Anzahl der Zielinstanzen für Event Hubs durch die Anzahl der Partitionen in Ihrem Event Hub begrenzt.
Die spezifische Einstellung hängt von der Version der Event Hubs-Erweiterung ab.
Ändern Sie die host.json
-Einstellung maxEventBatchSize
, um Zielausführungen pro Instanz festzulegen, wie im folgenden Beispiel gezeigt:
{
"version": "2.0",
"extensions": {
"eventHubs": {
"maxEventBatchSize" : 100
}
}
}
Wenn in host.json
definiert, wird targetUnprocessedEventThreshold
als Zielausführungen pro Instanz anstelle von maxEventBatchSize
verwendet, wie im folgenden Beispiel gezeigt:
{
"version": "2.0",
"extensions": {
"eventHubs": {
"targetUnprocessedEventThreshold": 153
}
}
}
Storage-Warteschlangen
Ändern Sie für v2.x oder höher der Speichererweiterung die host.json
-Einstellung batchSize
, um Zielausführungen pro Instanz festzulegen:
{
"version": "2.0",
"extensions": {
"queues": {
"batchSize": 16
}
}
}
Hinweis
Skalierungseffizienz: Für die Speicherwarteschlangenerweiterung werden Nachrichten mit visibilityTimeout weiterhin von den Speicherwarteschlangen-APIs in der Länge der Ereignisquelle gezählt. Dies kann zu einer Überskalierung Ihrer Funktions-App führen. Erwägen Sie die Verwendung von Service Bus-Warteschlangen mit geplanten Nachrichten, das Einschränken der horizontalen Skalierung oder die Verwendung von visibilityTimeout für Ihre Lösung.
Azure Cosmos DB
Azure Cosmos DB verwendet ein Attribut auf Funktionsebene: MaxItemsPerInvocation
. Wie Sie dieses Attribut auf Funktionsebene festlegen, hängt von Ihrer Funktionssprache ab.
Legen Sie für eine kompilierte C#-Funktion in Ihrer Triggerdefinition MaxItemsPerInvocation
fest, wie in den folgenden Beispielen für eine prozessinterne C#-Funktion gezeigt:
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}");
}
}
}
}
Hinweis
Da es sich bei Azure Cosmos DB um eine partitionierte Workload handelt, wird die Anzahl der Zielinstanzen für die Datenbank durch die Anzahl der physischen Partitionen in Ihrem Container begrenzt. Weitere Informationen zur Skalierung von Azure Cosmos DB finden Sie unter physische Partitionen und Leasebesitz.
Apache Kafka
Die Apache Kafka-Erweiterung verwendet ein Attribut auf Funktionsebene: LagThreshold
. Bei Kafka wird die Anzahl der gewünschten Instanzen basierend auf der Gesamtverzögerung der Consumer dividiert durch die LagThreshold
-Einstellung berechnet. Bei einer bestimmten Verzögerung erhöht die Verringerung der Verzögerungsschwelle die Anzahl der gewünschten Instanzen.
Wie Sie dieses Attribut auf Funktionsebene festlegen, hängt von Ihrer Funktionssprache ab. In diesem Beispiel wird der Schwellenwert auf 100
festgelegt.
Legen Sie für eine kompilierte C#-Funktion in Ihrer Triggerdefinition LagThreshold
fest, wie in den folgenden Beispielen für eine prozessinterne C#-Funktion für einen Kafka-Event Hubs-Trigger gezeigt:
[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}");
}
Nächste Schritte
Weitere Informationen erhalten Sie in den folgenden Artikeln: