Eine Übersicht über asynchrone Verarbeitung in Salesforce

Beim Ausführen eines Prozesses in Salesforce sollte die erste Frage sein, ob er synchron oder asynchron ausgeführt werden soll. Wenn die Aufgabe verzögert werden kann und kein sofortiges Ergebnis erfordert, ist es immer vorteilhaft, die asynchronen Prozesse von Salesforce zu nutzen, da sie signifikante Vorteile für Ihre technische Architektur bieten.

Was ist asynchrone Verarbeitung?

Asynchrone Prozesse werden in einem eigenen Thread ausgeführt, sodass die Aufgabe abgeschlossen werden kann, ohne dass der Benutzer warten muss. Hier sind die wichtigsten Vorteile:

1. Verbesserte Benutzererfahrung und Leistung

Da asynchrone Prozesse im Hintergrund ausgeführt werden, müssen Benutzer nicht auf deren Abschluss warten. Dies ermöglicht es Benutzern, ihre Arbeit ohne Unterbrechung fortzusetzen und gleichzeitig die Ladezeiten von Seiten und die allgemeine Systemleistung zu verbessern.

2. Höhere Limits

Salesforce legt strenge Grenzen für synchrone Transaktionen fest, wie z.B. die Anzahl der Abfragen oder DML-Operationen pro Transaktion. Die asynchrone Verarbeitung bietet zusätzliche Ausführungsgrenzen, die Ihnen mehr Spielraum für die Skalierung Ihrer Operationen geben.

3. Skalierbarkeit

Indem komplexe oder ressourcenintensive Aufgaben in den Hintergrund verschoben werden, hilft die asynchrone Verarbeitung Ihrem Unternehmen, effizient zu skalieren, ohne die Systemleistung zu beeinträchtigen.

Hier sind die verschiedenen Tools, die Salesforce für die asynchrone Verarbeitung bereitstellt.

Wichtige Überlegungen

Bisher haben wir die asynchrone Verarbeitung, ihre Vorteile und die verschiedenen Tools, die Salesforce für diese Aufgaben bereitstellt, erkundet. Es gibt jedoch mehrere wichtige Faktoren, die berücksichtigt werden müssen, bevor Sie sich für die asynchrone Verarbeitung Ihrer geschäftlichen Anforderungen entscheiden.

1. Asynchrone Verarbeitung hat kein SLA

Beachten Sie, dass asynchrone Prozesse keine garantierte Service Level Agreement (SLA) haben. Sie werden in ihrem eigenen Thread ausgeführt, wann immer Ressourcen verfügbar sind, was bedeutet, dass keine Gewähr besteht, dass die Aufgabe innerhalb eines bestimmten Zeitrahmens abgeschlossen wird. Daher ist es wichtig, die asynchrone Verarbeitung für geschäftliche Abläufe zu vermeiden, die zeitkritisch sind.

2. Wählen Sie das richtige Tool für den Job

Wie bereits erwähnt, bietet Salesforce verschiedene Tools für die asynchrone Verarbeitung an, die jeweils für verschiedene Anwendungsfälle entwickelt wurden. Das Verständnis der Stärken und Grenzen jedes Tools wird Ihnen helfen, das am besten geeignete für Ihre spezifischen Anforderungen auszuwählen.

3. Machen Sie Ihren Code massentauglich

Obwohl Salesforce höhere Ausführungslimits für asynchrone Prozesse bietet, ist es dennoch entscheidend, Ihre Operationen massentauglich zu gestalten. Dies stellt sicher, dass Ihr Code mehrere Datensätze effizient verarbeiten kann, innerhalb der Grenzen der Plattform bleibt und die Leistung beibehält.

4. Implementierung von Fehlerbehandlung und Überwachung

Da asynchrone Jobs im Hintergrund ausgeführt werden, sind eine robuste Fehlerbehandlung und Überwachung unerlässlich. Verwenden Sie try-catch-Blöcke und protokollieren Sie Fehler in benutzerdefinierten Objekten, um die Nachverfolgung zu erleichtern. Implementieren Sie zudem eine Wiederholungslogik, um intermittierende Fehler, wie beispielsweise Probleme bei API-Aufrufen, zu verwalten und die Zuverlässigkeit Ihrer Prozesse zu gewährleisten.

