Empfehlungen für die Entwicklung von Hintergrundaufträgen

Gilt für diese Empfehlung für die Zuverlässigkeitsprüfliste des Azure Well-Architected Framework:

RE:07 Stärken Sie die Widerstandsfähigkeit und Wiederherstellbarkeit Ihrer Workload durch die Implementierung von Selbsterhaltungs- und Selbstheilungsmaßnahmen. Erstellen 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 Lösungskomponentenfehler zu erkennen und automatisch Korrekturmaßnahmen einzuleiten, während die Workload weiterhin vollständig oder reduziert funktioniert.

Verwandte Leitfäden: Vorübergehende Fehler | Selbsterhaltung

In diesem Leitfaden werden die Empfehlungen für die Entwicklung von Hintergrundaufträgen beschrieben. Hintergrundaufträge werden automatisch ausgeführt, ohne dass eine Benutzerinteraktion erforderlich ist. 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 lange ausgeführte Prozesse, z. B. Workflows. Die Anwendung startet den Auftrag und verarbeitet interaktive Anforderungen von Benutzern. Wenn beispielsweise eine Anwendung 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 Vorgang abgeschlossen ist. Als weiteres Beispiel platziert ein Kunde eine Bestellung, die einen Hintergrundworkflow initiiert, der die Bestellung verarbeitet. Der Kunde durchsucht die Web-App weiterhin, 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 Auslastung der Anwendungsbenutzeroberfläche zu minimieren, wodurch die Verfügbarkeit verbessert und die interaktive Reaktionszeit 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, die erfordern, dass der Benutzer oder die Benutzeroberfläche warten muss, während er ausgeführt wird, sind in der Regel keine geeigneten Hintergrundaufträge.

Bewerten der Notwendigkeit 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. das Ausführen einer Reihe von Speichertransaktionen oder Indizierungsdateien.

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

  • Langfristige Workflows, z. B. Auftragserfüllung oder Bereitstellungsdienste und -systeme.

  • Verarbeitung vertraulicher Daten, die die Aufgabe an einen sichereren Ort zur Verarbeitung ü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.

Auswählen der richtigen 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 Timer basiert, ruft den Vorgang auf. Der Auftrag kann auf wiederkehrender Basis 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. einen Kunden, der eine Bestellung aufgegeben hat. Der Hintergrundauftrag überwacht diese Warteschlange und erkennt die Ankunft einer neuen Nachricht. Sie 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 die Hintergrundaufgabe benötigt. 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, Senden von Informationen an Remotedienste, Senden von E-Mail-Nachrichten und Bereitstellen neuer Benutzer in mehrinstanzenbasierten 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 ausgeführt wird, z. B. Azure Logic Apps, 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 plangesteuerten Aufruf geeignet sind, sind Batchverarbeitungsroutinen (z. B. Aktualisieren verwandter Produktlisten für Kunden basierend auf ihrem aktuellen Verhalten), routinemäßige Datenverarbeitungsaufgaben (z. B. Aktualisieren von Indizes oder Generieren von gesammelten Ergebnissen), Datenanalysen für tägliche Berichte, Datenaufbereinigung und Datenkonsistenzprüfungen.

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

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

  • Wenn Vorgänge länger als der Zeitraum zwischen den Terminplanungsereignissen ausgeführt werden, kann der Planer eine andere Instanz des Vorgangs starten, während der vorherige Vorgang ausgeführt wird.

Zurückgeben von Daten an die Workload

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 werden Hintergrundaufträge ausgelöst und vergessen . Der Laufzeitfortschritt wirkt sich nicht auf die Benutzeroberfläche oder den aufrufenden Prozess aus. Dies bedeutet, dass der Aufrufvorgang nicht auf den Abschluss der Aufgaben wartet. Die Benutzeroberfläche und der aufrufende Prozess können beim Beenden der Aufgabe nicht erkennen.

Wenn Sie eine Hintergrundaufgabe benötigen, um mit der aufrufenden Aufgabe zu kommunizieren, um den Fortschritt oder den Abschluss anzugeben, müssen Sie einen Mechanismus implementieren. Einige Beispiele sind:

  • Schreiben Sie einen Statusindikatorwert in den Speicher, der für die Benutzeroberfläche oder die Aufruferaufgabe zugänglich ist, die diesen Wert überwachen oder überprüfen kann. Andere Daten, die die Hintergrundaufgabe an den Aufrufer zurückgibt, können im selben Speicher platziert werden.

  • Richten Sie eine Antwortwarteschlange ein, die von der Benutzeroberfläche oder dem Anrufer überwacht wird. Die Hintergrundaufgabe kann Nachrichten an die Warteschlange senden, die den Status angeben. Daten, die von der Hintergrundaufgabe an den Aufrufer zurückgegeben werden, können in die Nachrichten eingefügt werden. Verwenden Sie für Azure Service Bus die ReplyTo Funktionen und CorrelationId Eigenschaften, 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 zurück auf die Benutzeroberfläche oder den Aufrufer zurückruft, um den 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.

