Empfehlungen für die Entwicklung von Hintergrundaufträgen

Gilt für diese Empfehlung der Prüfliste für die Zuverlässigkeit von Azure Well-Architected Framework:

RE:07 Stärken Sie die Resilienz und Wiederherstellbarkeit Ihrer Workload, indem Sie Selbsterhaltungs- und Selbstreparaturmaßnahmen implementieren. Integrieren Sie Funktionen in die Lösung, indem Sie infrastrukturbasierte Zuverlässigkeitsmuster und softwarebasierte Entwurfsmuster verwenden, um Komponentenfehler und vorübergehende Fehler zu behandeln. Integrieren Sie Funktionen in das System, um Fehler von Lösungskomponenten zu erkennen und automatisch Korrekturmaßnahmen zu initiieren, während die Workload weiterhin mit voller oder eingeschränkter Funktionalität ausgeführt wird.

Verwandte Leitfäden:Vorübergehende | Fehlerselbsterhaltung

In diesem Leitfaden werden die Empfehlungen für die Entwicklung von Hintergrundaufträgen beschrieben. Hintergrundaufträge werden automatisch ohne Benutzerinteraktion ausgeführt. Viele Anwendungen erfordern Hintergrundaufträge, die unabhängig von der Benutzeroberfläche ausgeführt werden.

Einige Beispiele für Hintergrundaufträge sind Batchaufträge, intensive Verarbeitungsaufgaben und prozesse mit langer Ausführungsdauer, z. B. Workflows. Die Anwendung startet den Auftrag und verarbeitet interaktive Anforderungen von Benutzern. Wenn eine Anwendung beispielsweise Miniaturansichten von Bildern generieren muss, die Benutzer hochladen, kann ein Hintergrundauftrag ausgeführt werden, um die Miniaturansicht zu generieren und im Speicher zu speichern. Der Benutzer muss nicht warten, bis der Prozess abgeschlossen ist. Als weiteres Beispiel gibt ein Kunde eine Bestellung auf, die einen Hintergrundworkflow initiiert, der die Bestellung verarbeitet. Der Kunde durchsucht weiterhin die Web-App, während der Hintergrundauftrag ausgeführt wird. Nach Abschluss des Hintergrundauftrags werden die gespeicherten Bestelldaten aktualisiert und eine E-Mail an den Kunden gesendet, um die Bestellung zu bestätigen.

Hintergrundaufträge tragen dazu bei, die Last auf der Benutzeroberfläche der Anwendung zu minimieren, wodurch die Verfügbarkeit verbessert und die interaktive Antwortzeit reduziert wird.

Wichtige Entwurfsstrategien

Um auszuwählen, welche Aufgabe als Hintergrundauftrag festgelegt werden soll, überlegen Sie, ob die Aufgabe ohne Benutzerinteraktion ausgeführt wird und ob die Benutzeroberfläche auf den Abschluss der Aufgabe warten muss. Aufgaben, bei denen der Benutzer oder die Benutzeroberfläche warten muss, während sie ausgeführt werden, sind in der Regel keine geeigneten Hintergrundaufträge.

Typen von Hintergrundaufträgen

Einige Beispiele für Hintergrundaufträge sind:

  • CPU-intensive Aufträge, z. B. mathematische Berechnungen oder Strukturmodellanalysen.

  • E/A-intensive Aufträge, z. B. ausführen einer Reihe von Speichertransaktionen oder Indizierungsdateien.

  • Batchaufträge, z. B. nächtliche Datenaktualisierungen oder eine geplante Verarbeitung.

  • Workflows mit langer Ausführungsdauer, z. B. Auftragserfüllung oder Bereitstellungsdienste und -systeme.

  • Verarbeitung vertraulicher Daten, die die Aufgabe zur Verarbeitung an einen sichereren Ort überträgt. Beispiel: Sie möchten vertrauliche Daten nicht in einer Web-App verarbeiten. Stattdessen könnten Sie ein Muster wie Gatekeeper verwenden, um die Daten an einen isolierten Hintergrundprozess zu übertragen, der auf geschützten Speicher zugreifen kann.

Trigger

Initiieren von Hintergrundaufträgen mit:

  • Ereignisgesteuerte Trigger: Ein Ereignis, in der Regel eine Benutzeraktion oder ein Schritt in einem Workflow, löst die Aufgabe aus.

  • Zeitplangesteuerte Trigger: Ein Zeitplan, der auf einem Zeitgeber basiert, ruft den Task auf. Der Auftrag kann wiederholt oder für eine einzelne Ausführung geplant werden.

Ereignisgesteuerte Trigger

Eine Aktion löst einen ereignisgesteuerten Aufruf aus, der die Hintergrundaufgabe startet. Beispiele für ereignisgesteuerte Trigger sind:

  • Die Benutzeroberfläche oder ein anderer Auftrag platziert eine Nachricht in einer Warteschlange, wie im Architekturstil Web-Queue-Worker beschrieben. Die Nachricht enthält Daten zu einer zuvor ausgeführten Aktion, z. B. zu einem Kunden, der eine Bestellung aufgegeben hat. Der Hintergrundauftrag überwacht diese Warteschlange und erkennt das Eintreffen einer neuen Nachricht. Es liest die Nachricht und verwendet die Daten der Nachricht als Eingabe für den Hintergrundauftrag. Dieses Muster wird als asynchrone nachrichtenbasierte Kommunikation bezeichnet.

  • Die Benutzeroberfläche oder ein anderer Auftrag speichert oder aktualisiert einen Wert, der sich im Speicher befindet. Der Hintergrundauftrag überwacht den Speicher und erkennt Änderungen. Sie liest die Daten und verwendet sie als Eingabe für den Hintergrundauftrag.

  • Die Benutzeroberfläche oder ein anderer Auftrag sendet eine Anforderung an einen Endpunkt, z. B. einen HTTPS-URI oder eine API, die als Webdienst verfügbar gemacht wird. Im Rahmen der Anforderung überträgt die Benutzeroberfläche oder der Auftrag die Daten, die für die Hintergrundaufgabe erforderlich sind. Der Endpunkt oder Webdienst ruft die Hintergrundaufgabe auf, die die Daten als Eingabe verwendet.

