Exemplo de processamento de registro massificado para evitar limites de CPU
Saiba como refator fluxos para usar padrões de massificação que impedem erros do Apex_CPU_TIME_LIMIT_EXCEEDED. Este exemplo demonstra a diferença entre design de fluxo ineficiente e otimizado.
Edições obrigatórias
| Exibir edições com suporte. |
| Permissões de usuário necessárias | |
|---|---|
| Para abrir, editar, criar, ativar ou desativar um fluxo usando todos os tipos de fluxo, elementos e recursos disponíveis no Flow Builder, incluindo Einstein e Agentforce para Fluxo: | Gerenciar fluxo |
Este exemplo mostra como transformar um fluxo que realiza a Linguagem de manipulação de dados (DML) em um loop em um fluxo massificado que processa registros com eficiência. Visualize uma comparação de antes e depois e aprenda os princípios da massificação de fluxo.
Cenário
Crie um fluxo acionado por registro que seja executado quando uma oportunidade for fechada. Para cada oportunidade fechada e ganha, o fluxo cria uma tarefa de acompanhamento para cada membro da equipe da oportunidade. O fluxo:
- Obtém todos os membros da equipe da oportunidade.
- Cria uma tarefa atribuída a cada membro da equipe.
- Funciona de modo eficiente mesmo quando os usuários atualizam várias oportunidades de uma só vez.
- Evita erros do Apex_CPU_TIME_LIMIT_EXCEEDED durante operações em massa.
O Salesforce impõe um único limite de tempo de CPU de 10 milissegundos (10 segundos) por transação síncrona. Todas as automações nessa transação (acionadores do Apex, fluxos, regras de fluxo de trabalho e processos) se baseiam no mesmo orçamento. Um design de fluxo ineficiente complica o problema. Outras automações na transação reduzem o orçamento compartilhado primeiro, e um fluxo ineficiente consome mais do que o necessário do que resta.
A ordem em que os fluxos são executados depende do tipo de fluxo. Este exemplo usa um fluxo acionado por registro após salvar, que é executado mais tarde na ordem que os fluxos antes de salvar. Para obter detalhes sobre a ordem de execução, consulte Acionadores e Ordem de execução.
Abordagem ineficiente: Operações DML em um loop
Essa abordagem causa erros de limite de CPU ao processar várias oportunidades.
Estrutura de fluxo: O fluxo começa com um Fluxo acionado por registro no objeto Oportunidade que é executado após uma atualização de registro quando Estágio é igual a "Fechado e ganho". O fluxo usa Obter registros para obter Membros da equipe da oportunidade para o registro acionador e, em seguida, faz um loop na coleção. Dentro do loop, um elemento Criar registros cria uma tarefa para cada membro da equipe.
Por que essa abordagem falha:
- Cada iteração de loop executa uma operação DML separada.
- Uma oportunidade com cinco membros da equipe resulta em cinco operações DML.
- Quando os usuários atualizam 20 oportunidades de uma só vez, o fluxo processa todas as oportunidades em uma transação.
- 20 oportunidades × 5 membros da equipe cada = 100 operações DML em uma transação.
- O tempo de CPU cumulativo de 100 operações DML excede o limite do regulador.
- Resultado: Erro do Apex_CPU_TIME_LIMIT_EXCEEDED.
Abordagem eficiente: Massificação baseada em coleção
Essa abordagem processa registros de modo eficiente, independentemente do volume.
Estrutura de fluxo: O fluxo começa com um fluxo acionado por registro no objeto Oportunidade e usa Obter registros para obter Membros da equipe da oportunidade. O fluxo cria uma variável de registro de Tarefa e uma variável de coleção de registros de Tarefa. A variável de registro contém a tarefa atual em que o fluxo está trabalhando e a coleção de registros contém as tarefas a serem criadas. O fluxo faz loop pelos membros da equipe. Dentro do loop, um elemento Atribuição cria cada registro de tarefa definindo valores para a variável de registro Tarefa e relaciona a tarefa ao membro da equipe atual no loop. Outro elemento Atribuição adiciona os valores da variável de registro de Tarefa à coleção de registros de Tarefa. Após a conclusão do loop, um único elemento Criar registros cria todas as tarefas da coleção.
Por que isso funciona:
- O loop cria uma coleção de registros de tarefa sem realizar operações DML.
- Somente uma operação DML ocorre após a conclusão do loop.
- Uma oportunidade com cinco membros da equipe ainda resulta em apenas uma operação DML (criando cinco tarefas por vez).
- Quando os usuários atualizam 20 oportunidades de uma só vez, o fluxo realiza 20 operações DML no total (uma por oportunidade).
- Redução significativa no consumo de tempo de CPU.
- Resultado: O fluxo é concluído com sucesso sem atingir os limites do controlador.
Comparação de desempenho
| Cenário | Ineficiente (DML em loop) | Eficiente (dispersado) |
|---|---|---|
| Uma oportunidade com cinco membros da equipe | 5 operações DML | 1 operação DML |
| 20 oportunidades (atualização em massa) com cinco membros da equipe cada | 100 operações DML (Probavelmente falha com erro de limite de CPU) |
20 operações DML (Concluído com êxito) |
| 100 oportunidades (carregamento de dados) com três membros da equipe cada | 300 operações DML (Definitivamente falha) |
100 operações DML (Concluído com êxito) |
Principios-chave da massificação
- Nunca execute operações DML dentro de loops. Sempre colete registros em uma variável de coleção durante o loop e execute DML após a conclusão do loop.
- Design para operações em massa desde o início. Suponha que os fluxos acionados por registro processem vários registros simultaneamente.
- Use variáveis de coleção de registros. Operações de DML baseadas em coleção são significativamente mais eficientes do que operações individuais.
- Teste com volumes realistas. O modo de depuração com um registro não revela problemas de operação em massa. Teste com Assistente de importação de dados, Data Loader ou atualizações em massa.
- Desempenho do monitor. Revise os registros de depuração para identificar fluxos que se aproximam dos limites do controlador antes de falharem na produção.
Etapas de alto nível
Revise as etapas deste exemplo. Siga-os na ordem ou vá para uma seção para obter instruções mais específicas.
- Criar o fluxo
Configure o fluxo acionado por registro para ser executado quando as oportunidades forem fechadas. - Criar recursos
Crie as variáveis necessárias para processamento em massa. - Obter membros da equipe
Obtenha os registros de Membro da equipe da oportunidade para processamento usando um elemento Obter registros. - Adicionar uma decisão para verificar os membros da equipe
Adicione um elemento de Decisão para evitar o processamento quando não houver membros da equipe. - Adicionar um elemento de loop
Adicione um elemento Loop para iterar pelos membros da equipe. - Criar registros de tarefa dentro do loop
Preencha os valores de campo para a variável de registro TaskRecord para cada membro da equipe dentro do loop. - Adicionar tarefas à coleção
Adicione cada registro de tarefa à variável de coleção TasksToCreate para criação em massa. - Criar todas as tarefas após o loop
Use um único elemento Criar registros para criar todas as tarefas em uma única operação. - Adicionar tratamento de erros
Configure o gerenciamento de falhas para capturar e relatar erros. - Testar com dados em massa
Testar fluxos em massa requer simulação de operações em massa. - Mais técnicas de otimização
Otimize ainda mais os fluxos em massa com estas técnicas. - Converter fluxos existentes
Converta fluxos com operações da Linguagem de manipulação de dados (DML) em loops em padrões massificados.
Criar o fluxo
Configure o fluxo acionado por registro para ser executado quando as oportunidades forem fechadas.
-
Abra o modo de exibição de lista Fluxos.
- Em Configuração, insira Fluxos na caixa Busca rápida e selecione Fluxos.
- No aplicativo Automação, selecione a guia Fluxos.
- Na guia Fluxos em qualquer aplicativo do Lightning, clique no menu de ações e selecione Abrir fluxo.
-
Crie um fluxo acionado por registro.
- No aplicativo Automação do Lightning, clique em Novo. Pesquise e selecione Fluxo acionado por registro.
- Em Configuração, clique em Novo fluxo, pesquise e selecione Fluxo acionado por registro.
O painel Configurar início é aberto. -
Configure o elemento Iniciar.
- Para Objeto, selecione Oportunidade.
- Para Acionar o fluxo quando, selecione Um registro é atualizado.
- Na seção Definir condições de entrada, para Requisitos de condição, selecione Todas as condições são atendidas (E).
- Para Campo, selecione Estágio.
- Para Operador, selecione Igual a.
- Para Valor, selecione Fechado e ganho.
- Para Otimizar fluxo, selecione Ações e registros relacionados.
Criar recursos
Crie as variáveis necessárias para processamento em massa.
-
Para criar cada tarefa, crie uma variável de registro para criar registros de tarefa.
-
Para abrir a Caixa de ferramentas, clique em
.
- Clique em Novo recurso e selecione Variável.
- Para Nome da API, insira TaskRecord.
- Para Tipo de dados, selecione Registro.
- Para Objeto, selecione Tarefa.
- Clique em Concluído.
-
Para abrir a Caixa de ferramentas, clique em
-
Para armazenar todas as tarefas, crie uma variável de coleção de registros para todas as tarefas.
- Clique em Novo recurso e selecione Variável.
- Para Nome da API, insira TasksToCreate.
- Para Tipo de dados, selecione Registro.
- Para Objeto, selecione Tarefa.
- Selecione para permitir diversos valores (coleção).
- Clique em Concluído.
Obter membros da equipe
Obtenha os registros de Membro da equipe da oportunidade para processamento usando um elemento Obter registros.
-
Clique em
e, em seguida, pesquise e selecione Obter registros.
-
Configure o elemento.
- Para Rótulo, insira Obter membros da equipe da oportunidade.
-
Para Objeto, selecione Papel de contato da oportunidade.
Neste exemplo, o fluxo armazena membros da equipe no objeto Papel do contato da oportunidade. Um objeto que vincula oportunidades a contatos.
- Na seção Filtrar registros de papel de contato da oportunidade, para Campo, selecione ID da oportunidade.
- Para Operador, selecione Igual a.
- Para Valor, selecione Acionar oportunidade e depois ID da oportunidade.
- Em quantos registros armazenar, selecione Todos os registros.
- Para Como armazenar dados de registro, selecione Armazenar todos os campos automaticamente.
Adicionar uma decisão para verificar os membros da equipe
Adicione um elemento de Decisão para evitar o processamento quando não houver membros da equipe.
-
Clique em
e, em seguida, pesquise e selecione Decisão.
-
Configure a decisão.
- Para Rótulo, insira Encontrado membros da equipe?.
- O nome da API é preenchido automaticamente.
- Para Rótulo do resultado, insira Sim.
- O nome da API é preenchido automaticamente.
- Para Recurso, selecione Papéis de contato da oportunidade em Obter membros da equipe da oportunidade.
- Para Operador, selecione É nulo.
- Para Valor, selecione Falso.
- Clique em Resultado padrão.
- Para Rótulo, insira Não.
Adicionar um elemento de loop
Adicione um elemento Loop para iterar pelos membros da equipe.
-
No caminho Sim, clique em
e, em seguida, pesquise e selecione Loop.
-
Configure o loop.
- Para Rótulo, insira Iterar por meio de membros da equipe.
- O nome da API é preenchido automaticamente.
-
Para Variável de coleção, selecione Papel de contato da oportunidade em Obter membros da equipe da oportunidade.
Esse recurso é exibido como singular, mesmo que contenha vários registros.
- Para Direção, selecione Primeiro item até último item.
Criar registros de tarefa dentro do loop
Preencha os valores de campo para a variável de registro TaskRecord para cada membro da equipe dentro do loop.
-
Depois Para cada, clique em
e, em seguida, pesquise e selecione Atribuição.
-
Configure a atribuição.
- Para Rótulo, insira Criar registro de tarefa.
- O nome da API é preenchido automaticamente.
- Para Variável, selecione TaskRecord e, em seguida, selecione Subject.
- Para Operador, selecione Igual a.
- Para valor, insira Acompanhar em oportunidade fechada.
- Clique em + Adicionar atribuição.
-
Continue adicionando atribuições e valores de configuração.
Recurso Operador Valor TaskRecord>Status Igual a Não iniciado TaskRecord>Prioridade Igual a Alta TaskRecord>Atribuído ao ID Igual a Item atual de Loop>ID do contato TaskRecord>Relacionado ao ID Igual a Acionando oportunidade>ID da oportunidade
Adicionar tarefas à coleção
Adicione cada registro de tarefa à variável de coleção TasksToCreate para criação em massa.
-
Depois do elemento Atribuição e ainda no loop, clique em
e, em seguida, pesquise e selecione Atribuição.
-
Configure a atribuição.
- Para Rótulo, insira Adicionar tarefa à coleção.
- Para Variável, selecione TasksToCreate.
- Em Operador, selecione Adicionar.
- Para Valor, selecione TaskRecord e depois Recurso inteiro.
Criar todas as tarefas após o loop
Use um único elemento Criar registros para criar todas as tarefas em uma única operação.
-
Depois que o loop terminar, clique em
e, em seguida, pesquise e selecione Criar registros.
-
Configure o elemento.
- Para Rótulo, insira Criar todas as tarefas.
- Para Como definir valores de campo de registro, selecione De uma variável de registro.
- Para Quantos registros criar, selecione Múltiplo.
- Para Coleção de registros, selecione TasksToCreate.
- Salve o fluxo.
- Para Rótulo, insira Criar tarefas para membros da equipe de oportunidade.
- O nome da API é preenchido automaticamente.
Adicionar tratamento de erros
Configure o gerenciamento de falhas para capturar e relatar erros.
-
Para gerenciar erros, adicione um caminho de falha ao elemento Criar registros.
- Clique nos três pontos no elemento Criar todas as tarefas e selecione Adicionar caminho de falha.
-
Para notificar os administradores do Salesforce sobre falhas no caminho de falha, adicione uma ação Enviar email.
-
No caminho de falha, clique em
e, em seguida, pesquise e selecione Enviar email.
- Para Rótulo, insira Notificar administrador sobre erro.
- O nome da API é preenchido automaticamente.
- Para Endereços de destinatário, insira o endereço de email da pessoa que deseja que receba a notificação.
- Para Assunto, insira Um fluxo precisa da sua atenção
- Para Corpo, insira O fluxo Criar tarefas para membros da equipe da oportunidade tinha um erro. Aqui está o erro: .
- Clique em Inserir um recurso.
- Selecione Fluxo em execução e selecione Mensagem de falha.
-
No caminho de falha, clique em
- Salve seu trabalho.
Testar com dados em massa
Testar fluxos em massa requer simulação de operações em massa.
- Para testar um registro individual, use o modo Depuração para atualizar uma oportunidade e verificar se o fluxo cria tarefas corretamente.
- Ative o fluxo.
-
Para testar operações em massa em um sandbox, use o Assistente de importação de dados, o Data Loader ou um modo de exibição de lista para atualizar várias oportunidades de uma só vez.
- Crie entre 10 e 20 oportunidades de teste.
- Adicione membros da equipe a cada oportunidade.
- Use o Data Loader ou a atualização em massa para alterar o estágio para "Fechado e ganho" em todas as oportunidades simultaneamente.
- Verifique se o fluxo cria todas as tarefas sem erros.
- Para verificar o desempenho, revise o registro de depuração do Apex para confirmar se o consumo de tempo de CPU está dentro dos limites aceitáveis.
Mais técnicas de otimização
Otimize ainda mais os fluxos em massa com estas técnicas.
Usar condições de entrada para limitar a execução
Adicione condições ao elemento Início do fluxo para garantir que ele seja executado apenas quando necessário. Por exemplo, processe somente oportunidades acima de um determinado valor ou de tipos de registro específicos.
Considere o salvamento após operações não críticas
Fluxos acionados por registro após salvar podem criar tarefas de acompanhamento depois de salvar a oportunidade. Eles são executados de modo assíncrono e têm limites de controlador maiores.
Processo em lote para volumes muito grandes
Se as oportunidades tiverem dezenas de membros da equipe regularmente, use um fluxo agendado que processe oportunidades fechadas em lotes, em vez de em tempo real.
Converter fluxos existentes
Converta fluxos com operações da Linguagem de manipulação de dados (DML) em loops em padrões massificados.
Se você tiver fluxos existentes com operações DML em loops, siga estas etapas para convertê-los.
- Para localizar operações DML em loops, identifique todos os elementos Criar registros, Atualizar registros e Excluir registros dentro de loops.
-
Para cada elemento DML, realize a conversão.
- Para criar registros, crie uma variável de registro para esse tipo de objeto.
- Para armazenar os registros que você deseja processar, crie uma variável de coleção de registros para esse tipo de objeto.
- Para salvar valores de campo para os registros, use um elemento Atribuição para atribuir valores à variável de registro.
- Para coletar os registros a processar, use uma Atribuição para adicionar a variável de registro à coleção de registros.
- Para criar registros com eficiência, depois do loop, adicione um elemento DML que processe toda a coleção de registros.
- Para verificar a conversão, teste-a cuidadosamente com dados em massa para verificar se o refatoramento funcionou corretamente.