Partitionshintergrundaufträge

Wenn Sie Hintergrundaufträge in eine vorhandene Computeinstanz einschließen, sollten Sie berücksichtigen, wie sich diese Änderungen auf die Qualitätsattribute der Computeinstanz und des Hintergrundauftrags auswirken. Berücksichtigen Sie diese Faktoren, um zu entscheiden, ob die Aufgaben mit der vorhandenen Computeinstanz zusammengeführt oder in eine andere Computeinstanz 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 direkt eine Benutzerinteraktion umfassen. Hintergrundaufgaben können eine höhere Toleranz für Latenz, wiederholungsversuchige Verbindungsfehler und andere Faktoren aufweisen, die sich auf die Verfügbarkeit auswirken, da die Vorgänge in die Warteschlange gestellt 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 unterschiedliche Skalierbarkeitsanforderungen im Vergleich zur Benutzeroberfläche und den interaktiven Teilen der Anwendung. Möglicherweise müssen Sie die Benutzeroberfläche skalieren, um Spitzen bei Bedarf zu erfüllen. Ausstehende Hintergrundaufgaben können während weniger Beschäftigt-Zeiten und mit weniger Computeinstanzen ausgeführt werden.

  • Resilienz: Wenn eine Computeinstanz, die nur Hintergrundaufgaben hostt, fehlschlägt, wirkt sich dies möglicherweise nicht schwerwiegend auf die gesamte Anwendung aus. Die Anforderungen für diese Aufgaben können in die Warteschlange gestellt oder verschoben werden, bis die Aufgabe verfügbar ist. Wenn die Computeinstanz oder -aufgaben innerhalb eines entsprechenden Intervalls neu gestartet werden können, wirkt sich dies möglicherweise nicht auf die Anwendungsbenutzer aus.

  • Sicherheit: Hintergrundaufgaben weisen möglicherweise unterschiedliche Sicherheitsanforderungen oder Einschränkungen im Vergleich zur Benutzeroberfläche oder anderen Teilen der Anwendung auf. Verwenden Sie eine separate Computeinstanz, 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 Hintergrundberechnungsinstanzen von der Benutzeroberfläche zu isolieren.

  • Leistung: Wählen Sie den Typ der Computeinstanz für Hintergrundaufgaben aus, die speziell den Leistungsanforderungen der Aufgabe entsprechen. Sie können eine kostengünstigere Berechnungsoption verwenden, wenn die Aufgaben nicht die gleichen Verarbeitungsfunktionen wie die Benutzeroberfläche benötigen. Oder Sie können eine größere Instanz verwenden, wenn die Vorgänge mehr Kapazität und Ressourcen benötigen.

  • Verwaltbarkeit: Hintergrundaufgaben können im Vergleich zum Hauptanwendungscode oder der Benutzeroberfläche einen anderen Entwicklungs- und Bereitstellungsrhythmus aufweisen. Um Updates und Versionsverwaltung zu vereinfachen, stellen Sie Hintergrundaufgaben in einer separaten Computeinstanz bereit.

  • Kosten: Wenn Sie Computeinstanzen zum Ausführen von Hintergrundaufgaben hinzufügen, erhöhen sich die Hostingkosten. Berücksichtigen Sie sorgfältig den Kompromiss zwischen mehr Kapazität und zusätzlichen Kosten.

Weitere Informationen finden Sie unter "Wahlmuster für Leader" und "Konkurrierende Verbraucher".

Ressourcenkonflikt verhindern

Wenn Sie über mehrere Instanzen eines Hintergrundauftrags verfügen, können sie für den Zugriff auf Ressourcen und Dienste wie Datenbanken und Speicher konkurrieren. Dieser gleichzeitige Zugriff kann zu Ressourcenkonflikten führen, was zu Dienstverfügbarkeitskonflikten führen kann, und die Integrität der daten, die sich im Speicher befinden. Lösen Sie die Ressourcenverknügung mithilfe eines pessimistischen Sperransatzes auf. Dieser Ansatz verhindert, dass konkurrierende Instanzen einer Aufgabe gleichzeitig auf einen Dienst zugreifen oder Daten beschädigt werden.

