Asynchrone Verarbeitung – Grundlagen
Asynchrones Apex
Kurz und knackig gesagt, wird asynchrones Apex verwendet, um Prozesse zu einem späteren Zeitpunkt in einem separaten Thread auszuführen.
Ein asynchroner Prozess ist ein Prozess, der eine Aufgabe "im Hintergrund" ausführt, ohne dass der Benutzer darauf warten muss, dass die Aufgabe abgeschlossen wird.
Schauen wir uns ein konkretes Beispiel dazu an. Nehmen wir an, Sie müssen vor Ihrem wöchentlichen Dance Revolution-Training noch einige Dinge erledigen. Ihr Auto gibt seltsame Geräusche von sich, Sie brauchen ein Haargel in einer anderen Farbe und Sie müssen Ihre Uniform bei Ihrer Mutter abholen. Sie können Ihr Auto jetzt in die Werkstatt bringen und warten, bis es repariert wurde, bevor Sie sich den restlichen Aufgaben auf Ihrer Liste zuwenden (synchrone Verarbeitung). Sie können das Auto aber auch in der Werkstatt lassen, in der Zwischenzeit die anderen Dinge erledigen und sich von der Werkstatt anrufen lassen, wenn die Reparatur durchgeführt wurde (asynchrone Verarbeitung). Wenn Sie rechtzeitig zuhause sein wollen, um vor dem Training Ihre Lycra-Leggings bügeln zu können, ermöglicht Ihnen die asynchrone Verarbeitung, mehr Dinge in derselben Zeit zu erledigen, da keine unnötige Wartezeit anfällt.
In der Regel verwenden Sie asynchrones Apex für Callouts an externe Systeme, Vorgänge, die höhere Obergrenzen erfordern, und Code, der zu einem bestimmten Zeitpunkt ausgeführt werden muss. Die wichtigsten Vorteile der asynchronen Verarbeitung sind:
BenutzereffizienzAngenommen, Sie haben einen Prozess, der viele Berechnungen für ein benutzerdefiniertes Objekt durchführt, sobald eine Opportunity erstellt wird. Die für diese Berechnungen erforderliche Zeit könnte von einer kleinen Unannehmlichkeit bis zu einer längeren Zwangspause für den Benutzer reichen. Da sich diese Berechnungen nicht auf die aktuellen Aktionen des Benutzers auswirken, ist es nicht im Sinne einer effizienten Arbeitszeitnutzung, die Benutzer auf den Abschluss eines lange dauernden Prozesses warten zu lassen. Bei asynchroner Verarbeitung kann der Benutzer seine Arbeit fortsetzen, die Verarbeitung erfolgt im Hintergrund und der Benutzer kann die Ergebnisse bei passender Gelegenheit anzeigen.
SkalierbarkeitWenn Sie ermöglichen, dass bestimmte Funktionen der Plattform ausgeführt werden, sobald zu einem künftigen Zeitpunkt Ressourcen verfügbar werden, können Ressourcen verwaltet und schnell skaliert werden. Dadurch kann die Plattform dank paralleler Verarbeitung mehr Aufträge erledigen.
Höhere ObergrenzenAsynchrone Prozesse werden in einem neuen Thread gestartet, wodurch höhere Obergrenzen für die Ausführung gelten. Und, ganz ehrlich, höhere Limits wünscht sich doch jeder!
Es gibt eine Reihe verschiedener Typen von asynchronem Apex. Die einzelnen Typen werden in Kürze detaillierter behandelt, doch hier sehen Sie einen groben Überblick.
Typ | Überblick | Übliche Szenarien |
---|---|---|
Future-Methoden | Werden in einem eigenen Thread ausgeführt und starten erst, wenn Ressourcen verfügbar sind. | Webservice-Callouts |
Batch-Apex | Dient zur Ausführung umfangreicher Aufträge, die die normalen Verarbeitungsgrenzen sprengen würden. | Datenbereinigung oder Archivierung von Datensätzen |
Queueable Apex | Ähnlich wie Future-Methoden, ermöglicht jedoch das Verketten weiterer Aufträge und die Verwendung komplexerer Datentypen. | Durchführung sequenzieller Verarbeitungsvorgänge mit externen Webservices |
Geplantes Apex | Sie planen die Apex-Ausführung für einen bestimmten Zeitpunkt. | Tägliche oder wöchentliche Aufgaben |
Es sollte hier auch erwähnt werden, dass sich diese unterschiedlichen Typen asynchroner Vorgänge nicht gegenseitig ausschließen. In der Praxis wird beispielsweise oftmals ein Batch-Apex-Auftrag über einen geplanten Apex-Auftrag angestoßen.
Mit Trail Together einem Dozenten folgen
Möchten Sie bei diesem Schritt einem Dozenten folgen? Schauen Sie sich dieses Video an, das Teil der Reihe "Trail Together" auf Trailhead Live ist. Einen Link zur vollständigen Sitzung finden Sie im Abschnitt "Ressourcen".
Höhere Obergrenzen für die Ausführung
Einer der Hauptvorteile der Ausführung von asynchronem Apex sind die höheren Obergrenzen für die Ausführung. Bei der Verwendung asynchroner Aufrufe wird beispielsweise die Anzahl von SOQL-Abfragen von 100 auf 200 Abfragen verdoppelt. Die Heap-Gesamtgrößte und die maximale CPU-Zeit vergrößern sich bei asynchronen Aufrufen in ähnlichem Maß.
Sie erhalten bei der asynchronen Verarbeitung nicht nur höhere Obergrenzen, sondern diese Obergrenzen sind auch noch unabhängig von den Limits der synchronen Anforderung, von der die asynchrone Anfrage ursprünglich in die Warteschlange gestellt wurde. Das klingt kompliziert, doch kurz gesagt, haben Sie zwei separate Apex-Aufrufe und mehr als das Doppelte an Verarbeitungskapazität. Dies ist beispielsweise in Fällen praktisch, wenn Sie so viel Verarbeitung wie möglich innerhalb der aktuellen Transaktion erledigen möchten, diese jedoch asynchron fortsetzen möchten, sobald Sie in die Nähe der Obergrenzen kommen.
Wenn Ihnen Lektüre zum Thema Heap-Größen, maximale Ausführungsdauer und Obergrenzen im allgemeinen gefällt, finden Sie unter Execution Governors and Limits weitere spannende Details.
Funktionsweise der asynchronen Verarbeitung
In einer mandantenfähigen Umgebung sind einige Herausforderungen mit der asynchronen Verarbeitung verknüpft:
Faire Verteilung der VerarbeitungStellen Sie sicher, dass jeder Kunde einen fairen Anteil an den Verarbeitungsressourcen erhält.
FehlertoleranzStellen Sie sicher, dass keine asynchronen Anforderungen aufgrund von Hardware- oder Softwarefehlern verloren gehen.
Die Plattform nutzt ein warteschlangenbasiertes, asynchrones Verarbeitungs-Framework. Dieses Framework wird verwendet, um asynchrone Anforderungen für mehrere Organisationen innerhalb jeder Instanz zu verwalten. Der Lebenszyklus einer Anforderung besteht aus drei Teilen:
Die Anforderung wird in die Warteschlange gestellt. Es kann sich hierbei um eine Apex-Batchanforderung, eine Future-Apex-Anforderung oder eine der vielen anderen Arten von Anforderungen handeln. Die Plattform reiht Anforderungen zusammen mit den entsprechenden Daten für die Verarbeitung in die Warteschlange ein.
PersistenzDie in die Warteschlange eingereihte Anforderung wird persistent gespeichert. Anforderungen werden in den persistenten Speicher geschrieben, um die Wiederherstellung bei einem Fehler zu ermöglichen und Transaktionsfunktionen bereitzustellen.
Entfernen aus der WarteschlangeDie in die Warteschlange eingereihte Anforderung wird aus der Warteschlange entfernt und verarbeitet. Wenn die Verarbeitung fehlschlägt, sorgt die Transaktionssteuerung dafür, dass die Anforderungen nicht verloren gehen.
Jede Anforderung wird von einem Handler verarbeitet. Der Handler ist der Code, der Funktionen für einen spezifischen Anforderungstyp durchführt. Handler werden von einer begrenzten Zahl von Arbeits-Threads auf jedem der Anwendungsserver ausgeführt, die eine Instanz bilden. Die Threads fordern Arbeitsaufträge vom Warteschlangen-Framework an und starten nach deren Erhalt einen spezifischen Handler, der die Arbeit erledigt.
Ressourcenschonung
Die Priorität von asynchroner Verarbeitung ist niedriger als die von Echtzeitinteraktionen über Browser und API. Um sicherzustellen, dass genügend Ressourcen vorhanden sind, um einen Anstieg im Bedarf an Rechenressourcen zu decken, überwacht das Warteschlangen-Framework Systemressourcen wie Serverspeicher und CPU-Nutzung und verringert die asynchrone Verarbeitung, wenn Schwellenwerte überschritten werden. Oder einfach gesagt: Das mandantenfähige System schützt sich selbst. Wenn eine Organisation versucht, sich einen größeren Ressourcenanteil "einzuverleiben" als ihr zusteht, wird die asynchrone Verarbeitung ausgesetzt, bis ein normaler Schwellenwert erreicht ist. Lange Rede, kurzer Sinn: Die Verarbeitungsdauer kann nicht garantiert werden, aber irgendwie wird es schon klappen.