Quando si esegue un processo in Salesforce, la prima domanda che dovresti farti è se eseguirlo in modo sincrono o asincrono. Se il compito può essere ritardato e non richiede un risultato immediato, è sempre vantaggioso sfruttare i processi asincroni di Salesforce, poiché offrono significativi vantaggi alla tua architettura tecnica.
Cos’è l’elaborazione asincrona?
I processi asincroni si eseguono nel proprio thread, consentendo al compito di completarsi senza far attendere l’utente. Ecco i principali vantaggi:
1. Miglior esperienza utente e prestazioni
Dato che i processi asincroni si eseguono in background, gli utenti non devono aspettare che finiscano. Ciò consente agli utenti di continuare il proprio lavoro senza interruzioni, migliorando anche i tempi di caricamento delle pagine e le prestazioni complessive del sistema.
2. Limiti più elevati
Salesforce impone rigidi limiti alle transazioni sincrone, come il numero di query o operazioni DML per transazione. L’elaborazione asincrona fornisce limiti di esecuzione aggiuntivi, offrendoti più spazio per scalare le tue operazioni.
3. Scalabilità
Delegando compiti complessi o intensivi alle risorse a eseguire in background, l’elaborazione asincrona aiuta la tua azienda a scalare in modo efficiente senza compromettere le prestazioni del sistema.
Ecco gli strumenti vari che Salesforce fornisce per l’elaborazione asincrona.
Considerazioni Chiave
Fino ad ora, abbiamo esplorato l’elaborazione asincrona, i suoi benefici e gli strumenti vari che Salesforce fornisce per queste attività. Tuttavia, ci sono diversi fattori importanti da considerare prima di scegliere l’elaborazione asincrona per le esigenze della tua azienda.
1. L’Elaborazione Asincrona Non Ha SLA
Tieni presente che i processi asincroni non hanno un Accordo di Livello di Servizio (SLA) garantito. Vengono eseguiti nel proprio thread ogni volta che ci sono risorse disponibili, il che significa che non c’è garanzia che il compito verrà completato entro un determinato periodo di tempo. Pertanto, è importante evitare di utilizzare l’elaborazione asincrona per flussi aziendali che sono sensibili ai tempi.
2. Scegli lo Strumento Giusto per il Lavoro
Come già menzionato, Salesforce offre vari strumenti per l’elaborazione asincrona, ciascuno progettato per casi d’uso diversi. Comprendere i punti di forza e le limitazioni di ciascuno strumento ti aiuterà a selezionare quello più adatto alle tue esigenze specifiche.
3. Ottimizza il Tuo Codice
Anche se Salesforce fornisce limiti di esecuzione più elevati per i processi asincroni, è comunque fondamentale ottimizzare le tue operazioni. Ciò garantisce che il tuo codice possa gestire efficientemente più record, rimanendo entro i limiti della piattaforma e mantenendo le prestazioni.
4. Implementazione della Gestione degli Errori e del Monitoraggio
Dato che i lavori asincroni vengono eseguiti in background, è essenziale avere una gestione degli errori e un monitoraggio robusti. Utilizzare blocchi try-catch
e registrare gli errori in oggetti personalizzati per facilitare il tracciamento. Inoltre, implementare la logica di riprova per gestire i fallimenti intermittenti, come problemi di chiamate API, per garantire l’affidabilità dei processi.
Approfondimento sugli Strumenti Asincroni
Approfondiamo ciascuno degli strumenti asincroni in Salesforce.
Metodi Futuri
I metodi futuri vengono utilizzati per operazioni che possono essere eseguite in modo indipendente nel proprio thread. Un caso d’uso comune è l’esecuzione di chiamate a servizi web esterni dove l’utente non deve attendere il completamento dell’operazione.
Per definire un metodo futuro, basta annotare il metodo con l’annotazione @future
.
public class FutureClass {
@future
public static void myFutureMethod(list recordIds){
//codice operazione a lungo termine
}
}
Punti chiave sui metodi futuri:
- Statici. I metodi futuri devono essere statici.
- Tipo di ritorno void. Possono ritornare solo
void
. - Tipi di dati primitivi. I metodi futuri possono accettare solo tipi di dati primitivi (ad es.
String
,Integer
,Id
). Non possono accettare oggetti complessi come parametri. - Chiamate. Se il metodo futuro deve effettuare una chiamata a un servizio web, è necessario includere l’attributo
callout=true
nell’annotazione per consentire al metodo di eseguire la chiamata.
public class FutureClass {
@future(callout = true)
public static void myFutureMethod(){
//chiamata qui
}
}
Queueable Apex
Simile ai metodi futuri, Queueable Apex ti permette di eseguire operazioni nel proprio thread, rendendolo ideale per compiti a lunga durata. Sfrutta la coda dei job Apex e fornisce un approccio più flessibile e potente al processo asincrono rispetto ai metodi futuri.
Per implementare Queueable Apex, la tua classe deve implementare l’interfaccia Queueable
. La classe dovrebbe sempre definire un metodo execute
, che contiene la logica per l’operazione asincrona.
public class QueueableClass implements Queueable{
public void execute(QueueableContext context){
//operazione a lunga durata
}
}
Puoi eseguire Queueable Apex chiamando System.enqueueJob()
, che aggiunge il job alla coda e restituisce un ID del job. Questo ID del job può essere utilizzato per monitorare lo stato del job interrogando l’oggetto AsyncApexJob
.
ID jobID = System.enqueueJob(new QueueableClass());
Punti chiave su Queueable Apex:
- Tipo di dati non primitivi. A differenza dei metodi futuri, puoi utilizzare tipi di dati non primitivi come variabili di membro in una classe Queueable.
- Concatenazione di job. I job Queueable possono essere concatenati, consentendoti di avviare un secondo job da uno già in esecuzione, creando una sequenza di operazioni asincrone.
Batch Apex
Quando hai bisogno di eseguire operazioni asincrone su un gran numero di record, Batch Apex è la soluzione ideale. Divide il tuo ampio set di dati in porzioni più piccole e gestibili per l’elaborazione.
Per implementare Batch Apex, la tua classe deve implementare l’interfaccia Database.Batchable
. La classe Batch Apex dovrebbe definire tre metodi: start
, execute
e finish
.
1. Metodo Start
Questo metodo viene eseguito all’inizio del lavoro batch. Dovrebbe contenere la query SOQL per raccogliere il grande set di dati e restituire un QueryLocator
. Il limite del governatore sul numero totale di record recuperati da una query SOQL viene bypassato nel metodo start
quando si utilizza Batch Apex.
public Database.QueryLocator start(Database.BatchableContext bc) {}
2. Metodo Execute
Il metodo execute
viene chiamato per ogni batch di record. Nota che l’ordine in cui i record vengono elaborati non è garantito.
public void execute(Database.BatchableContext bc, list<Object>){}
3. Metodo Finish
Il metodo finish
viene chiamato dopo che tutti i batch di record sono stati elaborati. Viene tipicamente utilizzato per attività di post-elaborazione, come l’invio di email di notifica. Ogni esecuzione del lavoro batch è considerata una singola transazione e i limiti del governatore vengono reimpostati per ogni batch.
Per avviare un lavoro batch, utilizza il metodo Database.executeBatch
. Questo aggiunge il lavoro batch alla coda asincrona.
Il metodo Database.executeBatch
accetta due parametri:
- Un’istanza della classe Batch Apex.
- Un parametro facoltativo di dimensione batch, che specifica il numero di record per batch. La dimensione massima del batch che puoi specificare è 2000.
ID batchprocessid = Database.executeBatch(new BatchApex(),2000);
Best Practices When Using Asynchronous Apex
Avoidare di Attivare Metodi Futuri o In Coda in Processi ad Alto Volume
Sii cauto nel triggerare metodi futuri o in coda da processi che potrebbero esaurire i limiti asincroni giornalieri, come i trigger Apex. Questi processi possono consumare rapidamente le risorse asincrone disponibili.
Ottimizza le Prestazioni
Assicurati che le prestazioni dei metodi futuri o in coda siano ottimizzate. Ciò include:
- Ottimizzare le query per ridurre il tempo di elaborazione.
- Minimizzare le durate delle chiamate ai servizi web.
- Rendere più efficiente la logica associata, come trigger o flussi, per evitare blocchi.
Utilizza Batch Apex per Volumi di Dati Elevati
Per elaborare grandi numeri di record, preferisci sempre Batch Apex rispetto ai metodi futuri o in coda. Batch Apex è progettato per gestire efficacemente insiemi di dati massicci, mentre i metodi futuri e in coda sono più adatti per compiti più piccoli.
Queueable Apex Offre Maggiore Flessibilità
Queueable Apex offre maggiore controllo sull’esecuzione dei lavori rispetto ai metodi futuri, come la capacità di concatenare i lavori o gestire volumi di dati più grandi in modo più efficiente.
Conclusione
In conclusione, l’Apex asincrono in Salesforce è uno strumento potente per gestire processi lunghi e ad alta intensità di risorse mantenendo le prestazioni del sistema e l’esperienza dell’utente. Comprendendo i diversi metodi asincroni disponibili — come Metodi Future, Apex Queueable e Apex Batch— e seguendo le migliori pratiche, puoi progettare soluzioni efficienti e scalabili che ottimizzano sia il tuo codice che le risorse del tuo sistema. Ricorda di considerare fattori come i limiti di governo, l’ottimizzazione delle prestazioni e la gestione degli errori per garantire che i tuoi lavori asincroni vengano eseguiti in modo fluido e affidabile.
Source:
https://dzone.com/articles/asynchronous-processing-salesforce-overview