Ein weiterer Ansatz zum Lösen von Konflikten besteht darin, Hintergrundaufgaben als Singleton zu definieren, sodass nur eine Instanz ausgeführt wird. Dieser Ansatz beseitigt jedoch die Zuverlässigkeits- und Leistungsvorteile, die eine Konfiguration mit mehreren Instanzen 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 ausreichende Kapazität verfügt, um Spitzen bei Bedarf zu bewältigen. Weisen Sie eine Computeinstanz mit ausreichenden Ressourcen zu, implementieren Sie einen Warteschlangenmechanismus, der Anforderungen speichert, die ausgeführt werden sollen, wenn die Nachfrage verringert wird, oder verwenden Sie eine Kombination dieser Techniken.

Mehrere Aufgaben koordinieren

Hintergrundaufgaben können komplex sein und erfordern, dass mehrere Aufgaben ausgeführt werden. In diesen Szenarien ist es üblich, die Aufgabe in kleinere diskrete Schritte oder Teilvorgänge aufzuteilen, die mehrere Consumer ausführen können. Multistep-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 gängige Muster, um Ihre Lösung zu leiten:

  • Dekompilieren Sie eine Aufgabe in mehrere wiederverwendbare Schritte. Eine Anwendung kann erforderlich sein, um verschiedene Aufgaben unterschiedlicher Komplexität für die von ihr verarbeiteten Informationen auszuführen. Ein einfacher, aber unflexibler Ansatz bei der Implementierung einer solchen Anwendung besteht darin, diese Verarbeitung als monolithisches Modul durchzuführen. Dieser Ansatz wird jedoch wahrscheinlich die Möglichkeiten für die Umgestaltung des Codes verringern, ihn optimieren oder wiederverwenden, 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 koordiniert, die die Aufgabe implementiert. Weitere Informationen finden Sie unter Muster „Scheduler-Agent-Supervisor“.

  • Verwalten Sie die Wiederherstellung für Aufgabenschritte, die fehlschlagen. Wenn mindestens eine der Schritte fehlschlägt, muss eine Anwendung möglicherweise die Von einer Reihe von Schritten ausgeführte Arbeit rückgängig machen, die gemeinsam einen letztendlich konsistenten Vorgang definiert. Weitere Informationen finden Sie unter Kompensationstransaktionsmuster.

Widerstandsfähigmachen von Aufträgen

