Optimieren der Leistung und Zuverlässigkeit von Azure FunctionsOptimize the performance and reliability of Azure Functions

Dieser Artikel enthält Informationen zur Verbesserung der Leistung und Zuverlässigkeit Ihrer serverlosen Funktionen-Apps.This article provides guidance to improve the performance and reliability of your serverless function apps.

Allgemeine bewährte MethodenGeneral best practices

Nachfolgend finden Sie bewährte Methoden zum Entwickeln und Erstellen serverloser Lösungen mit Azure Functions.The following are best practices in how you build and architect your serverless solutions using Azure Functions.

Vermeiden von Funktionen mit langer AusführungsdauerAvoid long running functions

Umfangreiche Funktionen mit langer Ausführungsdauer können zu unerwarteten Zeitüberschreitungsfehlern führen.Large, long-running functions can cause unexpected timeout issues. Eine Funktion kann aufgrund der Vielzahl an Node.js-Abhängigkeiten umfangreich werden.A function can become large due to many Node.js dependencies. Zudem kann das Importieren von Abhängigkeiten zu längeren Ladezeiten und somit zu unerwarteten Timeouts führen.Importing dependencies can also cause increased load times that result in unexpected timeouts. Abhängigkeiten werden sowohl explizit als auch implizit geladen.Dependencies are loaded both explicitly and implicitly. Ein einzelnes Modul, das über Ihren Code geladen wird, kann eigene zusätzliche Module laden.A single module loaded by your code may load its own additional modules.

Nach Möglichkeit sollten Sie umfangreiche Funktionen durch Refactoring immer in kleinere Funktionssätze unterteilen, die zusammenarbeiten und schnelle Reaktionen ermöglichen.Whenever possible, refactor large functions into smaller function sets that work together and return responses fast. Für einen Webhook oder eine HTTP-Triggerfunktion ist unter Umständen eine Bestätigungsantwort innerhalb eines bestimmten Zeitraums erforderlich; bei Webhooks ist üblicherweise eine unmittelbare Antwort notwendig.For example, a webhook or HTTP trigger function might require an acknowledgment response within a certain time limit; it is common for webhooks to require an immediate response. Sie können die HTTP-Triggernutzlast an eine Warteschlange übergeben, damit sie von einer Funktion des Warteschlangentriggers verarbeitet wird.You can pass the HTTP trigger payload into a queue to be processed by a queue trigger function. Dieser Ansatz ermöglicht es Ihnen, die eigentliche Arbeit zurückzustellen und sofort eine Antwort zurückzugeben.This approach allows you to defer the actual work and return an immediate response.

Funktionsübergreifende KommunikationCross function communication

Durable Functions und Azure Logic Apps dienen zum Verwalten der Statusübergänge und der Kommunikation zwischen mehreren Funktionen.Durable Functions and Azure Logic Apps are built to manage state transitions and communication between multiple functions.

Wenn weder Durable Functions noch Logic Apps zum Integrieren mit mehreren Funktionen verwendet werden, haben sich Speicherwarteschlangen für die funktionsübergreifende Kommunikation bewährt.If not using Durable Functions or Logic Apps to integrate with multiple functions, it is generally a best practice to use storage queues for cross function communication. Der Hauptgrund ist, dass Speicherwarteschlangen kostengünstiger und deutlich einfacher bereitzustellen sind.The main reason is storage queues are cheaper and much easier to provision.

Einzelne Nachrichten in einer Speicherwarteschlange sind auf eine Größe von 64 KB beschränkt.Individual messages in a storage queue are limited in size to 64 KB. Wenn Sie größere Nachrichten zwischen Funktionen übergeben müssen, kann eine Azure Service Bus-Warteschlange verwendet werden, um Nachrichtengrößen von bis zu 256 KB im Standard-Tarif und bis zu 1 MB im Premium-Tarif zu unterstützen.If you need to pass larger messages between functions, an Azure Service Bus queue could be used to support message sizes up to 256 KB in the Standard tier, and up to 1 MB in the Premium tier.

Service Bus-Themen sind nützlich, wenn die Nachrichten vor der Verarbeitung gefiltert werden sollen.Service Bus topics are useful if you require message filtering before processing.