Weitere Beispiele für Aufgaben, die für ereignisgesteuerte Aufrufe geeignet sind, sind Bildverarbeitung, Workflows, das Senden von Informationen an Remotedienste, das Senden von E-Mail-Nachrichten und die Bereitstellung neuer Benutzer in mehrinstanzenfähigen Anwendungen.

Zeitplangesteuerte Trigger

Ein Timer löst einen zeitplangesteuerten Aufruf aus, der die Hintergrundaufgabe startet. Beispiele für zeitplangesteuerte Trigger sind:

  • Ein Timer, der lokal innerhalb der Anwendung oder als Teil des Betriebssystems der Anwendung ausgeführt wird, ruft regelmäßig eine Hintergrundaufgabe auf.

  • Ein Timer, der in einer anderen Anwendung wie Azure Logic Apps ausgeführt wird, sendet regelmäßig eine Anforderung an eine API oder einen Webdienst. Die API oder der Webdienst ruft die Hintergrundaufgabe auf.

  • Ein separater Prozess oder eine separate Anwendung startet einen Timer, der die Hintergrundaufgabe nach einer Zeitverzögerung oder zu einem bestimmten Zeitpunkt aufruft.

Weitere Beispiele für Aufgaben, die für den zeitplangesteuerten Aufruf geeignet sind, sind Batchverarbeitungsroutinen (z. B. Aktualisieren verwandter Produktlisten für Kunden basierend auf ihrem aktuellen Verhalten), Routineaufgaben zur Datenverarbeitung (z. B. Aktualisieren von Indizes oder Generieren akkumulierter Ergebnisse), Datenanalyse für tägliche Berichte, Bereinigung der Datenaufbewahrung und Datenkonsistenzprüfungen.

Wenn Sie einen zeitplangesteuerten Task verwenden, der als einzelne instance ausgeführt werden muss, lesen Sie die folgenden Überlegungen:

  • Wenn die Compute-instance, die den Scheduler ausführt, z. B. ein virtueller Computer (VM), der geplante Windows-Aufgaben verwendet, skaliert wird, führen Sie mehrere Instanzen des Schedulers aus. Mehrere Instanzen des Schedulers können mehrere Instanzen der Aufgabe starten. Weitere Informationen finden Sie unter Was bedeutet idempotent in Softwaresystemen?

  • Wenn Tasks länger als der Zeitraum zwischen den Planerereignissen ausgeführt werden, startet der Planer möglicherweise eine weitere instance des Vorgangs, während der vorherige Task ausgeführt wird.

Zurückgeben von Ergebnissen

Hintergrundaufträge werden asynchron in einem separaten Prozess oder sogar an einem separaten Speicherort von der Benutzeroberfläche oder dem Prozess ausgeführt, der den Hintergrundauftrag aufgerufen hat. Im Idealfall handelt es sich bei Hintergrundaufträgen um Feuer- und Vergessenvorgänge . Der Laufzeitfortschritt hat keine Auswirkungen auf die Benutzeroberfläche oder den aufrufenden Prozess, was bedeutet, dass der aufrufende Prozess nicht auf den Abschluss der Aufgaben wartet. Die Benutzeroberfläche und der aufrufende Prozess können nicht erkennen, wann die Aufgabe endet.

Wenn Sie eine Hintergrundaufgabe für die Kommunikation mit der aufrufenden Aufgabe benötigen, um den Fortschritt oder den Abschluss anzuzeigen, müssen Sie einen Mechanismus implementieren. Einige Beispiele hierfür sind:

  • Schreiben Sie einen status Indikatorwert in den Speicher, auf den die Benutzeroberfläche oder die Aufruferaufgabe zugegriffen werden kann, die diesen Wert überwachen oder überprüfen kann. Andere Daten, die die Hintergrundaufgabe an den Aufrufer zurückgibt, können im selben Speicher abgelegt werden.

  • Richten Sie eine Antwortwarteschlange ein, die von der Benutzeroberfläche oder dem Aufrufer überwacht wird. Die Hintergrundaufgabe kann Nachrichten an die Warteschlange senden, die die status angeben. Daten, die die Hintergrundaufgabe an den Aufrufer zurückgibt, können in den Nachrichten platziert werden. Verwenden Sie für Azure Service Bus die ReplyTo Eigenschaften undCorrelationId, um diese Funktion zu implementieren.

  • Verfügbar machen Sie eine API oder einen Endpunkt der Hintergrundaufgabe verfügbar, auf die bzw. den die Benutzeroberfläche oder der Aufrufer zugreifen kann, um Statusinformationen abzurufen. Die Antwort kann die Daten enthalten, die die Hintergrundaufgabe an den Aufrufer zurückgibt.

  • Konfigurieren Sie die Hintergrundaufgabe so, dass sie über eine API auf die Benutzeroberfläche oder den Aufrufer zurückruft, um die status an vordefinierten Punkten oder nach Abschluss anzugeben. Sie können lokal ausgelöste Ereignisse oder einen Publish-and-Subscribe-Mechanismus verwenden. Die Anforderung oder die Ereignisnutzlast kann die Daten enthalten, die die Hintergrundaufgabe an den Aufrufer zurückgibt.

Partitionieren von Hintergrundaufträgen