Erstellen Sie robuste 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äß verarbeiten, ohne Daten zu beschädigen oder Inkonsistenzen in der Anwendung zu verursachen. Bei lang andauernden oder mehrstufigen Aufgaben sollten Sie Prüfpunkte verwenden. Verwenden Sie Prüfpunkte, um den Status von Aufträgen im beständigen Speicher oder als Nachrichten in einer Warteschlange zu speichern. Sie können beispielsweise Statusinformationen in einer Nachricht speichern, die sich in einer Warteschlange befindet, und diese Statusinformationen inkrementell mit dem Vorgangsfortschritt aktualisieren. Die Aufgabe kann vom letzten bekannten Prüfpunkt verarbeitet werden, anstatt von Anfang an neu zu starten.

    Verwenden Sie für Service Bus-Warteschlangen Nachrichtensitzungen für diesen Zweck. Mit Nachrichtensitzungen können Sie den Anwendungsverarbeitungsstatus mithilfe der Methoden SetState und GetState speichern und abrufen. 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 während weniger beschäftigter Zeiträume 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 "Priority Queue" 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 verarbeiten, z. B. Nachrichten, die aus der Reihenfolge kommen, Nachrichten, die wiederholt einen Fehler verursachen (Giftnachrichten) und Nachrichten, die mehrmals ü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. einen Wert zu einem vorhandenen Wert hinzufügen. Nachrichten kommen nicht immer in der Reihenfolge an, in der sie gesendet wurden. Außerdem können unterschiedliche Instanzen einer Hintergrundaufgabe Meldungen in einer anderen Reihenfolge verarbeiten, da die einzelnen Instanzen unterschiedlich geladen werden.

    Fügen Sie für Nachrichten, die in einer bestimmten Reihenfolge verarbeitet werden müssen, eine Sequenznummer, einen Schlüssel oder einen anderen Indikator hinzu, mit dem Hintergrundaufgaben Nachrichten in der richtigen Reihenfolge verarbeiten können. Verwenden Sie für Service Bus Nachrichtensitzungen, um die richtige Lieferreihenfolge 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 eine Hintergrundaufgabe in Nachrichten in der Warteschlange angezeigt, wodurch sie vorübergehend von anderen Nachrichtenkonsumenten ausgeblendet werden. Nachdem die Aufgabe die Nachricht erfolgreich verarbeitet hat, wird die Nachricht gelöscht. Wenn eine Hintergrundaufgabe fehlschlägt, wenn eine Nachricht verarbeitet wird, wird diese Nachricht nach Ablauf des Vorschautimeouts wieder in der Warteschlange angezeigt. Eine andere Instanz der Aufgabe verarbeitet die Nachricht, oder der nächste Verarbeitungszyklus der ursprünglichen Instanz verarbeitet die Nachricht.

    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 wird. Es ist wichtig, Giftnachrichten aus der Warteschlange zu erkennen und zu entfernen. Wenn Sie Service Bus verwenden, werden Giftnachrichten automatisch oder manuell in eine zugeordnete Warteschleife mit toten Buchstaben verschoben.

  • Warteschlangen sind mindestens einmal Übermittlungsmechanismen, aber sie können dieselbe Nachricht mehrmals übermitteln. Wenn eine Hintergrundaufgabe nach dem Verarbeiten einer Nachricht fehlschlägt, aber bevor sie sie aus der Warteschlange löscht, steht die Nachricht erneut zur Verarbeitung zur Verfügung.

    Hintergrundaufgaben sollten idempotent sein, was bedeutet, dass die Aufgabe, wenn die Aufgabe dieselbe Nachricht mehrmals verarbeitet, keinen Fehler oder inkonsistent in den Daten der Anwendung verursacht. Einige Vorgänge sind natürlich idempotent, z. B. wenn ein gespeicherter Wert auf einen bestimmten neuen Wert festgelegt ist. Einige Vorgänge verursachen jedoch Inkonsistenzen, z. B. wenn einem vorhandenen gespeicherten Wert ein Wert hinzugefügt wird, ohne zu überprüfen, ob der gespeicherte Wert immer noch identisch ist wie beim ursprünglichen Senden der Nachricht. Konfigurieren Sie Service bus-Warteschlangen, um duplizierte Nachrichten automatisch zu entfernen. Weitere Informationen finden Sie unter Idempotent-Nachrichtenverarbeitung.

  • Einige Messagingsysteme, z. B. Azure Storage-Warteschlangen und ServiceBus-Warteschlangen, unterstützen eine Dequeue count-Eigenschaft, die angibt, wie oft eine Nachricht aus der Warteschlange gelesen wird. Diese Daten sind nützlich, um wiederholte Nachrichten und Giftnachrichten zu behandeln. Weitere Informationen finden Sie unter "Asynchrone Nachrichten primer " und "Idempotency"-Muster.

Skalieren von Aufträgen

Hintergrundaufgaben müssen eine ausreichende Leistung bieten, um sicherzustellen, dass sie den Anwendungs- oder Verzögerungsvorgang nicht aufhalten, wenn das System geladen wird. In der Regel wird die Leistung verbessert, 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:

  • Virtuelle Azure-Computer und das Web-Apps-Feature von Azure-App Dienst können Bereitstellungen hosten. Sie unterstützen die automatische Skalierung, sowohl die Skalierung als auch die 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 und gleichzeitig die Laufzeitkosten minimiert.

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

  • Um den Verlust der Leistung beim Laden zu verhindern, müssen Sie möglicherweise auch Speicherwarteschlangen und andere Ressourcen skalieren, sodass 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. Hintergrundaufgaben müssen z. B. die Anzahl der verwendeten Speicherwarteschlangen dynamisch erkennen, um Nachrichten zu überwachen oder Nachrichten an die entsprechende Warteschlange zu senden.

  • Standardmäßig wird ein WebJob mit der zugeordneten Web-Apps Instanz skaliert. Wenn ein WebJob jedoch nur als einzelne Instanz 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 Instanz des WebJob 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 Instanz ausgeführt werden müssen.

  • Hintergrundaufträge können Herausforderungen für die Datensynchronisierung und Prozesskoordination schaffen, insbesondere, wenn die Hintergrundaufgaben voneinander oder von anderen Datenquellen abhängen. Hintergrundaufträge können beispielsweise Datenkonsistenzprobleme, Racebedingungen, Deadlocks oder Timeouts behandeln.

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