Event Hubs sind hilfreich, um die Kommunikation mit hohen Volumina zu unterstützen.Event hubs are useful to support high volume communications.

Schreiben von zustandslosen FunktionenWrite functions to be stateless

Funktionen sollten nach Möglichkeit zustandslos und idempotent sein.Functions should be stateless and idempotent if possible. Ordnen Sie Ihren Daten alle erforderlichen Zustandsinformationen zu.Associate any required state information with your data. Einer Bestellung, die verarbeitet wird, ist beispielsweise meist ein state-Member zugeordnet.For example, an order being processed would likely have an associated state member. Eine Funktion kann eine Bestellung basierend auf diesem Zustand verarbeiten, während die Funktion selbst zustandslos bleibt.A function could process an order based on that state while the function itself remains stateless.

Idempotente Funktionen sind besonders bei Triggern mit Timer zu empfehlen.Idempotent functions are especially recommended with timer triggers. Wenn bei Ihnen beispielsweise eine bestimmte Komponente immer einmal am Tag ausgeführt werden muss, sollten Sie sie so schreiben, dass sie zu einer beliebigen Tageszeit ausgeführt werden kann und immer die gleichen Ergebnisse liefert.For example, if you have something that absolutely must run once a day, write it so it can run any time during the day with the same results. Die Funktion kann beendet werden, wenn für einen bestimmten Tag keine Arbeit vorhanden ist.The function can exit when there is no work for a particular day. Falls die letzte Ausführung nicht abgeschlossen werden konnte, sollte die nächste Ausführung am entsprechenden Punkt fortgesetzt werden.Also if a previous run failed to complete, the next run should pick up where it left off.

Schreiben von defensiven FunktionenWrite defensive functions

Gehen Sie davon aus, dass es für Ihre Funktion jederzeit zu einer Ausnahme kommen kann.Assume your function could encounter an exception at any time. Entwerfen Sie Ihre Funktionen so, dass bei der nächsten Ausführung an einem vorherigen Fehlerpunkt angeknüpft werden kann.Design your functions with the ability to continue from a previous fail point during the next execution. Stellen Sie sich ein Szenario mit den folgenden Aktionen vor:Consider a scenario that requires the following actions:

  1. Abfrage von 10.000 Zeilen in einer Datenbank.Query for 10,000 rows in a db.
  2. Erstellen Sie eine Warteschlangennachricht für jede Zeile, um die spätere Verarbeitung zu ermöglichen.Create a queue message for each of those rows to process further down the line.

Je nach Komplexität Ihres Systems verfügen Sie ggf. über Folgendes: fehlerhaftes Verhalten von nachgelagerten Diensten, Netzwerkausfälle, Erreichung von Kontingentgrenzen usw. Alle diese Faktoren können sich jederzeit auf Ihre Funktion auswirken.Depending on how complex your system is, you may have: involved downstream services behaving badly, networking outages, or quota limits reached, etc. All of these can affect your function at any time. Sie müssen Ihre Funktionen entsprechend entwerfen, um darauf vorbereitet zu sein.You need to design your functions to be prepared for it.

Wie reagiert Ihr Code, wenn nach dem Einfügen von 5.000 dieser Elemente in eine Warteschlange zur Verarbeitung ein Fehler auftritt?How does your code react if a failure occurs after inserting 5,000 of those items into a queue for processing? Verfolgen Sie, welche Elemente eines Satzes bereits abgeschlossen sind.Track items in a set that you’ve completed. Andernfalls kann es ein, dass Sie sie beim nächsten Mal erneut einfügen.Otherwise, you might insert them again next time. Dies kann schwerwiegende Auswirkungen auf Ihren Workflow haben.This can have a serious impact on your work flow.

Wenn ein Warteschlangenelement bereits verarbeitet wurde, sollte es möglich sein, dass die Funktion eine No-Op-Funktion ist.If a queue item was already processed, allow your function to be a no-op.

