Esempio di elaborazione dei record in blocco per evitare i limiti della CPU
Di seguito viene descritto come eseguire il refactoring dei flussi per utilizzare schemi di bulking che impediscono gli errori Apex_CPU_TIME_LIMIT_EXCEEDED. Questo esempio dimostra la differenza tra progettazione del flusso inefficiente e ottimizzata.
Versioni (Edition) richieste
| Visualizzare le versioni supportate. |
| Autorizzazioni utente necessarie | |
|---|---|
| Per aprire, modificare, creare, attivare o disattivare un flusso utilizzando tutti i tipi di flusso, gli elementi e le funzioni disponibili in Flow Builder, inclusi Einstein e Agentforce per Flusso: | Gestisci flusso |
Questo esempio mostra come trasformare un flusso che esegue il linguaggio di manipolazione dei dati (DML) all'interno di un loop in un flusso in blocco che elabora i record in modo efficiente. Visualizzare un confronto tra prima e dopo e apprendere i principi della gestione in blocco dei flussi.
Scenario
Creare un flusso attivato da record che viene eseguito quando si chiude un'opportunità. Per ogni opportunità chiusa/conseguita, il flusso crea un'operazione di follow-up per ogni membro del team opportunità. Il flusso:
- Recupera tutti i membri del team opportunità.
- Crea un'operazione assegnata a ogni membro del team.
- Funziona in modo efficiente anche quando gli utenti aggiornano più opportunità contemporaneamente.
- Evita gli errori Apex_CPU_TIME_LIMIT_EXCEEDED durante le operazioni in blocco.
Salesforce impone un limite di tempo per una singola CPU di 10.000 millisecondi (10 secondi) per transazione sincrona. Ogni automazione di quella transazione (trigger Apex, flussi, regole di flusso di lavoro e processi) attinge dallo stesso budget. Una progettazione del flusso inefficiente aggrava il problema. Altre automazioni della transazione riducono il budget condiviso per prime e un flusso inefficiente consuma più del necessario di quanto rimane.
L'ordine di esecuzione dei flussi dipende dal tipo di flusso. Questo esempio utilizza un flusso attivato da record dopo il salvataggio, che viene eseguito più avanti nell'ordine rispetto ai flussi prima del salvataggio. Per informazioni sull'ordine di esecuzione, vedere Trigger e ordine di esecuzione.
Approccio inefficiente: Operazioni DML all'interno di un loop
Questo approccio causa errori di limite della CPU durante l'elaborazione di più opportunità.
Struttura del flusso: Il flusso inizia con un flusso attivato da record nell'oggetto Opportunità eseguito dopo un aggiornamento di record quando Fase uguale a "Chiusa/conseguita". Il flusso utilizza Ottieni record per ottenere i membri del team opportunità per il record di attivazione, quindi esegue un loop nella raccolta. All'interno del loop, un elemento Crea record crea un'operazione per ogni membro del team.
Perché questo approccio non riesce:
- Ogni iterazione del loop esegue un'operazione DML separata.
- Un'opportunità con 5 membri del team risulta in 5 operazioni DML.
- Quando gli utenti aggiornano 20 opportunità contemporaneamente, il flusso elabora tutte le opportunità in un'unica transazione.
- 20 opportunità × 5 membri del team ciascuna = 100 operazioni DML in una transazione.
- Il tempo CPU cumulativo di 100 operazioni DML supera il limite del governor.
- Risultato: Errore Apex_CPU_TIME_LIMIT_EXCEEDED.
Approccio efficiente: Bulkification basato su raccolta
Questo approccio elabora i record in modo efficiente indipendentemente dal volume.
Struttura del flusso: Il flusso inizia con un flusso attivato da record nell'oggetto Opportunità e utilizza Ottieni record per ottenere i membri del team opportunità. Il flusso crea una variabile di record Operazione e una variabile raccolta di record Operazione. La variabile di record contiene l'operazione corrente su cui sta lavorando il flusso e la raccolta di record contiene le operazioni da creare. Il flusso passa attraverso i membri del team. All'interno del loop, un elemento Assegnazione crea ogni record operazione impostando i valori per la variabile di record Operazione e correla l'operazione al membro del team corrente nel loop. Un altro elemento Assegnazione aggiunge i valori della variabile di record Operazione alla raccolta di record Operazione. Al termine del loop, un singolo elemento Crea record crea tutte le operazioni della raccolta.
Perché funziona:
- Il loop crea una raccolta di record operazione senza eseguire operazioni DML.
- Al termine del loop si verifica una sola operazione DML.
- Un'opportunità con 5 membri del team restituisce comunque una sola operazione DML (creando 5 operazioni contemporaneamente).
- Quando gli utenti aggiornano 20 opportunità contemporaneamente, il flusso esegue 20 operazioni DML in totale (una per opportunità).
- Riduzione significativa del consumo di tempo della CPU.
- Risultato: Il flusso viene completato correttamente senza superare i limiti del governor.
Confronto delle prestazioni
| Scenario | Inefficiente (DML in loop) | Efficiente (Bulkified) |
|---|---|---|
| 1 opportunità con 5 membri del team | 5 operazioni DML | 1 operazione DML |
| 20 opportunità (aggiornamento in blocco) con 5 membri del team ciascuna | 100 operazioni DML (Probabilmente non riesce con errore limite CPU) |
20 operazioni DML (Completa correttamente) |
| 100 opportunità (caricamento dati) con 3 membri del team ciascuna | 300 operazioni DML (Decisamente non riesce) |
100 operazioni DML (Completa correttamente) |
Principi chiave di Bulkification
- Non eseguire mai operazioni DML all'interno dei loop. Raccogliere sempre i record in una variabile raccolta durante il loop, quindi eseguire DML al termine del loop.
- Progettazione per le operazioni in blocco fin dall'inizio. Si supponga che i flussi attivati da record elaborino più record contemporaneamente.
- Utilizzare le variabili raccolta di record. Le operazioni DML basate sulle raccolte sono notevolmente più efficienti delle singole operazioni.
- Testare con volumi realistici. La modalità di debug con un record non rivela problemi di operazioni in blocco. Eseguire il test con Importazione guidata dati, Data Loader o aggiornamenti globali.
- Monitorare le prestazioni. Esaminare i registri debug per identificare i flussi che si avvicinano ai limiti del governor prima che falliscano nell'ambiente di produzione.
Fasi di alto livello
Rivedere i passaggi di questo esempio. Seguirli nell'ordine o accedere a una sezione per istruzioni più specifiche.
- Creazione del flusso
Impostare il flusso attivato da record in modo che venga eseguito alla chiusura delle opportunità. - Creazione di risorse
Creare le variabili necessarie per l'elaborazione in blocco. - Ottenere membri del team
Ottenere i record Membro team opportunità per l'elaborazione utilizzando un elemento Ottieni record. - Aggiunta di una decisione per la ricerca di membri del team
Aggiungere un elemento Decisione per evitare l'elaborazione quando non sono presenti membri del team. - Aggiunta di un elemento Loop
Aggiungere un elemento Loop per eseguire l'iterazione tramite i membri del team. - Creazione di record operazione all'interno del loop
Compilare i valori dei campi per la variabile di record TaskRecord per ogni membro del team all'interno del loop. - Aggiunta di operazioni alla raccolta
Aggiungere ogni record operazione alla variabile raccolta TasksToCreate per la creazione in blocco. - Creazione di tutte le operazioni dopo il loop
Utilizzare un singolo elemento Crea record per creare tutte le operazioni in un'unica operazione. - Aggiunta della gestione degli errori
Configurare la gestione dei guasti per acquisire e segnalare gli errori. - Test con dati in blocco
Il test dei flussi in blocco richiede la simulazione di operazioni in blocco. - Altre tecniche di ottimizzazione
Ottimizzare ulteriormente i flussi in blocco con queste tecniche. - Conversione di flussi esistenti
Convertire i flussi con operazioni DML (Data Manipulation Language) in loop in schemi in blocco.
Creazione del flusso
Impostare il flusso attivato da record in modo che venga eseguito alla chiusura delle opportunità.
-
Aprire la visualizzazione elenco Flussi.
- Da Imposta, nella casella Ricerca veloce, immetti Flussi e poi seleziona Flussi.
- Dall'app Automation, selezionare la scheda Flussi.
- Dalla scheda Flussi di qualsiasi app Lightning, fare clic sul menu delle azioni e selezionare Apri flusso.
-
Creare un flusso attivato da record.
- Dall'app Automation Lightning, fare clic su Nuovo. Cercare e selezionare Flusso attivato da record.
- Da Imposta, fare clic su Nuovo flusso, cercare e selezionare Flusso attivato da record.
Viene aperto il riquadro Configura iniziale. -
Configurare l'elemento iniziale.
- Per Oggetto, selezionare Opportunità.
- Per Attivare il flusso quando, selezionare Un record viene aggiornato.
- Nella sezione Imposta condizioni di immissione, Per i requisiti della condizione, selezionare Tutte le condizioni sono soddisfatte (AND).
- Per Campo, selezionare Fase.
- In Operatore, seleziona Uguale a.
- Per Valore, selezionare Chiuse e conseguite.
- Per Ottimizza flusso, selezionare Azioni e record correlati.
Creazione di risorse
Creare le variabili necessarie per l'elaborazione in blocco.
-
Per creare ogni operazione, creare una variabile di record per la creazione dei record operazione.
-
Per aprire la Casella degli strumenti, fare clic su
.
- Fare clic su Nuova risorsa e selezionare Variabile.
- Per Nome API, immettere TaskRecord.
- Per Tipo di dati, selezionare Record.
- Per Oggetto, selezionare Operazione.
- Fai clic su Chiudi.
-
Per aprire la Casella degli strumenti, fare clic su
-
Per memorizzare tutte le operazioni, creare una variabile raccolta di record per tutte le operazioni.
- Fare clic su Nuova risorsa e selezionare Variabile.
- Per Nome API, immettere TasksToCreate.
- Per Tipo di dati, selezionare Record.
- Per Oggetto, selezionare Operazione.
- Selezionare Consenti più valori (raccolta).
- Fai clic su Chiudi.
Ottenere membri del team
Ottenere i record Membro team opportunità per l'elaborazione utilizzando un elemento Ottieni record.
-
Fare clic su
e quindi cercare e selezionare Ottieni record.
-
Configurare l'elemento.
- Per Etichetta, immettere Ottieni membri team opportunità.
-
Per Oggetto, selezionare Ruolo referente opportunità.
In questo esempio, il flusso memorizza i membri del team nell'oggetto Ruolo referente opportunità. Oggetto che collega le opportunità ai referenti.
- Nella sezione Filtra record ruolo referente opportunità, per Campo, selezionare ID opportunità.
- In Operatore, seleziona Uguale a.
- Per Valore, selezionare Attiva opportunità e quindi ID opportunità.
- Per Quanti record memorizzare, selezionare Tutti i record.
- Per Come memorizzare i dati dei record, selezionare Memorizza automaticamente tutti i campi.
Aggiunta di una decisione per la ricerca di membri del team
Aggiungere un elemento Decisione per evitare l'elaborazione quando non sono presenti membri del team.
-
Fare clic su
e quindi cercare e selezionare Decisione.
-
Configurare la decisione.
- Per Etichetta, immettere Membri team trovati?.
- Il nome API viene compilato automaticamente.
- Per Etichetta risultato, immettere Sì.
- Il nome API viene compilato automaticamente.
- Per Risorsa, selezionare Ruoli referente opportunità da Ottieni membri team opportunità.
- Per Operatore, selezionare È nullo.
- Per Valore, selezionare Falso.
- Fare clic su Esito predefinito.
- Per Etichetta, immettere No.
Aggiunta di un elemento Loop
Aggiungere un elemento Loop per eseguire l'iterazione tramite i membri del team.
-
Nel percorso Sì, fare clic su
e quindi cercare e selezionare Loop.
-
Configurare il loop.
- Per Etichetta, immettere Iterata tramite membri team.
- Il nome API viene compilato automaticamente.
-
Per Variabile raccolta, selezionare Ruolo referente opportunità da Ottieni membri team opportunità.
Questa risorsa viene visualizzata come singolare, anche se contiene più record.
- Per Direzione, selezionare Dal primo elemento all'ultimo.
Creazione di record operazione all'interno del loop
Compilare i valori dei campi per la variabile di record TaskRecord per ogni membro del team all'interno del loop.
-
Dopo Per ciascuno, fare clic su
e quindi cercare e selezionare Assegnazione.
-
Configurare l'assegnazione.
- Per Etichetta, immettere Crea record operazione.
- Il nome API viene compilato automaticamente.
- Per Variabile, selezionare TaskRecord e quindi Oggetto.
- In Operatore, seleziona Uguale a.
- Come valore, immettere Segui su opportunità chiuse.
- Fare clic su + Aggiungi assegnazione.
-
Continuare ad aggiungere assegnazioni e impostare valori.
Risorsa Operatore Valore TaskRecord>Status Uguale a Non avviata TaskRecord>Priorità Uguale a Alta TaskRecord>ID assegnato a Uguale a Elemento corrente da Loop>ID referente TaskRecord>ID correlato a Uguale a Attivazione di Opportunità>ID opportunità
Aggiunta di operazioni alla raccolta
Aggiungere ogni record operazione alla variabile raccolta TasksToCreate per la creazione in blocco.
-
Dopo l'elemento Assegnazione e ancora nel loop, fare clic su
e quindi cercare e selezionare Assegnazione.
-
Configurare l'assegnazione.
- Per Etichetta, immettere Aggiungi operazione alla raccolta.
- Per Variabile, selezionare TasksToCreate.
- Per Operatore, selezionare Aggiungi.
- Per Valore, selezionare TaskRecord e quindi Intera risorsa.
Creazione di tutte le operazioni dopo il loop
Utilizzare un singolo elemento Crea record per creare tutte le operazioni in un'unica operazione.
-
Al termine del loop, fare clic su
e quindi cercare e selezionare Crea record.
-
Configurare l'elemento.
- Per Etichetta, immettere Crea tutte le operazioni.
- Per Come impostare i valori dei campi dei record, selezionare Da una variabile record.
- Per Quanti record creare, selezionare Multiple.
- Per Raccolta record, selezionare TasksToCreate.
- Salvare il flusso.
- Per Etichetta, immettere Crea operazioni per i membri del team opportunità.
- Il nome API viene compilato automaticamente.
Aggiunta della gestione degli errori
Configurare la gestione dei guasti per acquisire e segnalare gli errori.
-
Per gestire gli errori, aggiungere un percorso di errore all'elemento Crea record.
- Fare clic sui tre puntini dell'elemento Crea tutte le operazioni e selezionare Aggiungi percorso guasto.
-
Per informare gli amministratori Salesforce degli errori nel percorso di errore, aggiungere un'azione Invia email.
-
Nel percorso di errore, fare clic su
e quindi cercare e selezionare Invia email.
- Per Etichetta, immettere Informa l'amministratore.
- Il nome API viene compilato automaticamente.
- Per Indirizzi destinatari, immettere l'indirizzo email della persona a cui si desidera inviare la notifica.
- Per Oggetto, immettere Un flusso richiede attenzione
- Per Corpo, immettere Il flusso Crea operazioni per i membri del team opportunità ha avuto un errore. Ecco l'errore: .
- Fare clic su Inserisci una risorsa.
- Selezionare Flusso in esecuzione e quindi Messaggio guasto.
-
Nel percorso di errore, fare clic su
- Salva le modifiche.
Test con dati in blocco
Il test dei flussi in blocco richiede la simulazione di operazioni in blocco.
- Per testare un singolo record, utilizzare la modalità Debug per aggiornare un'opportunità e verificare che il flusso crei le operazioni correttamente.
- Attivare il flusso.
-
Per testare le operazioni in blocco in un Sandbox, utilizzare l'Importazione guidata dati, Data Loader o una visualizzazione elenco per aggiornare più opportunità contemporaneamente.
- Creare da 10 a 20 opportunità di test.
- Aggiungere membri del team a ogni opportunità.
- Utilizzare Data Loader o l'aggiornamento globale per modificare la fase in "Chiuse e conseguite" per tutte le opportunità contemporaneamente.
- Verificare che il flusso crei tutte le operazioni senza errori.
- Per verificare le prestazioni, rivedere il registro debug Apex per verificare che il consumo di tempo della CPU sia entro limiti accettabili.
Altre tecniche di ottimizzazione
Ottimizzare ulteriormente i flussi in blocco con queste tecniche.
Utilizzo delle condizioni di immissione per limitare l'esecuzione
Aggiungere condizioni all'elemento iniziale del flusso per assicurarsi che venga eseguito solo quando necessario. Ad esempio, elaborare solo le opportunità che superano un determinato ammontare o da tipi di record specifici.
Considerare il salvataggio dopo le operazioni non critiche
I flussi attivati da record dopo il salvataggio possono creare operazioni di follow-up dopo il salvataggio dell'opportunità. Vengono eseguiti in modo asincrono e hanno limiti governor più elevati.
Processo batch per volumi molto grandi
Se le opportunità hanno regolarmente decine di membri del team, utilizzare un flusso pianificato che elabora le opportunità chiuse in batch anziché in tempo reale.
Conversione di flussi esistenti
Convertire i flussi con operazioni DML (Data Manipulation Language) in loop in schemi in blocco.
Se sono presenti flussi esistenti con operazioni DML in loop, eseguire i passaggi seguenti per convertirli.
- Per trovare le operazioni DML nei loop, identificare tutti gli elementi Crea record, Aggiorna record ed Elimina record all'interno dei loop.
-
Per ogni elemento DML, eseguire la conversione.
- Per creare record, creare una variabile di record per quel tipo di oggetto.
- Per memorizzare i record che si desidera elaborare, creare una variabile raccolta di record per quel tipo di oggetto.
- Per salvare i valori dei campi per i record, utilizzare un elemento Assegnazione per assegnare valori alla variabile di record.
- Per raccogliere i record da elaborare, utilizzare un'assegnazione per aggiungere la variabile di record alla raccolta di record.
- Per creare i record in modo efficiente, dopo il loop, aggiungere un elemento DML che elabora l'intera raccolta di record.
- Per verificare la conversione, eseguire un test accurato con i dati in blocco per verificare che il refactoring abbia funzionato correttamente.