Tradeoff: Hintergrundaufträge führen mehr Komponenten und Abhängigkeiten zum System ein, wodurch die Komplexität und Wartungskosten der Lösung erhöht werden können. Hintergrundaufträge erfordern z. B. einen separaten Warteschlangendienst, einen Workerdienst, einen Überwachungsdienst und einen Wiederholungsmechanismus.

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:

In den folgenden Abschnitten finden Sie Überlegungen für jede dieser Optionen, damit Sie die beste Option für Sie auswählen können.

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 fortlaufender Prozess im Kontext Ihrer Web-App ausgeführt. Ein WebJob kann auch als Reaktion auf ein Triggerereignis aus Logik-Apps oder externen Faktoren ausgeführt werden, z. B. Änderungen an Speicherblobs oder Nachrichtenwarteschlangen. 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 die fortlaufende Ausführung. Das Skript oder Programm wird im Ordner gespeichert, der den Namen "site/wwwroot/app_data/jobs/continuous" hat.

  • Wenn der Auftrag auf einen zeitplangesteuerten Trigger reagieren soll, konfigurieren Sie ihn so, dass er für einen 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 die Option "Ausführen bei einem Zeitplan " ausgeführt.

Ein WebJob wird im Sandkasten der Web-App ausgeführt. Sie hat Zugriff auf Umgebungsvariablen und kann Informationen wie Verbindungszeichenfolge s mit der Web-App teilen. Der WebJob hat Zugriff auf den eindeutigen Bezeichner des Computers, auf dem webJob ausgeführt wird. Der benannte AzureWebJobsStorage Verbindungszeichenfolge bietet Zugriff auf Speicherwarteschlangen, Blobs und Tabellen für Anwendungsdaten. Es bietet auch Zugriff auf Service Bus für Messaging und Kommunikation. Der benannte AzureWebJobsDashboard Verbindungszeichenfolge bietet Zugriff auf die WebJob-Aktionsprotokolldateien.

WebJobs weisen die folgenden Merkmale auf:

  • Sicherheit: Die Bereitstellungsanmeldeinformationen der Web-App bieten Schutz für WebJobs.

  • Unterstützte Dateitypen: Definieren von 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 der 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 kontinuierliche Bereitstellung: site/wwwroot/app_data/jobs/continuous/<job name>

  • Protokolldateien: Console.Out werden behandelt oder als markiert als INFO. Console.Error wird behandelt als ERROR. Verwenden Sie das Portal, um auf Überwachungs- und Diagnoseinformationen 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/<job name>

    • Für eine kontinuierliche Bereitstellung: Vfs/data/jobs/continuous/<job name>

  • Konfiguration: Konfigurieren von WebJobs mithilfe des Portals, der REST-API und PowerShell. Verwenden Sie eine Konfigurationsdatei namens settings.job, die sich im gleichen Stammverzeichnis wie das WebJob-Skript befindet, um Konfigurationsinformationen für einen WebJob bereitzustellen. Zum 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 einer einzelnen Instanz zu konfigurieren, legen Sie die is_singleton Konfigurationseigenschaft auf true. WebJobs für einzelne Instanzen sind nützlich für Aufgaben, die Sie nicht als gleichzeitige Mehrere Instanzen skalieren oder ausführen möchten, z. B. erneute Indizierung oder Datenanalyse.

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

Azure-Funktionen

Azure-Funktionen ähneln 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, lange ausgeführte Aufgaben 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-Funktionen

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 genutzte virtuelle Computer verfügen, können Sie den dedizierten Plan auf demselben virtuellen Computer ausführen und Berechnungskosten gemeinsam nutzen.

Weitere Informationen finden Sie unter:

Virtual Machines