Nutzen Sie Verteidigungsmaßnahmen, die für auf der Azure Functions-Plattform verwendete Komponenten bereits bereitgestellt wurden.Take advantage of defensive measures already provided for components you use in the Azure Functions platform. Informationen hierzu finden Sie beispielsweise in der Dokumentation zu Azure Storage-Warteschlangentriggern und -bindungen unter Behandeln von Nachrichten in der Warteschlange für nicht verarbeitbare Nachrichten.For example, see Handling poison queue messages in the documentation for Azure Storage Queue triggers and bindings.

Skalierbarkeit: Bewährte MethodenScalability best practices

Zahlreiche Faktoren beeinflussen die Skalierung von Instanzen Ihrer Funktionen-App.There are a number of factors which impact how instances of your function app scale. Ausführliche Informationen finden Sie in der Dokumentation zum Skalieren von Funktionen-Apps.The details are provided in the documentation for function scaling. Hier finden Sie bewährten Methoden, um die optimale Skalierbarkeit einer Funktionen-App sicherzustellen.The following are some best practices to ensure optimal scalability of a function app.

Freigeben und Verwalten von VerbindungenShare and manage connections

Verwenden Sie Verbindungen mit externen Ressourcen nach Möglichkeit wieder.Re-use connections to external resources whenever possible. Weitere Informationen finden Sie unter Verwalten von Verbindungen in Azure Functions.See how to manage connections in Azure Functions.

Vermeiden Sie es, Test- und Produktionscodes in der derselben Funktionen-App zu mischen.Don't mix test and production code in the same function app

Für Funktionen innerhalb einer Funktionen-App werden Ressourcen gemeinsam genutzt.Functions within a function app share resources. Dies gilt beispielsweise für den Arbeitsspeicher.For example, memory is shared. Wenn Sie eine Funktionen-App in der Produktion verwenden, sollten Sie ihr keine testbezogenen Funktionen und Ressourcen hinzufügen.If you're using a function app in production, don't add test-related functions and resources to it. Bei der Ausführung des Produktionscodes kann dies zu unerwartetem Mehraufwand führen.It can cause unexpected overhead during production code execution.

Überlegen Sie sich gut, was Sie in Ihre Funktionen-Apps für die Produktion laden.Be careful what you load in your production function apps. Der Arbeitsspeicher wird gleichmäßig auf die einzelnen Funktionen der App verteilt.Memory is averaged across each function in the app.

Wenn Sie eine gemeinsame Assembly nutzen, auf die in mehreren .NET-Funktionen verwiesen wird, sollten Sie sie in einem freigegebenen Ordner einfügen.If you have a shared assembly referenced in multiple .NET functions, put it in a common shared folder. Verweisen Sie mit einer Anweisung wie im folgenden Beispiel mit C# Scripts (.csx) auf die Assembly:Reference the assembly with a statement similar to the following example if using C# Scripts (.csx):

#r "..\Shared\MyAssembly.dll". 

Andernfalls ist es leicht möglich, dass Sie versehentlich mehrere Testversionen einer Binärdatei bereitstellen, die sich für die einzelnen Funktionen unterschiedlich verhalten.Otherwise, it is easy to accidentally deploy multiple test versions of the same binary that behave differently between functions.

Verwenden Sie im Produktionscode keine ausführliche Protokollierung.Don't use verbose logging in production code. Dies wirkt sich negativ auf die Leistung aus.It has a negative performance impact.

Verwenden von asynchronem Code bei Vermeidung von blockierenden AufrufenUse async code but avoid blocking calls

Die asynchrone Programmierung wird als bewährte Methode empfohlen.Asynchronous programming is a recommended best practice. Vermeiden Sie aber immer Verweise auf die Result-Eigenschaft oder Aufrufe der Wait-Methode für eine Task-Instanz.However, always avoid referencing the Result property or calling Wait method on a Task instance. Dieser Ansatz kann zur Threadauslastung führen.This approach can lead to thread exhaustion.

Tipp

Wenn Sie die HTTP- oder WebHook-Bindungen verwenden möchten, vermeiden Sie die Portauslastung, die durch nicht ordnungsgemäße Instanziierung von HttpClient verursacht werden kann.If you plan to use the HTTP or WebHook bindings, plan to avoid port exhaustion that can be caused by improper instantiation of HttpClient. Weitere Informationen finden Sie unter How to manage connections in Azure Functions (Verwalten von Verbindungen in Azure Functions).For more information, see How to manage connections in Azure Functions.