Vertiefung der asynchronen Tools

Werfen wir einen genaueren Blick auf jedes der asynchronen Tools in Salesforce.

Zukünftige Methoden

Zukünftige Methoden werden für Operationen verwendet, die unabhängig in ihrem eigenen Thread ausgeführt werden können. Ein häufiges Anwendungsbeispiel ist die Ausführung von externen Webservice-Aufrufen, bei denen der Benutzer nicht auf den Abschluss der Operation warten muss.

Um eine zukünftige Methode zu definieren, kennzeichnen Sie die Methode einfach mit der @future-Annotation.

Java

 

public class FutureClass {
@future
 public static void myFutureMethod(list recordIds){
   //Code für lang laufende Operationen
 }  
}

Wichtige Punkte zu zukünftigen Methoden:

  • Statisch. Zukünftige Methoden müssen statisch sein.
  • Rückgabetyp void. Sie können nur void zurückgeben.
  • Primitive Datentypen. Zukünftige Methoden können nur primitive Datentypen akzeptieren (z.B. String, Integer, Id). Sie können keine komplexen Objekte als Parameter annehmen.
  • Aufrufe. Wenn die zukünftige Methode einen Webservice-Aufruf tätigen muss, müssen Sie das Attribut callout=true in der Annotation einfügen, um der Methode zu erlauben, den Aufruf durchzuführen.
Java

 

public class FutureClass {
@future(callout = true)
 public static void myFutureMethod(){
   //Aufruf hier
 }  
}

Queueable Apex

Ähnlich wie bei zukünftigen Methoden ermöglicht es Queueable Apex, Operationen in einem eigenen Thread auszuführen, was ideal für lang laufende Aufgaben ist. Es nutzt die Apex-Job-Warteschlange und bietet einen flexibleren und leistungsfähigeren Ansatz für asynchrone Verarbeitung im Vergleich zu zukünftigen Methoden.

Um Queueable Apex zu implementieren, muss Ihre Klasse das Queueable-Interface implementieren. Die Klasse sollte immer eine execute-Methode definieren, die die Logik für die asynchrone Operation enthält.

Java

 

public class QueueableClass implements Queueable{
public void execute(QueueableContext context){
  //Lang laufende Operation
}
}

Sie können Queueable Apex ausführen, indem Sie System.enqueueJob() aufrufen, was den Job zur Warteschlange hinzufügt und eine Job-ID zurückgibt. Diese Job-ID kann verwendet werden, um den Status des Jobs zu überwachen, indem das AsyncApexJob-Objekt abgefragt wird.

Java

 

ID jobID = System.enqueueJob(new QueueableClass());

Wichtige Punkte zu Queueable Apex:

  • Nicht-primitive Datentypen. Im Gegensatz zu zukünftigen Methoden können nicht-primitive Datentypen als Elementvariablen in einer Queueable-Klasse verwendet werden.
  • Job-Verkettung. Queueable-Jobs können verkettet werden, sodass Sie einen zweiten Job von einem bereits ausgeführten starten können und so eine Abfolge von asynchronen Operationen erstellen.

Batch Apex

Wenn Sie asynchrone Operationen auf einer großen Anzahl von Datensätzen ausführen müssen, ist Batch Apex die ideale Lösung. Es teilt Ihren großen Datensatz in kleinere, handhabbare Teile für die Verarbeitung auf.

Um Batch Apex zu implementieren, muss Ihre Klasse das Database.Batchable-Interface implementieren. Die Batch Apex-Klasse sollte drei Methoden definieren: start, execute und finish.

1. Start-Methode

Diese Methode wird zu Beginn des Batch-Jobs ausgeführt. Sie sollte die SOQL-Abfrage enthalten, um den großen Datensatz zu sammeln und einen QueryLocator zurückzugeben. Die Governor-Limitierung für die Gesamtanzahl der Datensätze, die von einer SOQL-Abfrage abgerufen werden, wird in der start-Methode umgangen, wenn Batch Apex verwendet wird.

