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. Weitere Informationen zu Timeouts für einen bestimmten Hostingplan finden Sie unter Optimieren der Leistung und Zuverlässigkeit von Azure Functions.To learn more about the timeouts for a given hosting plan, see function app timeout duration.

Eine Funktion kann umfangreich werden, wenn sie über viele Node.js-Abhängigkeiten verfügt.A function can become large because of 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's 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 lets you 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's best to use storage queues for cross-function communication. Der Hauptgrund ist, dass Speicherwarteschlangen kostengünstiger und deutlich einfacher als andere Speicheroptionen bereitzustellen sind.The main reason is that storage queues are cheaper and much easier to provision than other storage options.

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 ein Mal 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 anytime 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's 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 database.
  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. Diese doppelte Einfügung kann ernsthafte Auswirkung auf Ihren Workflow haben, sodass Sie idempotente Funktionen verwenden sollten.This double-insertion can have a serious impact on your work flow, so make your functions idempotent.

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 Funktions-App.There are a number of factors that 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.Reuse 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. Andernfalls ist es leicht möglich, dass Sie versehentlich mehrere Versionen der gleichen Binärdatei bereitstellen, die sich für die einzelnen Funktionen unterschiedlich verhalten.Otherwise, you could accidentally deploy multiple versions of the same binary that behave differently between functions.

Verwenden Sie im Produktionscode keine ausführliche Protokollierung, da sich dies negativ auf die Leistung auswirkt.Don't use verbose logging in production code, which 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 Datei „host.json“ gelten für alle Funktionen innerhalb der App in einer Einzelinstanz der Funktion.Settings in the host.json file apply across all functions within the app, within a single instance of the function. Wenn Sie eine Funktionen-App mit zwei HTTP-Funktionen und maxConcurrentRequests-Anforderungen auf 25 festlegen, zählt eine Anforderung für einen der HTTP-Trigger zu den 25 gemeinsamen parallelen Anforderungen.For example, if you had a function app with two HTTP functions and maxConcurrentRequests requests set to 25, a request to either HTTP trigger would count towards the shared 25 concurrent requests. Beim Skalieren dieser Funktions-App auf 10 Instanzen erlauben die beiden Funktionen effektiv 250 parallele Anforderungen (10 Instanzen * 25 gleichzeitige Anforderungen pro Instanz).When that function app is scaled to 10 instances, the two functions effectively allow 250 concurrent requests (10 instances * 25 concurrent requests per instance).

Weitere Hostkonfigurationsoptionen finden Sie im Artikel zur host.json-Konfiguration.Other host configuration options are found in the host.json configuration article.

Nächste SchritteNext steps

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