Empfangen von Nachrichten in Batches (sofern möglich)Receive messages in batch whenever possible

Einige Trigger wie Event Hub ermöglichen das Erhalten von mehreren Nachrichten in einem einzigen Aufruf.Some triggers like Event Hub enable receiving a batch of messages on a single invocation. Die Batchverarbeitung von Nachrichten ermöglicht eine viel bessere Leistung.Batching messages has much better performance. Sie können die maximale Batchgröße in der Datei host.json wie in der Dokumentation zur host.json-Referenz konfigurieren.You can configure the max batch size in the host.json file as detailed in the host.json reference documentation

Bei C#-Funktionen können Sie den Typ in ein stark typisiertes Array ändern.For C# functions you can change the type to a strongly-typed array. Beispielsweise könnte die Methodensignatur EventData sensorEvent statt EventData[] sensorEvent lauten.For example, instead of EventData sensorEvent the method signature could be EventData[] sensorEvent. Bei anderen Sprachen müssen Sie die Kardinalitätseigenschaft explizit in Ihrer function.json auf many festlegen, um die Batchverarbeitung wie hier gezeigt zu aktivieren.For other languages you'll need to explicitly set the cardinality property in your function.json to many in order to enable batching as shown here.

Konfigurieren des Host-Verhaltens zum besseren Verwalten der ParallelitätConfigure host behaviors to better handle concurrency

Die Datei host.json in der Funktionen-App ermöglicht die Konfiguration der Host-Laufzeit und des Triggerverhaltens.The host.json file in the function app allows for configuration of host runtime and trigger behaviors. Zusätzlich zur Batchverarbeitung von Verhalten können Sie die Parallelität für mehrere Trigger verwalten.In addition to batching behaviors, you can manage concurrency for a number of triggers. Eine häufige Anpassung der Werte in diesen Optionen kann die Skalierung der Instanz an die Anforderungen der aufgerufenen Funktionen vereinfachen.Often adjusting the values in these options can help each instance scale appropriately for the demands of the invoked functions.

Die Einstellungen in der Hostdatei gelten für alle Funktionen innerhalb der App in einer Einzelinstanz der Funktion.Settings in the hosts file apply across all functions within the app, within a single instance of the function. Wenn Sie eine Funktionen-App mit 2 HTTP-Funktionen und parallelen Anforderungen auf 25 festlegen, zählt eine Anforderung an die HTTP-Trigger zu den 25 parallelen Anforderungen.For example, if you had a function app with 2 HTTP functions and concurrent requests set to 25, a request to either HTTP trigger would count towards the shared 25 concurrent requests. Beim Skalieren dieser Funktionen-App auf 10 Instanzen, genehmigen die 2 Funktionen effektiv 250 parallele Anforderungen (10 Instanzen * 25 gleichzeitige Anforderungen pro Instanz).If that function app scaled to 10 instances, the 2 functions would effectively allow 250 concurrent requests (10 instances * 25 concurrent requests per instance).

HTTP-ParallelitätshostoptionenHTTP concurrency host options