Wenn Sie Hintergrundaufträge in eine vorhandene Compute-instance einschließen, sollten Sie berücksichtigen, wie sich diese Änderungen auf die Qualitätsattribute des Compute-instance und des Hintergrundauftrags auswirken. Berücksichtigen Sie diese Faktoren, um zu entscheiden, ob die Aufgaben mit dem vorhandenen Compute-instance oder in eine andere Compute-instance aufgeteilt werden sollen:

  • Verfügbarkeit: Hintergrundaufgaben benötigen möglicherweise nicht die gleiche Verfügbarkeitsebene wie andere Teile der Anwendung, insbesondere die Benutzeroberfläche und Teile, die die Benutzerinteraktion direkt betreffen. Hintergrundaufgaben können eine höhere Toleranz für Latenz, wiederholte Verbindungsfehler und andere Faktoren aufweisen, die sich auf die Verfügbarkeit auswirken, da die Vorgänge in die Warteschlange eingereiht werden können. Es muss jedoch genügend Kapazität vorhanden sein, um gesicherte Anforderungen zu verhindern, die Warteschlangen blockieren und sich auf die gesamte Anwendung auswirken können.

  • Skalierbarkeit: Hintergrundaufgaben haben wahrscheinlich andere Skalierbarkeitsanforderungen als die Benutzeroberfläche und die interaktiven Teile der Anwendung. Möglicherweise müssen Sie die Benutzeroberfläche skalieren, um Nachfragespitzen zu erfüllen. Ausstehende Hintergrundaufgaben können in Zeiten mit geringerer Auslastung und mit weniger Computeinstanzen ausgeführt werden.

  • Resilienz: Wenn ein Compute-instance, der nur Hintergrundaufgaben hostet, fehlschlägt, wirkt sich dies möglicherweise nicht negativ auf die gesamte Anwendung aus. Die Anforderungen für diese Aufgaben können in die Warteschlange eingereiht oder verschoben werden, bis die Aufgabe verfügbar ist. Wenn die Compute-instance oder Tasks innerhalb eines geeigneten Intervalls neu gestartet werden können, wirkt sich dies möglicherweise nicht auf die Anwendungsbenutzer aus.

  • Sicherheit: Hintergrundaufgaben haben möglicherweise unterschiedliche Sicherheitsanforderungen oder Einschränkungen im Vergleich zur Benutzeroberfläche oder anderen Teilen der Anwendung. Verwenden Sie eine separate Compute-instance, um eine andere Sicherheitsumgebung für die Aufgaben anzugeben. Um Sicherheit und Trennung zu maximieren, können Sie auch Muster wie Gatekeeper verwenden, um die Computeinstanzen im Hintergrund von der Benutzeroberfläche zu isolieren.

  • Leistung: Wählen Sie den Typ der Compute-instance für Hintergrundaufgaben aus, die speziell den Leistungsanforderungen der Aufgabe entsprechen. Sie können eine kostengünstigere Computeoption verwenden, wenn die Aufgaben nicht die gleichen Verarbeitungsfunktionen wie die Benutzeroberfläche erfordern. Oder Sie können eine größere instance verwenden, wenn die Aufgaben mehr Kapazität und Ressourcen erfordern.

  • Verwaltbarkeit: Hintergrundaufgaben haben möglicherweise einen anderen Entwicklungs- und Bereitstellungsrhythmus als der Standard Anwendungscode oder der Benutzeroberfläche. Um Updates und Versionsverwaltung zu vereinfachen, stellen Sie Hintergrundaufgaben auf einem separaten Compute-instance bereit.

  • Kosten: Wenn Sie Computeinstanzen hinzufügen, um Hintergrundaufgaben auszuführen, steigen die Hostingkosten. Berücksichtigen Sie sorgfältig den Kompromiss zwischen mehr Kapazität und zusätzlichen Kosten.

Weitere Informationen finden Sie unter Leader-Wahlmuster und Muster für konkurrierende Consumer.

Konflikte

Wenn Sie über mehrere Instanzen eines Hintergrundauftrags verfügen, konkurrieren diese möglicherweise um den Zugriff auf Ressourcen und Dienste, z. B. Datenbanken und Speicher. Dieser gleichzeitige Zugriff kann zu Ressourcenkonflikten führen, was zu Dienstverfügbarkeitskonflikten führen und die Integrität der daten beeinträchtigen kann, die sich im Speicher befinden. Lösen Sie Ressourcenkonflikte mithilfe eines pessimistischen Locking-Ansatzes. Dieser Ansatz verhindert, dass konkurrierende Instanzen einer Aufgabe gleichzeitig auf einen Dienst zugreifen oder Daten beschädigen.

Ein weiterer Ansatz zum Lösen von Konflikten besteht darin, Hintergrundaufgaben als Singleton zu definieren, sodass nur eine instance ausgeführt wird. Dieser Ansatz beseitigt jedoch die Zuverlässigkeits- und Leistungsvorteile, die eine Konfiguration mit mehreren instance bietet. Dieser Nachteil gilt insbesondere, wenn die Benutzeroberfläche genügend Arbeit bereitstellt, um mehr als eine Hintergrundaufgabe beschäftigt zu halten.

Stellen Sie sicher, dass die Hintergrundaufgabe automatisch neu gestartet werden kann und über genügend Kapazität verfügt, um Nachfragespitzen zu bewältigen. Weisen Sie eine Compute-instance mit ausreichenden Ressourcen zu, implementieren Sie einen Warteschlangenmechanismus, der Anforderungen speichert, die ausgeführt werden sollen, wenn die Nachfrage nachlässt, oder verwenden Sie eine Kombination dieser Techniken.

Koordination

Hintergrundaufgaben können komplex sein und mehrere Aufgaben ausführen. In diesen Szenarien ist es üblich, die Aufgabe in kleinere separate Schritte oder Teilvorgänge zu unterteilen, die von mehreren Consumern ausgeführt werden können. Mehrstufige Aufträge sind effizienter und flexibler, da einzelne Schritte häufig in mehreren Aufträgen wiederverwendbar sind. Es ist auch einfach, die Reihenfolge der Schritte hinzuzufügen, zu entfernen oder zu ändern.

