Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Viele Arten von Anwendungen erfordern Hintergrundaufgaben, die unabhängig von der Benutzeroberfläche ausgeführt werden. Beispiele hierfür sind Batchaufträge, intensive Verarbeitungsaufgaben und lange ausgeführte Prozesse wie Workflows. Hintergrundaufträge können ausgeführt werden, ohne dass eine Benutzerinteraktion erforderlich ist– die Anwendung kann den Auftrag starten und dann weiterhin interaktive Anforderungen von Benutzern verarbeiten. Dies kann dazu beitragen, die Auslastung der Anwendungs-UI zu minimieren, wodurch die Verfügbarkeit verbessert und interaktive Reaktionszeiten reduziert werden können.
Wenn beispielsweise eine Anwendung Miniaturansichten von Bildern generieren muss, die von Benutzern hochgeladen werden, kann dies als Hintergrundauftrag ausgeführt und die Miniaturansicht nach Abschluss des Vorgangs im Speicher gespeichert werden, ohne dass der Benutzer warten muss, bis der Vorgang abgeschlossen ist. Auf die gleiche Weise kann ein Benutzer, der eine Bestellung aufgibt, einen Hintergrund-Workflow zur Verarbeitung der Bestellung initiieren, während die Benutzeroberfläche zulässt, dass der Benutzer die Web-App weiterhin durchsucht. Wenn der Hintergrundauftrag abgeschlossen ist, kann er die gespeicherten Auftragsdaten aktualisieren und dem Benutzer eine E-Mail senden, die die Bestellung bestätigt.
Wenn Sie überlegen, ob eine Aufgabe als Hintergrundauftrag implementiert werden soll, besteht die Hauptkriterien darin, ob die Aufgabe ohne Benutzerinteraktion ausgeführt werden kann, und ohne dass die Benutzeroberfläche warten muss, bis der Auftrag abgeschlossen ist. Aufgaben, für die der Benutzer oder die Benutzeroberfläche warten muss, während sie abgeschlossen sind, sind möglicherweise nicht als Hintergrundaufträge geeignet.
Arten von Hintergrundaufträgen
Hintergrundaufträge umfassen in der Regel einen oder mehrere der folgenden Arten von Aufträgen:
- CPU-intensive Aufträge, z. B. mathematische Berechnungen oder Strukturmodellanalyse.
- E/A-intensive Aufträge, z. B. die Ausführung einer Reihe von Speichertransaktionen oder die Indizierung von Dateien.
- Batchaufträge, beispielsweise nächtliche Datenaktualisierungen oder geplante Verarbeitungen.
- Langfristige Workflows, z. B. Auftragserfüllung oder Bereitstellungsdienste und -systeme.
- Verarbeitung vertraulicher Daten, bei denen die Aufgabe an einen sichereren Ort zur Verarbeitung übergeben wird. Beispielsweise möchten Sie möglicherweise keine vertraulichen Daten in einer Web-App verarbeiten. Stattdessen können Sie ein Muster wie das Gatekeeper-Muster verwenden, um die Daten an einen isolierten Hintergrundprozess zu übertragen, der Zugriff auf geschützten Speicher hat.
Auslöser
Hintergrundaufträge können auf verschiedene Arten initiiert werden. Sie fallen in eine der folgenden Kategorien:
- Ereignisgesteuerte Trigger. Die Aufgabe wird als Reaktion auf ein Ereignis gestartet, in der Regel eine Aktion, die von einem Benutzer oder einem Schritt in einem Workflow ausgeführt wird.
- Zeitplangesteuerte Trigger. Die Aufgabe wird nach einem Zeitplan basierend auf einem Timer aufgerufen. Dies kann ein wiederkehrender Zeitplan oder ein einmaliger Aufruf sein, der zu einem späteren Zeitpunkt angegeben wird.
Ereignisgesteuerte Auslöser
Der ereignisgesteuerte Aufruf verwendet einen Trigger, um die Hintergrundaufgabe zu starten. Beispiele für die Verwendung von ereignisgesteuerten Triggern sind:
- Die Benutzeroberfläche oder ein anderer Auftrag platziert eine Nachricht in einer Warteschlange. Die Nachricht enthält Daten zu einer Aktion, die ausgeführt wurde, z. B. der Benutzer, der eine Bestellung abgibt. Die Hintergrundaufgabe überwacht diese Warteschlange und erkennt die Ankunft einer neuen Nachricht. Sie liest die Nachricht und verwendet die darin angezeigten Daten 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 im Speicher. Die Hintergrundaufgabe ü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. Sie übergibt die Daten, die zum Abschließen der Hintergrundaufgabe als Teil der Anforderung erforderlich sind. Der Endpunkt oder Webdienst ruft die Hintergrundaufgabe auf, die die Daten als Eingabe verwendet.
Typische 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 Auslöser
Der plangesteuerte Aufruf verwendet einen Timer, um die Hintergrundaufgabe zu starten. Beispiele für die Verwendung von zeitplangesteuerten Triggern sind:
- Ein Zeitgeber, der lokal innerhalb der Anwendung oder als Teil des Betriebssystems der Anwendung ausgeführt wird, ruft eine Hintergrundaufgabe regelmäßig auf.
- Ein Zeitgeber, 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 bewirkt, dass die Hintergrundaufgabe nach einer bestimmten Zeitverzögerung oder zu einem bestimmten Zeitpunkt aufgerufen wird.
Typische Beispiele für Aufgaben, die für den plangesteuerten Aufruf geeignet sind, umfassen Batchverarbeitungsroutinen (z. B. Aktualisieren von Listen mit verwandten Produkten für Benutzer basierend auf ihrem aktuellen Verhalten), routinebasierte 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, beachten Sie Folgendes:
- Wenn die Computeinstanz, die für die Ausführung des Schedulers zuständig ist (z. B. eine virtuelle Maschine mit geplanten Windows-Aufgaben), skaliert wird, werden mehrere Instanzen des Schedulers gleichzeitig ausgeführt. Diese können mehrere Instanzen des Vorgangs starten. Weitere Informationen hierzu finden Sie in diesem Blogbeitrag zu idempotenz.
- Wenn Vorgänge länger als der Zeitraum zwischen Terminplanungsereignissen ausgeführt werden, kann der Planer eine andere Instanz des Vorgangs starten, während die vorherige ausgeführt wird.
Ergebnisse zurückgeben
Hintergrundaufträge werden asynchron in einem separaten Prozess oder sogar getrennt von der Benutzeroberfläche oder dem Prozess ausgeführt, der die Hintergrundaufgabe aufgerufen hat. Im Idealfall sind Hintergrundaufgaben vom Typ "ausführen und vergessen", und deren Ausführungsfortschritt hat keine Auswirkungen auf die Benutzeroberfläche (UI) oder den aufrufenden Prozess. Dies bedeutet, dass der aufrufende Prozess nicht auf den Abschluss der Aufgaben wartet. Daher kann sie nicht automatisch erkennen, wann die Aufgabe endet.
Wenn Sie eine Hintergrundaufgabe benötigen, um mit der aufrufenden Aufgabe zu kommunizieren, um den Fortschritt oder abschluss anzugeben, müssen Sie hierfür einen Mechanismus implementieren. Einige Beispiele sind:
- Schreiben Sie einen Statusindikatorwert in den Speicher, der für die UI- oder Aufruferaufgabe zugänglich ist, die diesen Wert bei Bedarf überwachen oder überprüfen kann. Andere Daten, die die Hintergrundaufgabe an den Aufrufer zurückgeben muss, können in denselben Speicher versetzt werden.
- Richten Sie eine Antwortwarteschlange ein, die von der Benutzeroberfläche oder dem Aufrufer überwacht werden kann. Die Hintergrundaufgabe kann Nachrichten an die Warteschlange senden, die den Status und den Abschluss angeben. Daten, die die Hintergrundaufgabe an den Aufrufer zurückgeben muss, können in die Nachrichten eingefügt werden. Wenn Sie Azure Service Bus verwenden, können Sie die ReplyTo - und CorrelationId-Eigenschaften verwenden, um diese Funktion zu implementieren.
- Stellen Sie eine API oder Endpunkt aus der Hintergrundaufgabe bereit, auf die die Benutzeroberfläche oder der Anrufer zugreifen kann, um Statusinformationen abzurufen. Daten, die die Hintergrundaufgabe an den Aufrufer zurückgeben muss, können in die Antwort einbezogen werden.
- Rufen Sie die Hintergrundaufgabe über eine API zur Benutzeroberfläche oder zum Aufrufer zurück, um den Status an vordefinierten Punkten oder nach Abschluss anzugeben. Dies kann durch Ereignisse erfolgen, die lokal oder über einen Publish-and-Subscribe-Mechanismus ausgelöst werden. Daten, die die Hintergrundaufgabe an den Aufrufer zurückgeben muss, können in die Anforderungs- oder Ereignisnutzlast einbezogen werden.
Hostingumgebung
Sie können Hintergrundaufgaben mithilfe einer Reihe verschiedener Azure-Plattformdienste hosten:
- Azure Web Apps und WebJobs. Sie können WebJobs verwenden, um benutzerdefinierte Aufträge basierend auf einer Reihe verschiedener Typen von Skripts oder ausführbaren Programmen im Kontext einer Web-App auszuführen.
- Azure-Funktionen. Sie können Funktionen für Hintergrundaufträge verwenden, die nicht lange ausgeführt werden. Ein weiterer Anwendungsfall ist, wenn Ihre Workload bereits im App Service-Plan gehostet wird und nicht ausgelastet ist.
- Virtuelle Azure-Computer. Wenn Sie über einen Windows-Dienst verfügen oder den Windows-Aufgabenplaner verwenden möchten, ist es üblich, Ihre Hintergrundaufgaben auf einem dedizierten virtuellen Computer zu hosten.
- Azure Batch. Batch ist ein Plattformdienst, der rechenintensive Arbeit für die Ausführung auf einer verwalteten Sammlung virtueller Computer plant. Die Berechnungsressourcen können automatisch skaliert werden.
- Azure Kubernetes Service (AKS). Azure Kubernetes Service bietet eine verwaltete Hostingumgebung für Kubernetes in Azure.
- Azure-Container-Apps. Mit Azure Container Apps können Sie serverlose Microservices basierend auf Containern erstellen.
In den folgenden Abschnitten werden diese Optionen ausführlicher beschrieben, und sie enthalten Überlegungen, die Ihnen bei der Auswahl der geeigneten Option helfen.
Azure Web Apps und WebJobs
Sie können Azure WebJobs verwenden, um benutzerdefinierte Aufträge als Hintergrundaufgaben in einer Azure Web App auszuführen. WebJobs werden im Kontext Ihrer Web-App als fortlaufender Prozess ausgeführt. WebJobs werden auch als Reaktion auf ein Triggerereignis von Azure Logic Apps oder externen Faktoren ausgeführt, z. B. Änderungen an Speicherblobs und Nachrichtenwarteschlangen. Jobs können bei Bedarf gestartet, gestoppt und ordnungsgemäß heruntergefahren werden. Wenn ein fortlaufend ausgeführter WebJob fehlschlägt, wird er automatisch neu gestartet. Wiederholungs- und Fehleraktionen können konfiguriert werden.
Wenn Sie einen WebJob konfigurieren:
- Wenn der Auftrag auf einen ereignisgesteuerten Trigger reagieren soll, sollten Sie ihn als fortlaufend ausführen konfigurieren. Das Skript oder Programm wird im Ordner "site/wwwroot/app_data/jobs/continuous" gespeichert.
- Wenn der Auftrag auf einen zeitplangesteuerten Trigger reagieren soll, sollten Sie ihn als Nach einem Zeitplan ausführen konfigurieren. 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 der gleiche Code wie die Option "Bei Zeitplan ausführen" ausgeführt, wenn Sie ihn starten.
Azure WebJobs werden im Sandkasten der Web-App ausgeführt. Dies bedeutet, dass sie auf Umgebungsvariablen zugreifen und Informationen freigeben können, z. B. Verbindungszeichenfolgen, mit der Web-App. Der Auftrag hat Zugriff auf den eindeutigen Bezeichner des Computers, auf dem der Auftrag ausgeführt wird. Die Verbindungszeichenfolge namens AzureWebJobsStorage bietet Zugriff auf Azure Storage-Warteschlangen, Blobs und Tabellen für Anwendungsdaten und den Zugriff auf Service Bus für Messaging und Kommunikation. Die Verbindungszeichenfolge mit dem Namen AzureWebJobsDashboard bietet Zugriff auf die Auftragsaktionsprotokolldateien.
Azure WebJobs weisen die folgenden Merkmale auf:
- Sicherheit: WebJobs werden durch die Bereitstellungsanmeldeinformationen der Web-App geschützt.
-
Unterstützte Dateitypen: Sie können WebJobs mithilfe von Befehlsskripts (
.cmd
), Batchdateien (.bat
), PowerShell-Skripts (.ps1
), Bash-Shell-Skripts (), PHP-Skripts (.sh
), Python-Skripts (.php
.py
), JavaScript-Code (.js
) und ausführbaren Programmen (.exe
,.jar
und mehr) definieren. -
Bereitstellung: Sie können Skripts und ausführbare Dateien mithilfe des Azure-Portals mithilfe von Visual Studio, mithilfe des Azure WebJobs SDK oder durch direktes Kopieren an die folgenden Speicherorte bereitstellen:
- Für die durch Trigger initiierte Ausführung: site/wwwroot/app_data/jobs/triggered/{Auftragsname}
- Zur kontinuierlichen Ausführung: site/wwwroot/app_data/jobs/continuous/{job name}
-
Protokollierung: Console.Out wird als INFO behandelt (markiert). Console.Error wird als FEHLER behandelt. Sie können über das Azure-Portal auf Überwachungs- und Diagnoseinformationen zugreifen. Sie können Protokolldateien direkt von der Website herunterladen. Sie werden an den folgenden Speicherorten gespeichert:
- Für die ausgelöste Ausführung: Vfs/data/jobs/triggered/jobName
- Für kontinuierliche Ausführung: Vfs/data/jobs/continuous/jobName
-
Konfiguration: Sie können WebJobs mithilfe des Portals, der REST-API und PowerShell konfigurieren. Sie können eine Konfigurationsdatei namens settings.job im selben Stammverzeichnis wie das Auftragsskript verwenden, um Konfigurationsinformationen für einen Auftrag bereitzustellen. Beispiel:
- { "Stoppswartezeit": 60 }
- { "is_singleton": wahr }
Überlegungen
- Standardmäßig skalieren WebJobs mit der Web-App. Sie können jedoch Aufträge konfigurieren, die auf einer einzelnen Instanz ausgeführt werden sollen, indem Sie die is_singleton Konfigurationseigenschaft auf "true" festlegen. WebJobs mit einer einzelnen Instanz sind nützlich für Aufgaben, die Sie nicht als gleichzeitige mehrere Instanzen skalieren oder ausführen möchten, z. B. erneute Indizierung, Datenanalyse und ähnliche Aufgaben.
- Um die Auswirkungen von Aufträgen auf die Leistung der Web-App zu minimieren, sollten Sie eine leere Azure Web App-Instanz in einem neuen App Service-Plan erstellen, um lange ausgeführte oder ressourcenintensive WebJobs zu hosten.
Azure-Funktionen
Eine Option, die WebJobs ähnelt, ist Azure Functions. Dieser Dienst ist serverlos, der für ereignisgesteuerte Trigger geeignet ist, die für einen kurzen Zeitraum ausgeführt werden. Eine Funktion kann auch verwendet werden, um geplante Aufträge über Timertrigger auszuführen, wenn sie für die Ausführung zu festgelegten Zeiten konfiguriert sind.
Azure Functions ist keine empfohlene Option für große, lange ausgeführte Aufgaben, da sie unerwartete Timeoutprobleme verursachen können. Je nach Hostingplan können sie jedoch für zeitplangesteuerte Trigger berücksichtigt werden.
Überlegungen
Wenn die Hintergrundaufgabe als Reaktion auf ein Ereignis für eine kurze Dauer ausgeführt werden soll, sollten Sie die Aufgabe in einem Verbrauchsplan ausführen. Die Ausführungszeit kann bis zu einer maximalen Zeit konfiguriert werden. Eine Funktion, die länger läuft, kostet mehr. Auch 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 ist besser geeignet, wenn Sie eine hohe Anzahl von Vorgängen haben, die kurz sind, aber voraussichtlich kontinuierlich ausgeführt werden. Dieser Plan ist teurer, da er mehr Arbeitsspeicher und CPU benötigt. Der Vorteil besteht darin, dass Sie Features wie die Integration virtueller Netzwerke verwenden können.
Der Dedicated-Plan eignet sich am besten für Hintergrundaufträge, wenn Ihre Arbeitslast bereits darauf läuft. Wenn Sie untergenutzte virtuelle Maschinen (VMs) haben, können Sie sie auf derselben virtuellen Maschine ausführen und Rechenkosten teilen.
Weitere Informationen finden Sie in den folgenden Artikeln:
Azure-virtuelle Maschinen
Hintergrundaufgaben können auf eine Weise implementiert werden, die verhindert, dass sie in Azure Web Apps bereitgestellt werden, oder diese Optionen sind möglicherweise nicht praktisch. Typische Beispiele sind Windows-Dienste und Dienstprogramme und ausführbare Programme von Drittanbietern. Ein weiteres Beispiel sind Programme, die für eine Ausführungsumgebung geschrieben wurden, die sich von der Hostung der Anwendung unterscheidet. Beispielsweise kann es sich um ein Unix- oder Linux-Programm handeln, das Sie aus einer Windows- oder .NET-Anwendung ausführen möchten. Sie können aus einer Reihe von Betriebssystemen für einen virtuellen Azure-Computer wählen und Ihren Dienst oder ihre ausführbare Datei auf diesem virtuellen Computer ausführen.
Informationen dazu, wann Virtuelle Computer verwendet werden sollen, finden Sie im Vergleich zu Azure App Services, Cloud Services und virtuellen Computern. Informationen zu den Optionen für virtuelle Computer finden Sie unter Größen für virtuelle Windows-Computer in Azure. Weitere Informationen zu den Betriebssystemen und vorgefertigten Images, die für virtuelle Computer verfügbar sind, finden Sie im Azure Virtual Machines Marketplace.
Um die Hintergrundaufgabe auf einem separaten virtuellen Computer zu initiieren, haben Sie eine Reihe von Optionen:
- Sie können die Aufgabe bei Bedarf direkt von Ihrer Anwendung ausführen, indem Sie eine Anforderung an einen Endpunkt senden, den die Aufgabe verfügbar macht. Dadurch werden alle Daten übergeben, die für die Aufgabe erforderlich sind. Der Endpunkt ruft die Aufgabe auf.
- Sie können die Aufgabe so konfigurieren, dass sie auf einem Zeitplan ausgeführt wird, indem Sie einen Planer oder einen Timer verwenden, der in Ihrem ausgewählten Betriebssystem verfügbar ist. Unter Windows können Sie beispielsweise windows Task Scheduler verwenden, um Skripts und Aufgaben auszuführen. Wenn Sie SQL Server auf dem virtuellen Computer installiert haben, können Sie den SQL Server-Agent verwenden, um Skripts und Aufgaben auszuführen.
- Sie können Azure Logic Apps verwenden, um die Aufgabe zu initiieren, indem Sie eine Nachricht zu einer Warteschlange hinzufügen, 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
Berücksichtigen Sie die folgenden Punkte, wenn Sie entscheiden, ob Hintergrundaufgaben auf einem virtuellen Azure-Computer bereitgestellt werden sollen:
- Das Hosten von Hintergrundaufgaben in einem separaten virtuellen Azure-Computer bietet Flexibilität und ermöglicht eine präzise Kontrolle über Initiierung, Ausführung, Planung und Ressourcenzuordnung. Die Laufzeitkosten werden jedoch erhöht, wenn ein virtueller Computer nur zum Ausführen von Hintergrundaufgaben bereitgestellt werden muss.
- Es gibt keine Möglichkeit, die Aufgaben im Azure-Portal und keine automatische Neustartfunktion für fehlgeschlagene Aufgaben zu überwachen – obwohl Sie den grundlegenden Status des virtuellen Computers überwachen und mithilfe der Azure Resource Manager-Cmdlets verwalten können. Es gibt jedoch keine Möglichkeiten zum Steuern von Prozessen und Threads in Computeknoten. In der Regel erfordert die Verwendung eines virtuellen Computers zusätzlichen Aufwand, um einen Mechanismus zu implementieren, der Daten aus der Instrumentierung in der Aufgabe und vom Betriebssystem auf dem virtuellen Computer sammelt. Eine Lösung, die möglicherweise geeignet ist, besteht darin, das System Center Management Pack für Azure zu verwenden.
- Möglicherweise sollten Sie in Betracht ziehen, Überwachungssonden zu erstellen, die über HTTP-Endpunkte zugänglich sind. Der Code für diese Prüfpunkte könnte Integritätsprüfungen durchführen, operative Informationen und Statistiken sammeln – oder Fehlerinformationen zusammenführen und an eine Verwaltungsanwendung zurückgeben. Weitere Informationen finden Sie im Health Endpoint Monitoring Muster.
Weitere Informationen finden Sie unter:
Azure Batch
Erwägen Sie Azure Batch , wenn Sie große, parallele HPC-Workloads (High-Performance Computing) über zehn, Hunderte oder Tausende von VMs ausführen müssen.
Der Batchdienst stellt die virtuellen Computer bereit, weist den virtuellen Computern Aufgaben zu, führt die Aufgaben aus und überwacht den Fortschritt. Batch kann die virtuellen Computer automatisch als Reaktion auf die Workload skalieren. Batch stellt auch die Auftragsplanung bereit. Azure Batch unterstützt sowohl Linux- als auch Windows-VMs.
Überlegungen
Batch funktioniert gut mit systemintern parallelen Workloads. Sie kann auch parallele Berechnungen mit einem reduzierten Schritt am Ende ausführen, oder Anwendungen zum Übergeben von Nachrichten (Message Passing Interface, MPI) für parallele Aufgaben ausführen, bei denen nachrichtenübergaben zwischen Knoten erforderlich sind.
Ein Azure Batch-Auftrag wird auf einem Pool von Knoten (VMs) ausgeführt. Ein Ansatz besteht darin, einen Pool nur bei Bedarf zuzuweisen und nach Abschluss des Auftrags zu löschen. Hierdurch wird die Auslastung maximiert, da die Knoten nicht ungenutzt bleiben, aber für den Auftrag muss gewartet werden, bis die Knoten zugeordnet wurden. Alternativ können Sie vorab einen Pool erstellen. Bei diesem Ansatz wird die Zeit verringert, die zum Starten eines Auftrags benötigt wird, aber er kann auch dazu führen, dass Knoten nicht genutzt werden. Weitere Informationen finden Sie im Abschnitt Lebensdauer von Pools und Rechenknoten.
Weitere Informationen finden Sie unter:
- Was ist Azure Batch?
- Entwickeln von umfangreichen parallelen Computelösungen mit Batch
- Batch- und HPC-Lösungen für rechenintensive Workloads
Azure Kubernetes-Dienst
Azure Kubernetes Service (AKS) verwaltet Ihre gehostete Kubernetes-Umgebung, wodurch containerisierte Anwendungen einfach bereitgestellt und verwaltet werden können.
Container können für das Ausführen von Hintergrundaufträgen nützlich sein. Einige Vorteile sind:
- Container unterstützen das Hosting mit hoher Dichte. Sie können eine Hintergrundaufgabe in einem Container isolieren und gleichzeitig mehrere Container in jedem virtuellen Computer platzieren.
- Der Container-Orchestrator verarbeitet den internen Lastenausgleich, die Konfiguration des internen Netzwerks und andere Konfigurationsaufgaben.
- Container können nach Bedarf gestartet und beendet werden.
- Mit der Azure-Containerregistrierung können Sie Ihre Container innerhalb von Azure-Grenzen registrieren. Dies kommt mit Sicherheits-, Datenschutz- und Näherungsvorteilen zusammen.
Überlegungen
- Erfordert ein Verständnis für die Verwendung eines Container-Orchestrators. Je nach den Fähigkeiten Ihres DevOps-Teams kann dies ein Problem sein.
Weitere Informationen finden Sie unter:
Azure Container Apps – ein Dienst für containerbasierte Anwendungen
Mit Azure Container Apps können Sie serverlose Microservices basierend auf Containern erstellen. Zu den besonderen Merkmalen von Container Apps gehören:
- Optimiert für die Ausführung von universellen Containern, insbesondere für Anwendungen, die sich über viele in Containern bereitgestellte Microservices erstrecken
- Unterstützt von Kubernetes und Open-Source-Technologien wie Dapr, Kubernetes Event-driven Autoscaling (KEDA) und Envoy.
- Unterstützt Kubernetes-Apps und Microservices mit Features wie Service Discovery und Datenverkehrsteilung.
- Ermöglicht ereignisgesteuerte Anwendungsarchitekturen durch Unterstützung einer Skalierung auf Grundlage des Datenverkehrs und des Abrufs von Ereignisquellen wie z. B. Warteschlangen, einschließlich Skalierung auf 0
- Unterstützung von zeitintensiven Prozessen und Fähigkeit zur Ausführung von Hintergrundaufgaben.
Überlegungen
Azure Container Apps bietet keinen direkten Zugriff auf die zugrunde liegenden Kubernetes-APIs. Wenn Sie Zugriff auf die Kubernetes-APIs und die Steuerungsebene benötigen, sollten Sie Azure Kubernetes Service verwenden. Wenn Sie jedoch Anwendungen im Kubernetes-Stil erstellen möchten und keinen direkten Zugriff auf sämtliche nativen Kubernetes-APIs und die Clusterverwaltung benötigen, bietet Container Apps eine vollständig verwaltete Benutzeroberfläche basierend auf Best Practices. Aus diesen Gründen ziehen es viele Teams vor, containerbasierte Microservices mit Azure Container Apps zu entwickeln.
Weitere Informationen finden Sie unter:
Sie können mit dem Erstellen Ihrer ersten Container-App beginnen unter Verwendung der Schnellstartanleitungen.
Partitionierung
Wenn Sie sich entscheiden, Hintergrundaufgaben in eine vorhandene Computeinstanz einzuschließen, müssen Sie berücksichtigen, wie sich dies auf die Qualitätsattribute der Computeinstanz und die Hintergrundaufgabe selbst auswirkt. Anhand dieser Faktoren können Sie entscheiden, ob Sie die Aufgaben mit der vorhandenen Recheninstanz zusammenführen oder in eine separate Recheninstanz auslagern möchten.
Verfügbarkeit: Hintergrundaufgaben müssen möglicherweise nicht die gleiche Verfügbarkeitsebene aufweisen wie andere Teile der Anwendung, insbesondere die Benutzeroberfläche und andere Teile, die direkt an der Benutzerinteraktion beteiligt sind. Hintergrundaufgaben könnten toleranter gegenüber Latenz, wiederholten Verbindungsfehlern und anderen Faktoren sein, die sich auf die Verfügbarkeit auswirken, da die Operationen in die Warteschlange gestellt werden können. Allerdings muss genügend Kapazität vorhanden sein, um die Sicherung von Anforderungen zu verhindern, wodurch Warteschlangen blockiert werden könnten und die Anwendung als Ganzes beeinträchtigt werden könnte.
Skalierbarkeit: Hintergrundaufgaben haben wahrscheinlich eine andere Skalierbarkeitsanforderung als die Benutzeroberfläche und die interaktiven Teile der Anwendung. Die Skalierung der Benutzeroberfläche ist möglicherweise erforderlich, um Spitzen in der Nachfrage zu erfüllen, während herausragende Hintergrundaufgaben während weniger beschäftigten Zeiten durch weniger Recheneinheiten abgeschlossen werden können.
Resilienz: Fehler einer Computeinstanz, die nur Hintergrundaufgaben hosten, wirken sich möglicherweise nicht schwerwiegend auf die Anwendung als Ganzes aus, wenn die Anforderungen für diese Aufgaben in die Warteschlange gestellt oder verschoben werden können, bis die Aufgabe erneut verfügbar ist. Wenn die Computeinstanz oder -aufgaben innerhalb eines entsprechenden Intervalls neu gestartet werden können, sind Die Benutzer der Anwendung möglicherweise nicht betroffen.
Sicherheit: Hintergrundaufgaben weisen möglicherweise unterschiedliche Sicherheitsanforderungen oder Einschränkungen auf als die Benutzeroberfläche oder andere Teile der Anwendung. Mithilfe einer separaten Computeinstanz können Sie eine andere Sicherheitsumgebung für die Aufgaben angeben. Sie können auch Muster wie Gatekeeper verwenden, um die Hintergrundberechnungsinstanzen von der Benutzeroberfläche zu isolieren, um Die Sicherheit und Trennung zu maximieren.
Leistung: Sie können den Typ der Computeinstanz für Hintergrundaufgaben auswählen, um speziell den Leistungsanforderungen der Aufgaben zu entsprechen. Dies kann bedeuten, dass sie eine kostengünstigere Berechnungsoption verwenden, wenn die Aufgaben nicht die gleichen Verarbeitungsfunktionen wie die Benutzeroberfläche erfordern, oder eine größere Instanz, wenn sie zusätzliche Kapazität und Ressourcen benötigen.
Verwaltbarkeit: Hintergrundaufgaben können einen anderen Entwicklungs- und Bereitstellungsrhythmus aufweisen als der Hauptanwendungscode oder die Benutzeroberfläche. Durch die Bereitstellung in einer separaten Computeinstanz können Updates und Versionsverwaltung vereinfacht werden.
Kosten: Das Hinzufügen von Computeinstanzen zum Ausführen von Hintergrundaufgaben erhöht die Hostingkosten. Sie sollten den Kompromiss zwischen zusätzlicher Kapazität und diesen zusätzlichen Kosten sorgfältig berücksichtigen.
Weitere Informationen finden Sie im Leader-Election-Muster und im Competing-Consumers-Muster.
Konflikte
Wenn mehrere Instanzen eines Hintergrundauftrags vorhanden sind, ist es möglich, dass sie um den Zugriff auf Ressourcen und Dienste wie Datenbanken und Speicher konkurrieren. Dieser gleichzeitige Zugriff kann zu Ressourcenkonflikten führen, was zu Konflikten bei der Verfügbarkeit der Dienste und zur Integrität des Datenspeichers führen kann. Sie können Ressourcenkonflikte mithilfe eines pessimistischen Sperrverfahrens auflösen. Dadurch wird verhindert, dass konkurrierende Instanzen einer Aufgabe gleichzeitig auf einen Dienst zugreifen oder Daten beschädigt werden.
Ein anderer Konfliktlösungsansatz ist die Definition der Hintergrundaufgaben als Singleton, sodass immer nur eine Instanz ausgeführt wird. Dadurch werden jedoch die Zuverlässigkeits- und Leistungsvorteile beseitigt, die eine Konfiguration mit mehreren Instanzen bereitstellen kann. Dies gilt insbesondere, wenn die Benutzeroberfläche ausreichend Arbeit bereitstellen kann, um mehr als eine Hintergrundaufgabe beschäftigt zu halten.
Es ist wichtig, sicherzustellen, dass die Hintergrundaufgabe automatisch neu gestartet werden kann und dass sie über ausreichende Kapazität verfügt, um spitzen Nachfragespitzen zu bewältigen. Sie können dies erreichen, indem Sie eine Computeinstanz mit ausreichenden Ressourcen zuordnen, indem Sie einen Warteschlangenmechanismus implementieren, der Anforderungen für die spätere Ausführung speichern kann, wenn die Nachfrage verringert wird, oder mithilfe einer Kombination dieser Techniken.
Koordination
Die Hintergrundaufgaben können komplex sein und erfordern möglicherweise mehrere einzelne Aufgaben, um ein Ergebnis zu erzeugen oder alle Anforderungen zu erfüllen. In diesen Szenarien ist es üblich, die Aufgabe in kleinere diskrete Schritte oder Teilvorgänge aufzuteilen, die von mehreren Verbrauchern ausgeführt werden können. Multistep-Aufträge können effizienter und flexibler sein, da einzelne Schritte möglicherweise in mehreren Aufträgen wiederverwendbar sind. Es ist auch einfach, die Reihenfolge der Schritte hinzuzufügen, zu entfernen oder zu ändern.
Die Koordination mehrerer Aufgaben und Schritte kann schwierig sein, aber es gibt drei gängige Muster, mit denen Sie Ihre Implementierung einer Lösung leiten können:
Dekompilieren einer Aufgabe in mehrere wiederverwendbare Schritte. Eine Anwendung kann erforderlich sein, um eine Vielzahl von Aufgaben unterschiedlicher Komplexität für die von ihr verarbeiteten Informationen auszuführen. Ein einfacher, aber unflexibler Ansatz für die Implementierung dieser Anwendung könnte sein, 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 Teile derselben Verarbeitung an anderer Stelle innerhalb der Anwendung erforderlich sind. Weitere Informationen finden Sie im Rohr- und Filtermuster.
Verwalten der Ausführung der Schritte für eine Aufgabe. Eine Anwendung kann Aufgaben ausführen, die eine Reihe von Schritten umfassen (von denen einige Remotedienste aufrufen oder auf Remoteressourcen zugreifen können). Die einzelnen Schritte können voneinander unabhängig sein, aber sie werden von der Anwendungslogik orchestriert, die die Aufgabe implementiert. Weitere Informationen finden Sie unter Scheduler Agent Supervisor-Muster.
Verwalten der Wiederherstellung für Aufgabenschritte, die fehlschlagen. Eine Anwendung muss möglicherweise die Arbeit rückgängig machen, die von einer Reihe von Schritten ausgeführt wird (die gemeinsam einen letztendlich konsistenten Vorgang definieren), wenn mindestens eine der Schritte fehlschlägt. Weitere Informationen finden Sie im Muster der Ausgleichstransaktion.
Überlegungen zur Resilienz
Hintergrundaufgaben müssen robust sein, um zuverlässige Dienste für die Anwendung bereitzustellen. Berücksichtigen Sie beim Planen und Entwerfen von Hintergrundaufgaben die folgenden Punkte:
Hintergrundaufgaben müssen in der Lage sein, Neustarts ordnungsgemäß zu verarbeiten, ohne Daten zu beschädigen oder Inkonsistenzen in der Anwendung einzuführen. Bei lang andauernden oder mehrstufigen Aufgaben sollten Sie die Zeigerprüfung verwenden, indem Sie den Status von Aufträgen im beständigen Speicher oder als Nachrichten in einer Warteschlange speichern, falls dies erforderlich ist. Sie können beispielsweise Statusinformationen in einer Nachricht in einer Warteschlange beibehalten und diese Statusinformationen inkrementell mit dem Vorgangsfortschritt aktualisieren, sodass die Aufgabe vom letzten bekannten guten Prüfpunkt verarbeitet werden kann, anstatt von Anfang an neu zu starten. Wenn Sie Azure Service Bus-Warteschlangen verwenden, können Sie Nachrichtensitzungen verwenden, um dasselbe Szenario zu aktivieren. Mit Sitzungen 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 im Muster "Scheduler Agent Supervisor".
Wenn Sie Warteschlangen zur Kommunikation mit Hintergrundaufgaben verwenden, können die Warteschlangen als Puffer fungieren, um Anforderungen zu speichern, die an die Aufgaben gesendet werden, während die Anwendung einer höheren Belastung als üblich ausgesetzt ist. Dadurch können die Aufgaben in Zeiträumen mit einer geringeren Auslastung mit der Benutzeroberfläche gleich ziehen. Dies bedeutet auch, dass Neustarts die Benutzeroberfläche nicht blockieren. Weitere Informationen finden Sie im Queue-Based Load Leveling-Muster. Wenn einige Aufgaben wichtiger sind als andere, sollten Sie das Muster "Priority Queue " implementieren, um sicherzustellen, dass diese Aufgaben vor weniger wichtigen ausgeführt werden.
Hintergrundaufgaben, die durch Nachrichten oder deren Verarbeitung initiiert werden, müssen so konzipiert sein, dass sie mit Inkonsistenzen umgehen können, wie Nachrichten, die außer der Reihe ankommen, Nachrichten, die wiederholt Fehler verursachen (häufig als Giftnachrichten bezeichnet), und Nachrichten, die mehrmals zugestellt werden. Beachte Folgendes:
Nachrichten, die in einer bestimmten Reihenfolge verarbeitet werden müssen, z. B. solche, die Daten basierend auf dem vorhandenen Datenwert ändern (z. B. hinzufügen eines Werts zu einem vorhandenen Wert), kommen möglicherweise nicht in der ursprünglichen Reihenfolge an, in der sie gesendet wurden. Alternativ könnten sie von unterschiedlichen Instanzen einer Hintergrundaufgabe in einer anderen Reihenfolge erledigt werden, da unterschiedliche Lasten auf den einzelnen Instanzen bestehen. Nachrichten, die in einer bestimmten Reihenfolge verarbeitet werden müssen, sollten eine Sequenznummer, einen Schlüssel oder einen anderen Indikator enthalten, den Hintergrundaufgaben verwenden können, um sicherzustellen, dass sie in der richtigen Reihenfolge verarbeitet werden. Wenn Sie Azure Service Bus verwenden, können Sie Nachrichtensitzungen verwenden, um die Reihenfolge der Zustellung zu gewährleisten. Es ist jedoch in der Regel effizienter, wenn möglich, den Prozess so zu entwerfen, dass die Nachrichtenreihenfolge nicht wichtig ist.
In der Regel sieht eine Hintergrundaufgabe Nachrichten in der Warteschlange ein. Dadurch sind sie vorübergehend vor anderen Nachrichtenconsumern verborgen. Anschließend werden die Nachrichten gelöscht, nachdem sie erfolgreich verarbeitet wurden. Wenn eine Hintergrundaufgabe beim Verarbeiten einer Nachricht fehlschlägt, wird diese Nachricht nach Ablauf des Vorschautimeouts wieder in der Warteschlange angezeigt. Sie wird von einer anderen Instanz der Aufgabe oder während des nächsten Verarbeitungszyklus dieser Instanz verarbeitet. Wenn die Nachricht beständig einen Fehler im Consumer verursacht, blockiert sie die Aufgabe, die Warteschlange und schließlich die Anwendung selbst, wenn die Warteschlange voll ist. Daher ist es wichtig, Giftnachrichten aus der Warteschlange zu erkennen und zu entfernen. Wenn Sie Azure Service Bus verwenden, können Nachrichten, die einen Fehler verursachen, automatisch oder manuell in eine zugeordnete Warteschleife für inaktive Buchstaben verschoben werden.
Warteschlangen verfügen garantiert über Übermittlungsmechanismen für eine mindestens einmalige Zustellung, aber sie können die gleiche Nachricht mehrmals übermitteln. Wenn eine Hintergrundaufgabe nach der Verarbeitung einer Nachricht fehlschlägt, aber bevor sie aus der Warteschlange gelöscht wird, wird die Nachricht erneut zur Verarbeitung verfügbar. Hintergrundaufgaben sollten idempotent sein, was bedeutet, dass die Verarbeitung derselben Nachricht mehr als einmal keinen Fehler oder keine Inkonsistenz bei den Daten der Anwendung verursacht. Einige Vorgänge sind natürlich idempotent, z. B. das Festlegen eines gespeicherten Werts auf einen bestimmten neuen Wert. Vorgänge, z. B. das Hinzufügen eines Werts zu einem vorhandenen gespeicherten Wert, ohne zu überprüfen, dass der gespeicherte Wert immer noch identisch ist wie beim ursprünglichen Senden der Nachricht, führt zu Inkonsistenzen. Azure Service Bus-Warteschlangen können so konfiguriert werden, dass duplizierte Nachrichten automatisch entfernt werden. Weitere Informationen zu den Herausforderungen bei mindestens einmaler Nachrichtenübermittlung finden Sie in den Anleitungen zur idempotenten Nachrichtenverarbeitung.
Einige Messagingsysteme, wie z. B. Azure Queue Storage- und Azure Service Bus-Warteschlangen unterstützen eine Eigenschaft, die angibt, wie oft eine Nachricht aus der Warteschlange gelesen wurde. Dies kann beim Umgang mit wiederholten und giftigen Nachrichten nützlich sein. Weitere Informationen finden Sie unter "Asynchronous Messaging Primer " und "Idempotency Patterns".
Überlegungen zu Skalierung und Leistung
Hintergrundaufgaben müssen eine ausreichende Leistung bieten, um sicherzustellen, dass sie die Anwendung nicht blockieren oder zu Inkonsistenzen aufgrund eines verzögerten Vorgangs führen, wenn das System geladen wird. In der Regel wird die Leistung verbessert, indem die Computeinstanzen skaliert werden, die die Hintergrundaufgaben hosten. Berücksichtigen Sie beim Planen und Entwerfen von Hintergrundaufgaben die folgenden Punkte hinsichtlich Skalierbarkeit und Leistung:
Azure unterstützt die automatische Skalierung (sowohl Hochskalierung als auch Herunterskalierung) basierend auf der aktuellen Nachfrage und Last oder einem vordefinierten Zeitplan für Web-Apps und gehostete Bereitstellungen virtueller Maschinen. Verwenden Sie dieses Feature, um sicherzustellen, dass die Anwendung insgesamt über ausreichende Leistungsfunktionen verfügt und gleichzeitig Laufzeitkosten minimiert.
Wenn Hintergrundaufgaben eine andere Leistungsfähigkeit haben als die anderen Teile einer Anwendung (z. B. die Benutzeroberfläche oder Komponenten wie die Datenzugriffsebene), ermöglicht das Hosten der Hintergrundaufgaben in einem separaten Computedienst, dass die Benutzeroberfläche und Hintergrundaufgaben unabhängig skaliert werden können, um die Last zu verwalten. Wenn mehrere Hintergrundaufgaben deutlich unterschiedliche Leistungsfunktionen voneinander aufweisen, sollten Sie sie teilen und jeden Typ unabhängig skalieren. Beachten Sie jedoch, dass dies die Laufzeitkosten erhöhen kann.
Die einfache Skalierung der Computeressourcen reicht möglicherweise nicht aus, um den Verlust der Leistung beim Laden zu verhindern. Möglicherweise müssen Sie auch Speicherwarteschlangen und andere Ressourcen skalieren, um zu verhindern, dass ein einzelner Punkt der gesamten Verarbeitungskette zu einem Engpass wird. Berücksichtigen Sie auch andere Einschränkungen, z. B. den maximalen Durchsatz von Speicher und anderen Diensten, auf die die Anwendung und die Hintergrundaufgaben angewiesen sind.
Hintergrundaufgaben müssen für die Skalierung entwickelt werden. Sie müssen z. B. die Anzahl der verwendeten Speicherwarteschlangen dynamisch erkennen können, um Nachrichten an die entsprechende Warteschlange abzuhören oder zu senden.
Standardmäßig skalieren WebJobs mit ihrer zugeordneten Azure Web Apps-Instanz. 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" enthält: true }. Dadurch wird Azure gezwungen, nur eine Instanz des WebJob auszuführen, auch wenn mehrere Instanzen der zugeordneten Web-App vorhanden sind. Dies kann eine nützliche Technik für geplante Aufträge sein, die nur als einzelne Instanz ausgeführt werden müssen.