Java

 

public Database.QueryLocator start(Database.BatchableContext bc) {}

2. Execute-Methode

Die execute-Methode wird für jede Datensatzgruppe aufgerufen. Beachten Sie, dass die Reihenfolge, in der Datensätze verarbeitet werden, nicht garantiert ist.

Java

 

public void execute(Database.BatchableContext bc, list<Object>){}

3. Finish-Methode

Die finish-Methode wird aufgerufen, nachdem alle Datensatzgruppen verarbeitet wurden. Sie wird in der Regel für Nachbearbeitungsaufgaben wie das Senden von Benachrichtigungs-E-Mails verwendet. Jede Ausführung des Batch-Jobs gilt als einzelne Transaktion, und die Governor-Limits werden für jede Datensatzgruppe zurückgesetzt.

Um einen Batch-Job auszulösen, verwenden Sie die Database.executeBatch-Methode. Dadurch wird der Batch-Job der asynchronen Warteschlange hinzugefügt.

Die Database.executeBatch-Methode hat zwei Parameter:

  1. Eine Instanz der Batch Apex-Klasse.
  2. Einen optionalen Batch-Größen-Parameter, der die Anzahl der Datensätze pro Batch angibt. Die maximale Batch-Größe, die Sie angeben können, beträgt 2000.
Java

 

ID batchprocessid = Database.executeBatch(new BatchApex(),2000);

Best Practices bei der Verwendung von asynchronem Apex

Vermeiden Sie das Auslösen von zukünftigen oder wartbaren Methoden in Prozessen mit hohem Volumen

Seien Sie vorsichtig beim Auslösen von zukünftigen oder wartbaren Methoden aus Prozessen, die tägliche asynchrone Limits erschöpfen könnten, wie z.B. Apex-Trigger. Diese Prozesse können schnell verfügbare asynchrone Ressourcen verbrauchen.

Leistung optimieren

Stellen Sie sicher, dass die Leistung von zukünftigen oder wartbaren Methoden optimiert ist. Dazu gehören:

  • Optimierung von Abfragen zur Reduzierung der Verarbeitungszeit.
  • Minimierung der Dauer von Webservice-Aufrufen.
  • Optimierung aller zugehörigen Logiken, wie Trigger oder Flows, um Engpässe zu vermeiden.

Verwenden von Batch Apex für große Datenmengen

Bei der Verarbeitung großer Datensätze sollte immer Batch Apex gegenüber zukünftigen oder wartbaren Methoden bevorzugt werden. Batch Apex ist darauf ausgelegt, massive Datenmengen effizient zu verarbeiten, während zukünftige und wartbare Methoden besser für kleinere Aufgaben geeignet sind.

Wartbare Apex bietet mehr Flexibilität

Wartbare Apex bietet mehr Kontrolle über die Jobausführung im Vergleich zu zukünftigen Methoden, z.B. die Möglichkeit, Jobs miteinander zu verknüpfen oder größere Datenmengen effizienter zu verarbeiten.

Conclusion

Zusammenfassend ist asynchrones Apex in Salesforce ein leistungsstarkes Werkzeug zur Behandlung langlaufender, ressourcenintensiver Prozesse, während die Systemleistung und Benutzererfahrung beibehalten werden. Durch das Verständnis der verschiedenen verfügbaren asynchronen Methoden – wie Zukunftsmethoden, Wartbare Apex und Batch Apex – und das Befolgen bewährter Praktiken können Sie effiziente, skalierbare Lösungen entwerfen, die sowohl Ihren Code als auch die Ressourcen Ihres Systems optimieren. Denken Sie daran, Faktoren wie Governor-Limits, Leistungsoptimierung und Fehlerbehandlung zu berücksichtigen, um sicherzustellen, dass Ihre asynchronen Jobs reibungslos und zuverlässig ablaufen.

Source:
https://dzone.com/articles/asynchronous-processing-salesforce-overview