Es kann eine Herausforderung sein, mehrere Aufgaben und Schritte zu koordinieren, aber es gibt drei allgemeine Muster, die Ihre Lösung leiten:

  • Zerlegen Sie eine Aufgabe in mehrere wiederverwendbare Schritte. Eine Anwendung muss möglicherweise verschiedene Aufgaben mit unterschiedlicher Komplexität für die verarbeiteten Informationen ausführen. Ein einfacher, aber unflexibler Ansatz für die Implementierung einer solchen Anwendung besteht darin, diese Verarbeitung als monolithisches Modul durchzuführen. Dieser Ansatz verringert jedoch wahrscheinlich die Möglichkeiten, den Code umzugestalten, zu optimieren oder wieder zu verwenden, wenn die Anwendung Teile derselben Verarbeitung an anderer Stelle erfordert. Weitere Informationen finden Sie unter Muster „Pipes und Filter“.

  • Verwalten Sie die Orchestrierung der Schritte für eine Aufgabe. Eine Anwendung kann Aufgaben ausführen, die viele Schritte umfassen, von denen einige Remotedienste aufrufen oder auf Remoteressourcen zugreifen können. Manchmal sind die einzelnen Schritte unabhängig voneinander, aber sie werden von der Anwendungslogik orchestriert, die die Aufgabe implementiert. Weitere Informationen finden Sie unter Muster „Scheduler-Agent-Supervisor“.

  • Verwalten Sie die Wiederherstellung für Aufgabenschritte, die fehlschlagen. Wenn mindestens einer der Schritte fehlschlägt, muss eine Anwendung möglicherweise die Arbeit rückgängig machen, die eine Reihe von Schritten ausführt, die zusammen einen letztlich konsistenten Vorgang definieren. Weitere Informationen finden Sie unter Kompensierendes Transaktionsmuster.

Überlegungen zur Resilienz

Erstellen Sie resiliente Hintergrundaufgaben, um zuverlässige Dienste für die Anwendung bereitzustellen. Berücksichtigen Sie beim Planen und Entwerfen von Hintergrundaufgaben die folgenden Punkte:

  • Hintergrundaufgaben müssen Neustarts ordnungsgemäß behandeln, ohne Daten zu beschädigen oder Inkonsistenzen in der Anwendung einzuführen. Für Aufgaben mit langer Ausführungsdauer oder mehrstufigen Aufgaben sollten Sie Prüfpunkte verwenden. Verwenden Sie Prüfpunkte, um den Status von Aufträgen im persistenten Speicher oder als Nachrichten in einer Warteschlange zu speichern. Beispielsweise können Sie Statusinformationen in einer Nachricht in einer Warteschlange speichern und diese Statusinformationen mit dem Vorgangsfortschritt inkrementell aktualisieren. Die Aufgabe kann vom letzten bekannten Prüfpunkt aus verarbeitet werden, anstatt von Anfang an neu zu starten.

    Verwenden Sie für Service Bus-Warteschlangen zu diesem Zweck Nachrichtensitzungen. Speichern und abrufen Sie bei Nachrichtensitzungen den Anwendungsverarbeitungsstatus mithilfe der Methoden SetState und GetState . Weitere Informationen zum Entwerfen zuverlässiger mehrstufiger Prozesse und Workflows finden Sie unter Scheduler Agent Supervisor-Muster.

  • Wenn Sie Warteschlangen zur Kommunikation mit Hintergrundaufgaben verwenden, können die Warteschlangen in Zeiten, in denen die Auslastung der Anwendung höher als üblich ist, als Puffer zum Speichern von Anforderungen, die an die Aufgaben gesendet werden, fungieren. Die Aufgaben können die Benutzeroberfläche in weniger ausgelasteten Zeiten aufholen, und Neustarts blockieren die Benutzeroberfläche nicht. Weitere Informationen finden Sie unter Warteschlangenbasiertes Belastungsausgleichsmuster. Wenn einige Aufgaben wichtiger sind als andere, sollten Sie das Muster "Prioritätswarteschlange " implementieren, um sicherzustellen, dass diese Aufgaben zuerst ausgeführt werden.

Nachrichten

Konfigurieren Sie Hintergrundaufgaben, die von Nachrichten initiiert werden oder die Nachrichten verarbeiten, um Inkonsistenzen zu behandeln, z. B. Nachrichten, die nicht ordnungsgemäß eintreffen, Nachrichten, die wiederholt einen Fehler verursachen (nicht verarbeitbare Nachrichten), und Nachrichten, die mehr als einmal übermittelt werden. Beachten Sie die folgenden Empfehlungen:

  • Manchmal müssen Nachrichten in einer bestimmten Reihenfolge verarbeitet werden, z. B. Nachrichten, die Daten basierend auf dem vorhandenen Datenwert ändern, z. B. hinzufügen eines Werts zu einem vorhandenen Wert. Nachrichten kommen nicht immer in der Reihenfolge an, in der sie gesendet wurden. Außerdem können verschiedene Instanzen einer Hintergrundaufgabe Nachrichten aufgrund unterschiedlicher Auslastung der einzelnen instance in einer anderen Reihenfolge verarbeiten.

    Fügen Sie für Nachrichten, die in einer bestimmten Reihenfolge verarbeitet werden müssen, eine Sequenznummer, einen Schlüssel oder einen anderen Indikator ein, mit dem Hintergrundaufgaben Nachrichten in der richtigen Reihenfolge verarbeiten können. Verwenden Sie für Service Bus Nachrichtensitzungen, um die richtige Reihenfolge der Zustellung zu gewährleisten. Es ist effizienter, den Prozess so zu entwerfen, dass die Nachrichtenreihenfolge nicht wichtig ist. Weitere Informationen finden Sie unter Nachrichtensequenzierung und Zeitstempel.

  • In der Regel wird bei einer Hintergrundaufgabe ein Blick auf Nachrichten in der Warteschlange ausgeführt, wodurch sie vorübergehend vor anderen Nachrichtenconsumern ausgeblendet werden. Nachdem die Aufgabe die Nachricht erfolgreich verarbeitet hat, löscht sie die Nachricht. Wenn eine Hintergrundaufgabe beim Verarbeiten einer Nachricht fehlschlägt, wird diese Nachricht nach Ablauf des Timeouts für die Einsehen erneut in der Warteschlange angezeigt. Eine andere instance der Aufgabe verarbeitet die Nachricht oder der nächste Verarbeitungszyklus des ursprünglichen instance die Nachricht verarbeitet.

    Wenn die Nachricht konsistent einen Fehler im Consumer verursacht, blockiert sie die Aufgabe, die Warteschlange und schließlich die Anwendung selbst, wenn die Warteschlange voll ist. Es ist wichtig, nicht verarbeitbare Nachrichten zu erkennen und aus der Warteschlange zu entfernen. Wenn Sie Service Bus verwenden, verschieben Sie nicht verarbeitbare Nachrichten automatisch oder manuell in eine zugeordnete Warteschlange für unzustellbare Nachrichten.

  • Warteschlangen sind Mindestens einmal-Übermittlungsmechanismen, aber sie können die gleiche Nachricht mehrmals übermitteln. Wenn eine Hintergrundaufgabe nach der Verarbeitung einer Nachricht, aber vor dem Löschen aus der Warteschlange fehlschlägt, steht die Nachricht erneut zur Verarbeitung zur Verfügung.

    Hintergrundaufgaben sollten idempotent sein, d. h., wenn die Aufgabe dieselbe Nachricht mehr als einmal verarbeitet, verursacht dies keinen Fehler oder Inkonsistenzen in den Anwendungsdaten. Einige Vorgänge sind natürlich idempotent, z. B. wenn ein gespeicherter Wert auf einen bestimmten neuen Wert festgelegt ist. Einige Vorgänge führen jedoch zu Inkonsistenzen, z. B. wenn ein Wert einem vorhandenen gespeicherten Wert hinzugefügt wird, ohne zu überprüfen, ob der gespeicherte Wert immer noch derselbe ist wie beim ursprünglichen Senden der Nachricht. Konfigurieren Sie Service Bus-Warteschlangen, um duplizierte Nachrichten automatisch zu entfernen. Weitere Informationen finden Sie unter Idempotente Nachrichtenverarbeitung.

  • Einige Messagingsysteme, z. B. Azure Storage-Warteschlangen und Service Bus-Warteschlangen, unterstützen eine Dequeue count-Eigenschaft, die angibt, wie oft eine Nachricht aus der Warteschlange gelesen wird. Diese Daten sind nützlich für die Behandlung von wiederholten Nachrichten und nicht verarbeitbaren Nachrichten. Weitere Informationen finden Sie unter Asynchrone Messaging-Primer und Idempotenzmuster.

Überlegungen zur Skalierung und Leistung

Hintergrundaufgaben müssen eine ausreichende Leistung bieten, um sicherzustellen, dass sie die Anwendung nicht blockieren oder den Vorgang verzögern, wenn das System unter Auslastung steht. In der Regel verbessert sich die Leistung, wenn Sie die Computeinstanzen skalieren, die die Hintergrundaufgaben hosten. Berücksichtigen Sie beim Planen und Entwerfen von Hintergrundaufgaben die folgenden Punkte im Zusammenhang mit Skalierbarkeit und Leistung:

  • Azure Virtual Machines und das Web-Apps-Feature von Azure App Service können Bereitstellungen hosten. Sie unterstützen die automatische Skalierung, sowohl horizontale als auch horizontale Skalierung. Die automatische Skalierung wird durch den Bedarf und die Auslastung oder einen vordefinierten Zeitplan bestimmt. Verwenden Sie die automatische Skalierung, um sicherzustellen, dass die Anwendung über ausreichende Leistungsfunktionen verfügt, während die Laufzeitkosten minimiert werden.

  • Einige Hintergrundaufgaben verfügen über eine andere Leistungsfunktion als andere Teile einer Anwendung, z. B. die Benutzeroberfläche oder Komponenten, z. B. die Datenzugriffsebene. In diesem Szenario hosten Sie die Hintergrundaufgaben gemeinsam in einem separaten Computedienst, damit ui- und Hintergrundaufgaben unabhängig skaliert werden können, um die Last zu verwalten. Wenn mehrere Hintergrundaufgaben über erheblich unterschiedliche Leistungsfunktionen verfügen, teilen Sie sie auf, und skalieren Sie jeden Typ unabhängig voneinander. Diese Technik kann die Laufzeitkosten erhöhen.

  • Um leistungseinbußen unter Last zu verhindern, müssen Sie möglicherweise auch Speicherwarteschlangen und andere Ressourcen skalieren, damit ein einzelner Punkt der Verarbeitungskette keinen Engpass verursacht. Berücksichtigen Sie andere Einschränkungen, z. B. den maximalen Durchsatz von Speicher und anderen Diensten, auf die die Anwendung und die Hintergrundaufgaben angewiesen sind.

  • Entwerfen sie Hintergrundaufgaben für die Skalierung. Beispielsweise müssen Hintergrundaufgaben dynamisch die Anzahl der verwendeten Speicherwarteschlangen erkennen, um Nachrichten zu überwachen oder Nachrichten an die entsprechende Warteschlange zu senden.

  • Standardmäßig wird ein WebJob mit dem zugeordneten Web-Apps instance skaliert. Wenn ein WebJob jedoch nur als einzelner instance ausgeführt werden soll, können Sie eine Settings.job-Datei erstellen, die die JSON-Daten { "is_singleton": true }enthält. Diese Methode zwingt Azure, nur eine instance des WebJobs auszuführen, auch wenn mehrere Instanzen der zugeordneten Web-App vorhanden sind. Diese Technik ist nützlich für geplante Aufträge, die nur als einzelne instance ausgeführt werden müssen.

  • Hintergrundaufträge können zu Herausforderungen bei der Datensynchronisierung und Prozesskoordination führen, insbesondere wenn die Hintergrundaufgaben voneinander oder von anderen Datenquellen abhängen. Beispielsweise können Hintergrundaufträge Probleme mit der Datenkonsistenz, Racebedingungen, Deadlocks oder Timeouts behandeln.

  • Hintergrundaufträge können sich auf die Benutzererfahrung auswirken, wenn dem Benutzer die Ergebnisse der Hintergrundaufgaben angezeigt werden. Beispielsweise können Hintergrundaufträge erfordern, dass der Benutzer auf eine Benachrichtigung wartet, die Seite aktualisiert oder die status der Aufgabe manuell überprüft. Diese Verhaltensweisen können die Komplexität der Benutzerinteraktion erhöhen und sich negativ auf die Benutzererfahrung auswirken.

Kompromiss: Hintergrundaufträge führen mehr Komponenten und Abhängigkeiten in das System ein, was die Komplexität und die Wartungskosten der Lösung erhöhen kann. Beispielsweise können Hintergrundaufträge einen separaten Warteschlangendienst, einen Workerdienst, einen Überwachungsdienst und einen Wiederholungsmechanismus erfordern.

Azure-Erleichterung

In den folgenden Abschnitten werden die Azure-Dienste beschrieben, die Sie zum Hosten, Ausführen, Konfigurieren und Verwalten von Hintergrundaufträgen verwenden können.

Hostumgebungen

Es gibt mehrere Azure-Plattformdienste, die Hintergrundaufgaben hosten können:

  • Web-Apps und WebJobs: Verwenden Sie das WebJobs-Feature von App Service, um benutzerdefinierte Aufträge auszuführen, die auf verschiedenen Skripts oder Programmen basieren, die Sie in einer Web-App ausführen können.

  • Azure Functions: Verwenden Sie Funktions-Apps für Hintergrundaufträge, die lange nicht ausgeführt werden. Sie können Funktions-Apps auch verwenden, wenn Sie Ihre Workload auf einem nicht ausgelasteten App Service-Plan hosten.

  • Virtual Machines: Wenn Sie über einen Windows-Dienst verfügen oder windows Task Scheduler verwenden möchten, hosten Sie Ihre Hintergrundaufgaben auf einer dedizierten VM.

  • Azure Batch: Batch ist ein Plattformdienst, mit dem Sie rechenintensive Arbeit für die Ausführung auf einer verwalteten Sammlung von VMs planen können. Sie ermöglicht das automatische Skalieren von Computeressourcen.

  • Azure Kubernetes Service (AKS): AKS stellt eine verwaltete Hostingumgebung für Kubernetes in Azure bereit.

  • Azure Container Apps: Mit Container Apps können Sie serverlose Microservices erstellen, die auf Containern basieren.

Die folgenden Abschnitte enthalten Überlegungen zu jeder dieser Optionen, die Ihnen bei der Auswahl der für Sie am besten geeigneten Option helfen.

Web-Apps und WebJobs

Sie können das WebJobs-Feature verwenden, um benutzerdefinierte Aufträge als Hintergrundaufträge in einer Web-App auszuführen. Ein WebJob wird als kontinuierlicher Prozess im Kontext Ihrer Web-App ausgeführt. Ein WebJob kann auch als Reaktion auf ein Triggerereignis von Logic Apps oder externen Faktoren wie Änderungen an Speicherblobs oder Nachrichtenwarteschlangen ausgeführt werden. WebJobs können bei Bedarf gestartet und beendet und ordnungsgemäß heruntergefahren werden. Wenn ein fortlaufend ausgeführter WebJob fehlschlägt, wird er automatisch neu gestartet. Sie können Wiederholungs- und Fehleraktionen konfigurieren.

Wenn Sie einen WebJob konfigurieren:

  • Wenn der Auftrag auf einen ereignisgesteuerten Trigger reagieren soll, konfigurieren Sie ihn für fortlaufende Ausführung. Das Skript oder Programm wird in dem Ordner mit dem Namen site/wwwroot/app_data/jobs/continuous gespeichert.

  • Wenn der Auftrag auf einen zeitplangesteuerten Trigger reagieren soll, konfigurieren Sie ihn so , dass er nach einem Zeitplan ausgeführt wird. Das Skript oder Programm wird im Ordner "site/wwwroot/app_data/jobs/triggered" gespeichert.

  • Wenn Sie beim Konfigurieren eines Auftrags die Option Bei Bedarf ausführen auswählen, wird beim Starten des Auftrags derselbe Code wie bei der Option Nach Zeitplan ausführen ausgeführt.

Ein WebJob wird in der Sandbox der Web-App ausgeführt. Sie hat Zugriff auf Umgebungsvariablen und kann Informationen, z. B. Verbindungszeichenfolgen, für die Web-App freigeben. Der WebJob hat Zugriff auf den eindeutigen Bezeichner des Computers, auf dem der WebJob ausgeführt wird. Die Verbindungszeichenfolge namens AzureWebJobsStorage bietet Zugriff auf Speicherwarteschlangen, Blobs und Tabellen für Anwendungsdaten. Sie bietet auch Zugriff auf Service Bus für Messaging und Kommunikation. Die Verbindungszeichenfolge namens AzureWebJobsDashboard bietet Zugriff auf die WebJob-Aktionsprotokolldateien.

WebJobs weisen die folgenden Merkmale auf:

  • Sicherheit: Die Anmeldeinformationen für die Bereitstellung der Web-App bieten Schutz für WebJobs.

  • Unterstützte Dateitypen: Definieren Sie WebJobs mithilfe von Befehlsskripts (.cmd), Batchdateien (.bat), PowerShell-Skripts (.ps1), Bash-Shellskripts (.sh), PHP-Skripts (.php), Python-Skripts (.py), JavaScript-Code (.js) und ausführbaren Programmen (.exe und JAR).

  • Bereitstellung: Sie können Skripts und ausführbare Dateien mithilfe des Azure-Portal, Visual Studio oder des WebJobs SDK bereitstellen oder sie direkt an die folgenden Speicherorte kopieren:

    • Für die ausgelöste Bereitstellung: site/wwwroot/app_data/jobs/triggered/<job name>

    • Für Continuous Deployment: site/wwwroot/app_data/jobs/continuous/<job name>

  • Protokolldateien: Console.Out wird als INFObehandelt oder markiert. Console.Error wird als ERRORbehandelt. Verwenden Sie das Portal, um auf Überwachungs- und Diagnose-Informationen zuzugreifen. Laden Sie Protokolldateien direkt von der Website herunter. Protokolldateien werden an den folgenden Speicherorten gespeichert:

    • Für die ausgelöste Bereitstellung: Vfs/data/jobs/triggered/<auftragsname>

    • Für Continuous Deployment: Vfs/data/jobs/continuous/<job name>

  • Konfiguration: Konfigurieren Sie WebJobs mithilfe des Portals, der REST-API und PowerShell. Verwenden Sie eine Konfigurationsdatei namens settings.job, die sich im selben Stammverzeichnis wie das WebJob-Skript befindet, um Konfigurationsinformationen für einen WebJob bereitzustellen. Beispiel:

    • { "stopping_wait_time": 60 }

    • { "is_singleton": true }

Überlegungen zu Web-Apps und WebJobs

  • Standardmäßig werden WebJobs mit der Web-App skaliert. Um WebJobs für die Ausführung auf einem einzelnen instance zu konfigurieren, legen Sie die is_singleton Konfigurationseigenschaft auf festtrue. Einzelne instance WebJobs sind nützlich für Aufgaben, die Sie nicht als gleichzeitige mehrere Instanzen skalieren oder ausführen möchten, z. B. neu indizieren oder datenanalysen.

  • Um die Auswirkungen von WebJobs auf die Leistung der Web-App zu minimieren, erstellen Sie eine leere Web-App instance in einem neuen App Service planen, lange ausgeführte oder ressourcenintensive WebJobs zu hosten.

Überprüfung auf

Azure Functions ähnelt WebJobs. Azure Functions ist serverlos und eignet sich am besten für ereignisgesteuerte Trigger, die für einen kurzen Zeitraum ausgeführt werden. Sie können auch Azure Functions verwenden, um geplante Aufträge über Zeitgebertrigger auszuführen, wenn Sie eine Funktion so konfigurieren, dass sie zu bestimmten Zeiten ausgeführt wird.

Azure Functions wird für große Tasks mit langer Ausführungsdauer nicht empfohlen, da eine Funktion zu unerwarteten Timeouts führen kann. Je nach Hostingplan sollten Sie jedoch Funktionen für zeitplangesteuerte Trigger verwenden.

Überlegungen zu Azure Functions

Wenn Sie erwarten, dass die Hintergrundaufgabe als Reaktion auf ein Ereignis für eine kurze Dauer ausgeführt wird, sollten Sie die Aufgabe im Verbrauchsplan ausführen. Sie können die Laufzeit auf eine maximale Zeit konfigurieren. Eine Funktion, deren Ausführung länger dauert, verursacht höhere Kosten. CPU-intensive Aufträge, die mehr Arbeitsspeicher verbrauchen, können teurer sein. Wenn Sie zusätzliche Trigger für Dienste als Teil Ihrer Aufgabe verwenden, werden diese separat in Rechnung gestellt.

Der Premium-Plan eignet sich, wenn Sie mehrere Aufgaben haben, die kurz sind, aber kontinuierlich ausgeführt werden. Dieser Plan ist teurer, da er mehr Arbeitsspeicher und CPU benötigt. Als Vorteil können Sie andere Features verwenden, z. B. die Integration virtueller Netzwerke.

Der dedizierte Plan eignet sich für Hintergrundaufträge, wenn Ihre Workload bereits im dedizierten Plan ausgeführt wird. Wenn Sie über nicht ausgelastete VMs verfügen, können Sie den dedizierten Plan auf derselben VM ausführen und die Computekosten gemeinsam nutzen.

Weitere Informationen finden Sie unter

Virtual Machines

Sie können Hintergrundaufgaben implementieren, damit sie nicht in Web-Apps bereitgestellt werden. Beispielsweise können Sie Aufgaben mithilfe von Windows-Diensten, Hilfsprogrammen von Drittanbietern oder ausführbaren Programmen implementieren. Sie können auch Programme verwenden, die für eine Laufzeitumgebung geschrieben wurden, die sich von der Umgebung unterscheidet, die die Anwendung hostet. Sie können beispielsweise ein Unix- oder Linux-Programm verwenden, das Sie über eine Windows- oder .NET-Anwendung ausführen möchten. Wählen Sie aus mehreren Betriebssystemen für eine Azure-VM aus, und führen Sie Ihren Dienst oder Ihre ausführbare Datei auf diesem virtuellen Computer aus.

Weitere Informationen finden Sie unter

Um die Hintergrundaufgabe auf einem separaten virtuellen Computer zu initiieren, haben Sie folgende Möglichkeiten:

  • Senden Sie eine Anforderung an einen Endpunkt, den der Task verfügbar macht, um die Aufgabe bei Bedarf direkt von Ihrer Anwendung auszuführen. Die Anforderung überträgt Daten, die für den Task erforderlich sind. Der Endpunkt ruft die Aufgabe auf.

  • Verwenden Sie einen Scheduler oder Timer des ausgewählten Betriebssystems, um den Task für die Ausführung nach einem Zeitplan zu konfigurieren. Unter Windows können Sie beispielsweise den Windows-Taskplaner verwenden, um Skripts und Aufgaben auszuführen. Wenn Sie auf dem virtuellen Computer SQL Server installiert haben, verwenden Sie SQL Server-Agent, um Skripts und Aufgaben auszuführen.

  • Verwenden Sie Logic Apps, um die Aufgabe zu initiieren, indem Sie eine Nachricht zu einer Warteschlange hinzufügen, die von der Aufgabe überwacht wird, oder indem Sie eine Anforderung an eine API senden, die von der Aufgabe verfügbar gemacht wird.

Weitere Informationen dazu, wie Sie Hintergrundaufgaben initiieren können, finden Sie im vorherigen Abschnitt Trigger .

Überlegungen zu Virtual Machines

Berücksichtigen Sie die folgenden Punkte, wenn Sie Hintergrundaufgaben auf einer Azure-VM bereitstellen:

  • Hosten Sie Hintergrundaufgaben auf einer separaten Azure-VM, um Flexibilität und präzise Kontrolle über Initiierung, Bereitstellung, Planung und Ressourcenzuordnung zu bieten. Die Laufzeitkosten steigen jedoch, wenn Sie einen virtuellen Computer ausschließlich für Hintergrundaufgaben bereitstellen.

  • Es gibt keine Möglichkeit zum Überwachen der Aufgaben im Portal und keine automatische Neustartfunktion für fehlgeschlagene Aufgaben. Sie können jedoch die Azure Resource Manager-Cmdlets verwenden, um die status des virtuellen Computers zu überwachen und zu verwalten. Es gibt keine Möglichkeiten zum Steuern von Prozessen und Threads in Computeknoten. Wenn Sie einen virtuellen Computer verwenden, müssen Sie in der Regel einen Mechanismus implementieren, der Daten aus der Instrumentierung in der Aufgabe und auch vom Betriebssystem auf dem virtuellen Computer sammelt. Zu diesem Zweck können Sie das System Center Management Pack für Azure verwenden.

  • Erwägen Sie das Erstellen von Überwachungstests, die über HTTP-Endpunkte verfügbar gemacht werden. Sie können den Code für diese Tests konfigurieren, um Integritätsprüfungen durchzuführen und Betriebsinformationen und Statistiken zu sammeln. Sie können die Tests auch verwenden, um Fehlerinformationen zu sortieren und an eine Verwaltungsanwendung zurückzugeben.

Weitere Informationen finden Sie unter

Batch

Betrachten Sie Batch , wenn Sie große, parallele HPC-Workloads (High Performance Computing) auf zehn, hunderten oder Tausenden von virtuellen Computern ausführen müssen.

Verwenden Sie Batch, um die VMs vorzubereiten, den VMs Aufgaben zuzuweisen, die Aufgaben auszuführen, den Fortschritt zu überwachen und die VMs als Reaktion auf die Workload automatisch hochskalieren. Batch bietet auch Auftragsplanung und unterstützt Linux- und Windows-VMs.

Batchüberlegungen

Batch eignet sich für intrinsisch parallele Workloads. Sie können Batch verwenden, um parallele Berechnungen mit einem Reduzierungsschritt am Ende durchzuführen, oder MPI-Anwendungen (Message Passing Interface) für parallele Aufgaben ausführen, die eine Nachrichtenübergabe zwischen Knoten erfordern.

Ein Batch-Auftrag wird auf einem Pool von Knoten oder VMs ausgeführt. Sie können einen Pool nur bei Bedarf zuordnen und nach Abschluss des Auftrags löschen. Dieser Ansatz maximiert die Auslastung, da sich Knoten nicht im Leerlauf befinden, aber der Auftrag muss warten, bis Sie Knoten zuweisen. Alternativ können Sie im Voraus einen Pool erstellen. Dieser Ansatz minimiert die Zeit, die zum Starten eines Auftrags benötigt wird, kann jedoch dazu führen, dass Knoten im Leerlauf sitzen.

Weitere Informationen finden Sie unter

Azure Kubernetes Service

Verwenden Sie AKS, um Ihre gehostete Kubernetes-Umgebung zu verwalten, damit Sie containerisierte Anwendungen problemlos bereitstellen und verwalten können.

Container sind nützlich für die Ausführung von Hintergrundaufträgen. Es ergeben sich beispielsweise folgende Vorteile:

  • Container unterstützen eine hohe Hostingdichte. Sie können eine Hintergrundaufgabe in einem Container isolieren und mehrere Container in jeder VM anordnen.

  • Verwenden Sie den Containeror, um einen internen Lastenausgleich durchzuführen, das interne Netzwerk zu konfigurieren und andere Konfigurationsaufgaben auszuführen.

  • Sie können Container nach Bedarf starten und beenden.

  • Mit Azure Container Registry können Sie Ihre Container innerhalb von Azure-Grenzen registrieren, um Vorteile für Sicherheit, Datenschutz und Näherung zu bieten.

Überlegungen zu AKS

AKS erfordert Kenntnisse zur Verwendung eines Containerorches.

Weitere Informationen finden Sie unter

Container-Apps

Mit Container Apps können Sie serverlose Microservices erstellen, die auf Containern basieren. Container-Apps:

  • Ist für die Ausführung von Universellen Containern optimiert, insbesondere für Anwendungen, die viele Microservices umfassen, die in Containern bereitgestellt werden.

  • Wird von Kubernetes und Open-Source-Technologien wie Dapr, Kubernetes Event-driven Autoscaling (KEDA) und Envoy unterstützt.

  • Unterstützung für Apps im Kubernetes-Stil und Microservices mit Features wie Dienstermittlung und Datenverkehrstrennung

  • Ermöglicht ereignisgesteuerte Anwendungsarchitekturen durch Unterstützung der Skalierung, die auf Datenverkehr und Pulling aus Ereignisquellen wie Warteschlangen basiert, einschließlich Skalierung auf Null.

  • Unterstützt Prozesse mit langer Ausführungsdauer und kann Hintergrundaufgaben ausführen.

Überlegungen zu Container-Apps

Container Apps bietet keinen direkten Zugriff auf die zugrunde liegenden Kubernetes-APIs. Wenn Sie Zugriff auf die Kubernetes-APIs und die Steuerungsebene benötigen, verwenden Sie AKS. Wenn Sie Anwendungen im Kubernetes-Stil erstellen möchten und keinen direkten Zugriff auf die nativen Kubernetes-APIs und die Clusterverwaltung benötigen, verwenden Sie Container Apps für eine vollständig verwaltete Umgebung. Container Apps eignet sich am besten zum Erstellen von Container-Microservices.

Weitere Informationen finden Sie unter

Prüfliste für zuverlässigkeit

Weitere Informationen finden Sie im vollständigen Satz von Empfehlungen.