Bulkifierad postbearbetning för att undvika CPU-gränser
Lär dig refaktorisera flöden för att använda buntningsmönster som förhindrar Apex_CPU_TIME_LIMIT_EXCEEDED-fel. Detta exempel visar skillnaden mellan ineffektiv och optimerad flödesdesign.
Versioner som krävs
| Visa versioner som stöds. |
| Användarbehörigheter som krävs | |
|---|---|
| Öppna, redigera, skapa, aktivera eller inaktivera ett flöde med alla flödestyper, element och funktioner som finns i Flow Builder, inklusive Einstein och Agentforce för flöde: | Hantera flöde |
Detta exempel visar hur du transformerar ett flöde som utför Data Manipulation Language (DML) inuti en loop till ett buntat flöde som bearbetar poster effektivt. Se en jämförelse före och efter och lär dig principerna för flödesbuntning.
Scenario
Bygg ett postutlöst flöde som körs när ett säljprojekt avslutas. För varje avslutat vunnet säljprojekt skapar flödet en uppföljningsuppgift för varje medlem i säljprojektteamet. Flödet:
- Hämtar alla säljprojektteammedlemmar.
- Skapar en uppgift tilldelad till varje teammedlem.
- Fungerar effektivt även när användare uppdaterar flera säljprojekt samtidigt.
- Undviker Apex_CPU_TIME_LIMIT_EXCEEDED-fel under massoperationer.
Salesforce tillämpar en enskild CPU-tidsgräns på 10 000 millisekunder (10 sekunder) per synkron transaktion. Varje del av automatisering i den transaktionen—Apex, flöden, arbetsflödesregler och processer—hämtas från samma budget. En ineffektiv flödesdesign förvärrar problemet. Andra automatiseringar i transaktionen drar ner den delade budgeten först och ett ineffektivt flöde tar upp mer än nödvändigt av det som återstår.
Ordningen i vilken flöden körs beror på flödestypen. Detta exempel använder ett postutlöst flöde efter sparande, som körs senare i ordningen än flöden innan sparande. Mer information om körordning finns i Utlösare och utförandeordning.
Ineffektiv metod: DML-operationer inuti en loop
Detta tillvägagångssätt orsakar CPU-gränsfel vid bearbetning av flera säljprojekt.
Flödesstruktur: Flödet börjar med ett postutlöst flöde för säljprojektobjektet som körs efter en postuppdatering när Fas är lika med "Avslutade vunna". Flödet använder Hämta poster för att hämta säljprojektteammedlemmar för den utlösande posten och går sedan igenom samlingen. Inuti loopen skapar ett Skapa poster-element en uppgift för varje teammedlem.
Varför detta tillvägagångssätt misslyckas:
- Varje loopupprepning utför en separat DML-operation.
- Ett säljprojekt med 5 teammedlemmar resulterar i 5 DML-operationer.
- När användare uppdaterar 20 säljprojekt samtidigt bearbetar flödet alla säljprojekt i en transaktion.
- 20 säljprojekt × 5 teammedlemmar vardera = 100 DML-operationer i en transaktion.
- Den kumulativa CPU-tiden från 100 DML-operationer överskrider den styrande gränsen.
- Resultat: Apex_CPU_TIME_LIMIT_EXCEEDED-fel.
Effektiv metod: Samlingsbaserad buntning
Detta tillvägagångssätt bearbetar poster effektivt oavsett volym.
Flödesstruktur: Flödet börjar med ett postutlöst flöde för objektet Säljprojekt och använder Hämta poster för att hämta säljprojektteammedlemmar. Flödet skapar en uppgiftspostvariabel och en uppgiftspostsamlingsvariabel. Postvariabeln håller den aktuella uppgiften som flödet arbetar med och postsamlingen håller uppgifterna som ska skapas. Flödet går igenom teammedlemmarna. Inuti loopen bygger ett Tilldelning-element varje uppgiftspost genom att ange värden för postvariabeln Uppgift och relaterar uppgiften till den aktuella teammedlemmen i loopen. Ett annat Tilldelning-element lägger till postvariabelvärdena Uppgift i postsamlingen Uppgift. När loopen är klar skapar ett enskilt Skapa poster-element alla uppgifter från samlingen.
Varför detta fungerar:
- Loopen bygger en samling uppgiftsposter utan att utföra DML-operationer.
- Endast en DML-operation inträffar efter att loopen har slutförts.
- Ett säljprojekt med 5 teammedlemmar resulterar fortfarande i endast 1 DML-operation (att skapa 5 uppgifter samtidigt).
- När användare uppdaterar 20 säljprojekt samtidigt utför flödet totalt 20 DML-operationer (en per säljprojekt).
- Signifikant minskning av CPU-tidsanvändning.
- Resultat: Flödet slutförs framgångsrikt utan att uppnå styrande gränser.
Prestandajämförelse
| Scenario | Ineffektiv (DML i Loop) | Effektiv (Bulkifierad) |
|---|---|---|
| 1 säljprojekt med 5 teammedlemmar | 5 DML-operationer | 1 DML-operation |
| 20 säljprojekt (massuppdatering) med 5 teammedlemmar vardera | 100 DML-operationer (misslyckas troligen med CPU-gränsfel) |
20 DML-operationer (Slutförs framgångsrikt) |
| 100 säljprojekt (databelastning) med 3 teammedlemmar vardera | 300 DML-operationer (Felar definitivt) |
100 DML-operationer (Slutförs framgångsrikt) |
Huvudprinciper för buntning
- Utför aldrig DML-operationer inuti loopar. Samla alltid in poster i en samlingsvariabel under loopen och utför sedan DML efter att loopen är färdig.
- Utforma för massåtgärder från början. Anta att postutlösta flöden bearbetar flera poster samtidigt.
- Använd postsamlingsvariabler. Samlingsbaserade DML-operationer är dramatiskt mer effektiva än individuella operationer.
- Testa med realistiska volymer. Felsökningsläge med en post avslöjar inte problem med massoperationer. Testa med Dataimportguiden, Data Loader eller massuppdateringar.
- Övervaka prestanda. Granska felsökningsloggar för att identifiera flöden som närmar sig styrande gränser innan de misslyckas i produktion.
Steg på hög nivå
Gå igenom stegen i detta exempel. Följ dem i ordning eller gå till en sektion för mer specifika instruktioner.
- Skapa flödet
Konfigurera det postutlösta flödet att köras när säljprojekt avslutas. - Skapa resurser
Skapa de variabler som behövs för massbearbetning. - Hämta teammedlemmar
Hämta posterna för säljprojektteammedlemmar för bearbetning genom att använda ett element för Hämta poster. - Lägg till ett beslut att kontrollera för teammedlemmar
Lägg till ett Beslut-element för att undvika bearbetning om det inte finns några teammedlemmar. - Lägg till ett Loop-element
Lägg till ett Loop-element att upprepa genom teammedlemmar. - Bygg uppgiftsposter inuti loopen
Fyll i fältvärden för postvariabeln TaskRecord för varje teammedlem inuti loopen. - Lägg till uppgifter i samlingen
Lägg till varje uppgiftspost i samlingsvariabeln TasksToCreate för massskapande. - Skapa alla uppgifter efter loopen
Använd ett enskilt Skapa poster-element för att skapa alla uppgifter i en operation. - Lägg till felhantering
Konfigurera felhantering för att samla in och rapportera fel. - Testa med massdata
Att testa buntade flöden kräver simulering av massoperationer. - Fler optimeringstekniker
Optimera buntade flöden ytterligare med dessa tekniker. - Konvertera befintliga flöden
Konvertera flöden med DML-operationer (Data Manipulation Language) i loopar till buntade mönster.
Skapa flödet
Konfigurera det postutlösta flödet att köras när säljprojekt avslutas.
-
Öppna listvyn Flöden.
- I snabbsökningsrutan i Inställningar, skriv Flöden och välj sedan Flöden.
- Från appen Automatisering, välj fliken Flöden.
- Från fliken Flöden i en Lightning-app, klicka på åtgärdsmenyn och välj Öppna flöde.
-
Skapa ett postutlöst flöde.
- Från appen Automatisering Lightning, klicka på Ny. Sök efter och välj Postutlöst flöde.
- I Inställningar, klicka på Nytt flöde, sök efter och välj Postutlöst flöde.
Panelen Konfigurera start öppnas. -
Konfigurera startelementet.
- För Objekt, välj Säljprojekt.
- För Utlös flödet när, välj En post uppdateras.
- I sektionen Ange inmatningsvillkor, För villkorskrav, välj Alla villkor uppfylls (OCH).
- För Fält, väljFas.
- Som Operator väljer du Lika med.
- För Värde, välj Avslutade vunna.
- För Optimera flöde, välj Åtgärder och relaterade poster.
Skapa resurser
Skapa de variabler som behövs för massbearbetning.
-
För att bygga varje uppgift, skapa en postvariabel för att bygga uppgiftsposter.
-
För att öppna verktygslådan, klicka på
.
- Klicka på Ny resurs och välj sedan Variabel.
- För API-namn, ange TaskRecord.
- För Datatyp, välj Post.
- För Objekt, välj Uppgift.
- Klicka på Klar.
-
För att öppna verktygslådan, klicka på
-
För att lagra alla uppgifter, skapa en postsamlingsvariabel för alla uppgifter.
- Klicka på Ny resurs och välj sedan Variabel.
- För API-namn, ange TasksToCreate.
- För Datatyp, välj Post.
- För Objekt, välj Uppgift.
- Välj för att tillåta flera värden (samling).
- Klicka på Klar.
Hämta teammedlemmar
Hämta posterna för säljprojektteammedlemmar för bearbetning genom att använda ett element för Hämta poster.
-
Klicka på
och sök sedan efter och välj Hämta poster.
-
Konfigurera elementet.
- För Etikett, ange Hämta säljprojektteammedlemmar.
-
För Objekt, välj Säljprojektkontaktroll.
I detta exempel lagrar flödet teammedlemmar i objektet Säljprojektkontaktroll. Ett objekt som länkar säljprojekt till kontakter.
- I sektionen Filtrera poster för säljprojektkontaktroll, För fält, välj Säljprojekt-ID.
- Som Operator väljer du Lika med.
- För Värde, välj Utlösande säljprojekt och sedan Säljprojekt-ID.
- För Hur många poster som ska lagras, välj Alla poster.
- För Lagra postdata, välj Lagra alla fält automatiskt.
Lägg till ett beslut att kontrollera för teammedlemmar
Lägg till ett Beslut-element för att undvika bearbetning om det inte finns några teammedlemmar.
-
Klicka på
och sök sedan efter och välj Beslut.
-
Konfigurera beslutet.
- För Etikett, ange Hittade teammedlemmar?.
- API-namnet fylls i automatiskt.
- För Resultatetikett, ange Ja.
- API-namnet fylls i automatiskt.
- För Resurs, välj Säljprojektkontaktroller från Hämta säljprojektteammedlemmar.
- För Operator, välj Är null.
- För Värde, välj Falskt.
- Klicka på Standardresultat.
- För Etikett, ange Nej.
Lägg till ett Loop-element
Lägg till ett Loop-element att upprepa genom teammedlemmar.
-
I sökvägen Ja, klicka på
och sök sedan efter och välj Loop.
-
Konfigurera loopen.
- För Etikett, ange Iterera genom teammedlemmar.
- API-namnet fylls i automatiskt.
-
För Samlingsvariabel, välj Säljprojektkontaktroll från Hämta säljprojektteammedlemmar.
Denna resurs visas som singular, även om den innehåller flera poster.
- För Riktning, välj Första objekt till sista objekt.
Bygg uppgiftsposter inuti loopen
Fyll i fältvärden för postvariabeln TaskRecord för varje teammedlem inuti loopen.
-
Efter För varje, klicka på
och sök sedan efter och välj Tilldelning.
-
Konfigurera tilldelningen.
- För Etikett, ange Bygguppgiftspost.
- API-namnet fylls i automatiskt.
- För Variabel, välj TaskRecord och välj sedan Subject.
- Som Operator väljer du Lika med.
- För värde, ange Följ upp avslutade säljprojekt.
- Klicka på + Lägg till tilldelning.
-
Fortsätt lägga till tilldelningar och ange värden.
Resurs Operator Värde TaskRecord>Status Lika med Inte påbörjad TaskRecord>Priority [Uppgiftspost>Prioritet] Lika med Hög TaskRecord>Tilldelat till ID Lika med Aktuellt objekt från Loop>Kontakt-ID TaskRecord>Relaterat till ID Lika med Utlösa säljprojekt>Säljprojekt-ID
Lägg till uppgifter i samlingen
Lägg till varje uppgiftspost i samlingsvariabeln TasksToCreate för massskapande.
-
Efter elementet Tilldelning och fortfarande i loopen, klicka på
och sök sedan efter och välj Tilldelning.
-
Konfigurera tilldelningen.
- För Etikett, ange Lägg till uppgift i samling.
- För Variabel, välj TasksToCreate.
- För Operator, välj Lägg till.
- För Värde, välj TaskRecord och sedan Hela resursen.
Skapa alla uppgifter efter loopen
Använd ett enskilt Skapa poster-element för att skapa alla uppgifter i en operation.
-
När loopen har avslutats, klicka på
och sök sedan efter och välj Skapa poster.
-
Konfigurera elementet.
- För Etikett, ange Skapa alla uppgifter.
- För att ange värden för postfält, välj Från en postvariabel.
- För Hur många poster som ska skapas, välj Flera.
- För Postsamling, välj TasksToCreate.
- Spara flödet
- För Etikett, ange Skapa uppgifter för säljprojektteammedlemmar.
- API-namnet fylls i automatiskt.
Lägg till felhantering
Konfigurera felhantering för att samla in och rapportera fel.
-
För att hantera fel, lägg till en felsökväg i elementet Skapa poster.
- Klicka på de tre prickarna på elementet Skapa alla uppgifter och välj Lägg till felsökväg.
-
För att meddela Salesforce-administratörer om fel i sökvägen, lägg till åtgärden Skicka e-post.
-
Klicka på
på felvägen och sök sedan efter och välj Skicka e-post.
- För Etikett, ange Meddela administratör om fel.
- API-namnet fylls i automatiskt.
- För Mottagaradresser, ange e-postadressen för den person du vill ska få notisen.
- För Ämne, ange Ett flöde behöver din uppmärksamhet
- För Brödtext, ange Flödet Skapa uppgifter för säljprojektteammedlemmar hade ett fel. Här är felet: .
- Klicka på Infoga en resurs.
- Välj Kör flöde och välj sedan Felmeddelande.
-
Klicka på
- Spara ditt arbete.
Testa med massdata
Att testa buntade flöden kräver simulering av massoperationer.
- För att testa en enskild post, använd felsökningsläget för att uppdatera ett säljprojekt och verifiera att flödet skapar uppgifter korrekt.
- Aktivera flödet.
-
För att testa massåtgärder i en sandbox, använd Dataimportguiden, Data Loader eller en listvy för att uppdatera flera säljprojekt samtidigt.
- Skapa mellan 10 och 20 testsäljprojekt.
- Lägg till teammedlemmar till varje säljprojekt.
- Använd Data Loader eller massuppdatering för att ändra fasen till "Avslutade vunna" för alla säljprojekt samtidigt.
- Kontrollera att flödet skapar alla uppgifter utan fel.
- För att verifiera prestandan, gå igenom Apex felsökningslogg för att bekräfta att CPU-tidsanvändningen är inom acceptabla gränser.
Fler optimeringstekniker
Optimera buntade flöden ytterligare med dessa tekniker.
Använd inmatningsvillkor för att begränsa utförandet
Lägg till villkor i flödets startelement för att säkerställa att det endast körs vid behov. Bearbeta till exempel endast säljprojekt över ett visst belopp eller från specifika posttyper.
Överväg eftersparande för icke-kritiska åtgärder
Postutlösta flöden efter sparande kan skapa uppföljningsuppgifter efter att du har sparat säljprojektet. De körs asynkront och har högre styrande gränser.
Batchprocess för mycket stora volymer
Om säljprojekt ofta har dussintals teammedlemmar, använd ett schemalagt flöde som bearbetar avslutade säljprojekt i satser istället för i realtid.
Konvertera befintliga flöden
Konvertera flöden med DML-operationer (Data Manipulation Language) i loopar till buntade mönster.
Om du har befintliga flöden med DML-operationer i loopar, följ dessa steg för att konvertera dem.
- För att hitta DML-operationer i loopar, identifiera alla elementen Skapa poster, Uppdatera poster och Ta bort poster inuti loopar.
-
För varje DML-element, utför konverteringen.
- För att bygga poster, skapa en postvariabel för den objekttypen.
- För att lagra de poster du vill bearbeta, skapa en postsamlingsvariabel för den objekttypen.
- För att spara fältvärden för posterna, använd ett Tilldelning-element för att tilldela värden till postvariabeln.
- För att samla in posterna att bearbeta, använd en Tilldelning för att lägga till postvariabeln i postsamlingen.
- För att skapa poster effektivt, lägg efter loopen till ett DML-element som bearbetar hela postsamlingen.
- För att verifiera konverteringen, testa noggrant med massdata för att verifiera att refaktoriseringen fungerade korrekt.