Sie können Hintergrundaufgaben implementieren, sodass sie nicht für 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, in der die Anwendung gehostet wird. Sie können z. B. 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 einen virtuellen Azure-Computer 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 in einem separaten virtuellen Computer zu initiieren, können Sie:

  • Senden Sie eine Anforderung an einen Endpunkt, den die Aufgabe verfügbar macht, um die Aufgabe bei Bedarf direkt von Ihrer Anwendung auszuführen. Die Anforderung überträgt Daten, die die Aufgabe benötigt. Der Endpunkt ruft die Aufgabe auf.

  • Verwenden Sie einen Scheduler oder Timer aus Ihrem ausgewählten Betriebssystem, um die Aufgabe so zu konfigurieren, dass sie in einem Zeitplan ausgeführt wird. Unter Windows können Sie z. B. windows Task Scheduler verwenden, um Skripts und Aufgaben auszuführen. Wenn Sql Server auf dem virtuellen Computer installiert ist, verwenden Sie SQL Server-Agent, um Skripts und Aufgaben auszuführen.

  • Verwenden Sie Logic Apps, um die Aufgabe zu initiieren, indem Sie einer Warteschlange, die die Aufgabe überwacht, oder indem Sie eine Anforderung an eine API senden, die die Aufgabe verfügbar macht.

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

Überlegungen zu virtuellen Computern

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

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

  • Es gibt keine Möglichkeit, die Aufgaben im Portal zu überwachen und keine automatisierte Neustartfunktion für fehlgeschlagene Aufgaben. Sie können jedoch die Azure Resource Manager-Cmdlets verwenden, um den Status der VM 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 in der VM sammelt. Sie können das System Center Management Pack für Azure zu diesem Zweck verwenden.

  • Erwägen Sie das Erstellen von Überwachungssonden, die über HTTP-Endpunkte verfügbar gemacht werden. Sie können den Code für diese Prüfpunkte so konfigurieren, dass Integritätsprüfungen durchgeführt und Betriebsinformationen und Statistiken gesammelt werden. Sie können die Prüfpunkte auch verwenden, um Fehlerinformationen zu sammeln und an eine Verwaltungsanwendung zurückzugeben.

Weitere Informationen finden Sie unter:

Batch

Berücksichtigen Sie Batch , wenn Sie große, parallele HPC-Workloads (High-Performance Computing) über zehn, Hunderte oder Tausende von VMs ausführen müssen.

Verwenden Sie Batch, um die virtuellen Computer vorzubereiten, den virtuellen Computern Aufgaben zuzuweisen, die Aufgaben auszuführen, den Fortschritt zu überwachen und die virtuellen Computer automatisch als Reaktion auf die Workload zu skalieren. Batch stellt auch die Auftragsplanung bereit und unterstützt Linux- und Windows-VMs.

Überlegungen zur Batchverarbeitung

Batch eignet sich für systemintern parallele Workloads. Sie können Batch verwenden, um parallele Berechnungen mit einem reduzierten Schritt am Ende durchzuführen, oder Sie können Mpi-Anwendungen (Message Passing Interface) für parallele Aufgaben ausführen, für die das Übergeben von Nachrichten zwischen Knoten erforderlich ist.

Ein Batchauftrag wird auf einem Pool von Knoten oder virtuellen Computern ausgeführt. Sie können einen Pool nur bei Bedarf zuordnen und nach Abschluss des Auftrags löschen. Dieser Ansatz maximiert die Auslastung, da Knoten nicht im Leerlauf sind, aber der Auftrag muss warten, bis Sie Knoten zuordnen. Alternativ können Sie im Voraus einen Pool erstellen. Dieser Ansatz minimiert die Zeit, die ein Auftrag zum Starten benötigt, kann aber zu Knoten führen, die sich im Leerlauf befinden.

Weitere Informationen finden Sie unter:

Azure Kubernetes Service

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

Container sind nützlich für das Ausführen 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 Container-Orchestrator, 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 Sicherheits-, Datenschutz- und Näherungsvorteile bereitzustellen.

Aspekte von AKS

AKS erfordert ein Verständnis für die Verwendung eines Container-Orchestrators.

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 allgemeiner Container 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 Autocaling (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, indem die Skalierung unterstützt wird, die auf Datenverkehr basiert und aus Ereignisquellen wie Warteschlangen abgerufen wird, einschließlich Skalierung auf Null.

  • Unterstützt lange ausgeführte Prozesse und kann Hintergrundaufgaben ausführen.

Überlegungen zu Container-Apps

Container-Apps bieten 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 Kubernetes-Anwendungen erstellen möchten und keinen direkten Zugriff auf die systemeigenen Kubernetes-APIs und die Clusterverwaltung benötigen, verwenden Sie Container-Apps für eine vollständig verwaltete Oberfläche. Container-Apps eignen sich am besten zum Erstellen von Container-Microservices.

Weitere Informationen finden Sie unter:

Zuverlässigkeitsprüfliste

Lesen Sie den vollständigen Satz von Empfehlungen.