{
    "http": {
        "routePrefix": "api",
        "maxOutstandingRequests": 200,
        "maxConcurrentRequests": 100,
        "dynamicThrottlesEnabled": true
    }
}
EigenschaftProperty StandardDefault BESCHREIBUNGDescription
routePrefixroutePrefix apiapi Das Routenpräfix, das für alle Routen gilt.The route prefix that applies to all routes. Verwenden Sie eine leere Zeichenfolge, um das Standardpräfix zu entfernen.Use an empty string to remove the default prefix.
maxOutstandingRequestsmaxOutstandingRequests 200*200* Die maximale Anzahl ausstehender Anforderungen, die zu einem beliebigen Zeitpunkt gespeichert werden.The maximum number of outstanding requests that are held at any given time. Dieser Grenzwert umfasst Anforderungen in der Warteschlange, deren Ausführung aber noch nicht gestartet ist, sowie alle laufenden Ausführungen.This limit includes requests that are queued but have not started executing, as well as any in progress executions. Alle eingehenden Anforderungen über diesem Grenzwert werden mit der Antwort 429 „Ausgelastet“ zurückgewiesen.Any incoming requests over this limit are rejected with a 429 "Too Busy" response. Das ermöglicht es dem Aufrufer zeitbasierte Strategien für Wiederholungsversuche einzusetzen, und Sie erhalten damit die Möglichkeit, die maximalen Wartezeiten für Anforderungen zu steuern.That allows callers to employ time-based retry strategies, and also helps you to control maximum request latencies. Damit wird nur das Queuing gesteuert, das innerhalb des Ausführungspfads des Skripthosts auftritt.This only controls queuing that occurs within the script host execution path. Andere Warteschlangen, z.B. die ASP.NET-Anforderungswarteschlange, sind von dieser Einstellung nicht betroffen und werden weiterhin verwendet.Other queues such as the ASP.NET request queue will still be in effect and unaffected by this setting. *Der Standardwert für Version 1.x ist unbegrenzt (-1).*The default for version 1.x is unbounded (-1). Der Standardwert für Version 2.x in einem Verbrauchstarif beträgt 200.The default for version 2.x in a consumption plan is 200. Der Standardwert für Version 2.x in einem dedizierten Plan ist unbegrenzt (-1).The default for version 2.x in a dedicated plan is unbounded (-1).
maxConcurrentRequestsmaxConcurrentRequests 100*100* Die maximale Anzahl von HTTP-Funktionen, die parallel ausgeführt werden.The maximum number of http functions that will be executed in parallel. Dadurch können Sie die Parallelität steuern und somit die Verwaltung der Ressourcenverwendung vereinfachen.This allows you to control concurrency, which can help manage resource utilization. Beispielsweise könnten Sie über eine HTTP-Funktion verfügen, die viele Systemressourcen (Speicher/CPU/Sockets) verbraucht und daher Probleme verursacht, wenn die Parallelität zu hoch ist.For example, you might have an http function that uses a lot of system resources (memory/cpu/sockets) such that it causes issues when concurrency is too high. Oder eine Funktion führt ausgehende Anforderungen an einen Dienst eines Drittanbieters durch, und die Rate dieser Aufrufe muss eingeschränkt werden.Or you might have a function that makes outbound requests to a third party service, and those calls need to be rate limited. In diesen Fällen kann eine Drosselung hilfreich sein.In these cases, applying a throttle here can help. *Der Standardwert für Version 1.x ist unbegrenzt (-1).*The default for version 1.x is unbounded (-1). Der Standardwert für Version 2.x in einem Verbrauchstarif beträgt 100.The default for version 2.x in a consumption plan is 100. Der Standardwert für Version 2.x in einem dedizierten Plan ist unbegrenzt (-1).The default for version 2.x in a dedicated plan is unbounded (-1).
dynamicThrottlesEnableddynamicThrottlesEnabled true*true* Bei einer Aktivierung dieser Einstellung überprüft die Pipeline zur Anforderungsverarbeitung regelmäßig Leistungsindikatoren zur Systemleistung wie Verbindungen/Threads/Prozesse/Speicher/CPU usw., und wenn einer dieser Leistungsindikatoren einen integrierten Schwellenwert (80 %) übersteigt, werden Anforderungen mit der Antwort „429 – Ausgelastet“ zurückgewiesen, bis die Leistungsindikatoren wieder ein normales Niveau erreichen.When enabled, this setting causes the request processing pipeline to periodically check system performance counters like connections/threads/processes/memory/cpu/etc. and if any of those counters are over a built-in high threshold (80%), requests will be rejected with a 429 "Too Busy" response until the counter(s) return to normal levels. *Der Standardwert für Version 1.x lautet „false“.*The default for version 1.x is false. Der Standardwert für Version 2.x in einem Verbrauchstarif lautet „true“.The default for version 2.x in a consumption plan is true. Der Standardwert für Version 2.x in einem dedizierten Tarif lautet „false“.The default for version 2.x in a dedicated plan is false.

Weitere Hostkonfigurationsoptionen finden Sie im Dokument zur Hostkonfiguration.Other host configuration options can be found in the host configuration document.

Nächste SchritteNext steps

Weitere Informationen finden Sie in den folgenden Ressourcen:For more information, see the following resources: