# architect Guias de decisão (decision-guides) - Full Documentation # Usar as ferramentas e os padrões certos para arquiteturas conduzidas por evento ## Visão geral As arquiteturas conduzidas por evento dão suporte à produção e ao consumo eficientes de eventos, que comunicam alterações de estado do sistema ou do aplicativo. Essas arquiteturas permitem conexões flexíveis entre sistemas e dão suporte a processos e atualizações quase em tempo real que funcionam entre sistemas. Embora seja fácil ver as vantagens de arquiteturas conduzidas por evento, os detalhes da implementação nem sempre são tão claros. Quais recursos você precisa considerar em padrões de arquitetura conduzidos por evento? Quais problemas específicos esses padrões solucionam? Quais considerações especiais se aplicam às suas soluções e quais são os padrões ideais para lidar com elas? Este guia apresenta padrões usados para criar arquiteturas ideais conduzidas por evento ao trabalhar com tecnologias do Salesforce. Ele também discute ferramentas de controle disponíveis no Salesforce e fornece recomendações de ferramentas para uma seleção de casos de uso. Para obter informações sobre integrações em nível de dados envolvendo o Salesforce, consulte nosso [Guia de decisão de integração de dados](/docs/architect/pt-br/decision-guides/guide/data-integration). ## Capturas - **Use arquiteturas conduzidas por evento para processos que não exigem respostas síncronas a solicitações.** Os padrões descritos neste guia são projetados para consistência de dados, escalabilidade e reutilização, o que ajuda a manter o débito técnico a um mínimo conforme o panorama de aplicativos da sua organização evolui. (Consulte [Bem-arquitetado - taxa de transferência](/docs/architect/pt-br/well-architected/guide/reliable#transmissão) para obter mais informações.) - **Se o MuleSoft ou outra solução Enterprise Service Bus (ESB) fizer parte do seu panorama existente, use-o sempre que possível.** Essas soluções são projetadas para dar suporte a padrões de arquitetura conduzidos por evento e têm recursos poderosos que permitem reutilizar integrações em toda a sua empresa. - **Use a API Pub/Sub para qualquer padrão de publicação/assinatura futuro em vez de criar seus próprios manipuladores de evento usando outras APIs, incluindo a API de streaming.** Agora que a API Pub/Sub está disponível ao público em geral, use-a para qualquer novo padrão de publicação/assinatura. Planeje migrar as comunicações de evento existentes usando outras APIs de plataforma, como a API de streaming ou serviços do Apex personalizados, para a API Pub/Sub quando for viável. - **Os eventos de plataforma e a Captura de dados de alteração (CDC) são os mecanismos preferidos para publicar alterações de registro e campo que precisam ser consumidas por outros sistemas.** Não recomendamos usar PushTopic e eventos genéricos para novas implementações. A Salesforce continuará oferecendo suporte a eventos genéricos e PushTopic nos recursos funcionais atuais, mas não planeja fazer mais investimentos nessa tecnologia. ## Produtos no escopo
| A Plataforma Salesforce é uma plataforma abrangente baseada em IA que une funcionários, agentes de IA autônomos, dados da empresa e aplicativos em um único sistema confiável para aumentar a produtividade e a experiência do cliente. Ele permite a criação de uma "empresa ativa" conectando aplicativos Customer 360, Data Cloud e Slack para automação completa. | |
![]() |
O MuleSoft é a plataforma de integração líder da Salesforce que permite que as organizações conectem aplicativos, dados e dispositivos em ambientes locais e na nuvem. O MuleSoft é uma plataforma que dá aos TI as plataformas para desbloquear dados entre sistemas, desenvolver estruturas de integração e automação escalonáveis e criar experiências diferenciadas e conectadas rapidamente. |
| Ponto de decisão | Diretrizes |
|---|---|
| Notificações quase em tempo real | Os padrões de arquitetura conduzidos por evento, como publish/subscribe, fanout e streaming, tendem a funcionar bem em cenários em que vários aplicativos precisam ser notificados sobre alterações de status ou atualizações de registro quase em tempo real. |
| Processamento paralelo | Padrões como publicar/assinar tendem a funcionar bem em cenários em que grandes volumes de dados ou mensagens altamente complexas exigem a distribuição da carga de processamento entre vários sistemas. |
| Leitura de alto volume | Os padrões de Mensagens passadas e Enfileiramento são comumente usados em cenários em que as organizações têm surtos, e o volume de mensagens que estão sendo produzidas pode exceder a capacidade dos assinantes de processá-los imediatamente. |
| Gravações de alto volume | Os padrões de streaming e enfileiramento funcionam bem em muitos cenários em que as organizações têm aumento no número de mensagens produzidas. |
| Enviar os mesmos dados para diferentes sistemas | Embora a publicação/assinatura tende a ser uma solução bastante comum para organizações que precisam enviar os mesmos dados para vários sistemas, ela pode ser tratada pela maioria dos padrões abordados aqui. Certifique-se de revisá-los em detalhes para encontrar o melhor ajuste. |
| Introdução frequente de novos sistemas ou dispositivos | Os padrões de publicar/assinar, transmitir e enfileirar tendem a funcionar bem para cenários em que o panorama geral tende a estar em fluxo, com novos sistemas e dispositivos sendo adicionados regularmente. Nesse cenário, um novo sistema ou dispositivo simplesmente precisa se tornar um assinante do barramento de evento ou associado a uma fila para começar a receber mensagens, em vez de exigir uma integração de ponto a ponto personalizada. |
| Dispositivos de IoT | Como os dispositivos de IoT geralmente fornecem atualizações frequentes e também podem gerar uma onda de mensagens em alguns cenários, os padrões de streaming e enfileiramento tendem a funcionar bem ao integrá-los a um panorama de TI. |
| Dispositivos e sistemas móveis offline | Dispositivos móveis que precisam trabalhar em áreas com acesso à Internet de baixa qualidade ou não existente ou sistemas que podem estar offline no momento em que as mensagens são entregues se beneficiarão do padrão de enfileiramento, que permite que eles se conectem às filas e recuperem todas as mensagens relevantes quando estiverem online novamente. |
| Ponto de decisão | Orientação/perguntas a fazer |
|---|---|
| Requisitos operacionais | Há uma necessidade comercial genuína para alguma das funcionalidades descritas na seção [Quando usar uma arquitetura conduzida por evento](#quando usar-uma arquitetura conduzida por evento)? |
| Requisitos técnicos | A integração que você está projetando é um ajuste óbvio para um padrão diferente, como virtualização de dados, lote ou solicitação/resposta? Em outras palavras, você está tentando caber um pino quadrado em um buraco redondo? |
| Processos que exigem que os seres humanos aguardem respostas | Qualquer integração que envolva uma espera humana por uma resposta do sistema de destino não é adequada para arquiteturas conduzidas por evento, pois elas são projetadas para execução assíncrona e não podem garantir um tempo de resposta. Considere se processos como esse são ideais para sua organização antes de implementar soluções técnicas. Consulte [Well-Architected – Process Design](/docs/architect/pt-br/well-architected/guide/automated#design-de-processos) para obter mais informações. |
| Alteração frequente dos dados de origem | Se os dados no seu sistema de origem mudarem com tanta frequência que atualizações periódicas sejam suficientes, você provavelmente poderá simplificar sua arquitetura usando [patrons em lote](https://developer.salesforce.com/docs/atlas.en-us.integration_patterns_and_practices.meta/integration_patterns_and_practices/integ_pat_batch_data_sync.htm) em vez de padrões conduzidos por evento. |
| Requisitos de execução | A maioria dos sistemas envolvidos em sua solução oferece suporte a arquiteturas conduzidas por evento? O que seria necessário para usar arquiteturas conduzidas por evento com os sistemas que não oferecem suporte a elas (por exemplo, upgrades, personalizações ou middleware)? Que nível de esforço seria necessário para cumprir esses requisitos? |
| Estabilidade da estrutura de mensagens | Com que frequência suas estruturas de mensagens precisarão mudar? Quais sistemas serão afetados por essa alteração e qual será o processo de remediação? |
| Governança organizacional | Você tem uma estrutura de governança em vigor para garantir que todas as partes interessadas sejam informadas e possam considerar alterações em estruturas de mensagens, acionadores e outras decisões relacionadas a arquitetura e processo? |
| Habilidades necessárias | Sua equipe tem experiência com arquiteturas conduzidas por evento e sabe como dar suporte a elas? |
| Padrão | Quase em tempo real | Cópia de mensagem única | Entrega de garantia | Reduzir o tamanho da mensagem | Transformar dados |
|---|---|---|---|---|---|
| Publicar/Assinar | ✓ | ✓ | ✓ | ||
| Fanout | ✓ | ✓ | ✓ | ||
| Mensagens passadas | ✓ | ✓ | ✓ | ✓ | |
| Streaming | ✓ | ✓ | ✓ | ||
| Enfileiramento | ✓ | ✓ | ✓ |
| Ferramenta | Descrição | Habilidades necessárias | |
|---|---|---|---|
| MuleSoft | Anypoint Platform | Plataforma que habilita a integração de dados usando camadas de APIs. | Código profissional |
| Conector de Pub/Sub do Salesforce | Conector para a API Pub/Sub, que fornece uma única interface para publicar e assinar eventos de plataforma, eventos de monitoramento de evento em tempo real e eventos de captura de dados de alteração. | Código profissional | |
| MuleSoft Anypoint JMS Connector | Conector que habilita o envio e o recebimento de mensagens para filas e tópicos para qualquer serviço de mensagens que implementa a especificação Java Message Service (JMS). | Código profissional | |
| MuleSoft Anypoint Apache Kafka Connector | Conector para mover dados entre o Apache Kafka e aplicativos e serviços corporativos. | Código profissional | |
| Conector do MuleSoft Anypoint Solace | Um conector para agentes de evento Solace PubSub+ com integração de API nativa usando o SDK Java JCSMP | Código profissional | |
| MuleSoft Anypoint MQ Connector | Um serviço de mensagens na nuvem de vários locatários que permite que os clientes realizem mensagens assíncronas avançadas entre seus aplicativos. | Código profissional | |
| Conector MQTT do MuleSoft Anypoint | Uma extensão do MuleSoft em conformidade com o protocolo v3.x MQTT (Transporte de telemetria de enfileiramento de mensagem). | Código profissional | |
| Conector do MuleSoft Anypoint AMQP | Um conector que permite que seu aplicativo publique e consuma mensagens usando um agente em conformidade com AMQP 0.9.1. | Código profissional | |
| API acionada por evento (ASync) do MuleSoft Anypoint | Idioma agnóstico do setor que dá suporte à publicação de APIs conduzidas por evento separando-as em camadas de evento, canal e transporte. | Código profissional | |
| MuleSoft Anypoint MQ | Serviço de mensagens de nuvem multilocatário que permite que os clientes realizem mensagens assíncronas avançadas entre seus aplicativos. | Código profissional | |
| MuleSoft Anypoint Data Streams | Estrutura disponível no MuleSoft Anypoint para publicar e assinar dados de streaming. | Código profissional | |
| Salesforce Platform | Apache Kafka on Heroku | Complemento do Heroku que fornece o Apache Kafka como um serviço com integração de plataforma completa à plataforma Heroku. | Código profissional |
| Captura de dados de alteração | Registro de eventos de alteração, que publica alterações em registros do Salesforce. As alterações incluem a criação de um novo registro, atualizações em um registro existente, exclusão de um registro e cancelamento da exclusão de um registro. | Baixo código para Pro-code | |
| Mensagens de saída | Ações que enviam mensagens XML a pontos de extremidade externos quando os valores de campo são atualizados no Salesforce. | Código baixo | |
| Eventos de plataforma | Mensagens seguras e escalonáveis que contêm dados de evento personalizados. | Baixo código para Pro-code | |
| Pub/Sub API | API que habilita assinaturas para eventos de plataforma, eventos de Captura de dados de alteração e/ou eventos de Monitoramento de evento em tempo real. | Código profissional | |
| Retransmissões de evento | Permite que eventos de plataforma e eventos de captura de dados de alteração sejam enviados do Salesforce para o Amazon EventBridge. Observe que as Retransmissões de evento se conectam apenas ao AWS Eventbridge. | Código baixo | |
#### Ferramentas relevantes para o padrão Publicar/Assinar
| Fluxo e comportamento de evento | Considerações sobre carga útil | ||||||
|---|---|---|---|---|---|---|---|
| Ferramentas disponíveis | Habilidades necessárias | Publicar via | Assinar via | Período de repetição | Estrutura de carga útil | Limites de carga útil | |
| MuleSoft | Anypoint Platform | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum |
| Conector de Pub/Sub do Salesforce | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| MuleSoft Anypoint JMS Connector | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| MuleSoft Anypoint Apache Kafka Connector | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| Conector do MuleSoft Anypoint Solace | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| MuleSoft Anypoint MQ Connector | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| Conector MQTT do MuleSoft Anypoint | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| Conector do MuleSoft Anypoint AMQP | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| API acionada por evento (ASync) do MuleSoft Anypoint | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| MuleSoft Anypoint MQ | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| Salesforce Platform | Apache Kafka on Heroku | Código profissional | APIs, alterações de registro no Heroku Postgres | N/A | 1 a 6 semanas | Usuário definido | Usuário definido |
| Captura de dados de alteração | Baixo código para Pro-code | Alterações de registro | Apex, APIs, Componentes da Web Lightning (LWC) | 3 dias | Predefinido | 1 MB | |
| Mensagens de saída* | Código baixo | Regras de fluxo e fluxo de trabalho | N/A | 24 horas | Usuário definido | 100 notificações por mensagem | |
| Eventos de plataforma | Baixo código para Pro-code | APIs, Apex, Fluxo | Apex, APIs, Flow, LWC | 3 dias | Usuário definido | 1 MB | |
| Pub/Sub API | Código profissional | API ou APIs Pub/Sub, Apex, Fluxo | API Pub/Sub | 3 dias | Usuário definido | 1 MB | |
| Retransmissões de evento** | Código baixo | Eventos de plataforma, Captura de dados de alteração | API | 3 dias | Usuário definido | 1 MB | |
| *A Salesforce continuará oferecendo suporte a mensagens de saída nos recursos funcionais atuais, mas não planeja fazer investimentos adicionais nessa tecnologia. **Retransmissões de evento conectam-se apenas ao AWS EventBridge | |||||||
#### Ferramentas relevantes para o padrão do Fanout
| Fluxo e comportamento de evento | Considerações sobre carga útil | ||||||
|---|---|---|---|---|---|---|---|
| Ferramentas disponíveis | Habilidades necessárias | Publicar via | Assinar via | Período de repetição | Estrutura de carga útil | Limites de carga útil | |
| MuleSoft | MuleSoft Anypoint JMS Connector | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum |
| Conector de Pub/Sub do Salesforce | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| MuleSoft Anypoint Apache Kafka Connector | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| Conector do MuleSoft Anypoint Solace | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| MuleSoft Anypoint MQ Connector | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| Conector MQTT do MuleSoft Anypoint | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| Conector do MuleSoft Anypoint AMQP | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| MuleSoft Anypoint MQ | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| Salesforce Platform | Apache Kafka on Heroku | Código profissional | APIs, alterações de registro no Heroku Postgres | N/A | 1 a 6 semanas | Usuário definido | Usuário definido |
| Captura de dados de alteração | Baixo código para Pro-code | Alterações de registro | Apex, APIs, Componentes da Web Lightning (LWC) | 3 dias | Predefinido | 1 MB | |
| Eventos de plataforma | Baixo código para Pro-code | APIs, Apex, Fluxo | Apex, APIs, Flow, LWC | 3 dias | Usuário definido | 1 MB | |
| Pub/Sub API | Código profissional | API Pub/Sub ou Apex, APIs, Fluxo | API Pub/Sub | 3 dias | Usuário definido | 1 MB | |
| Retransmissões de evento* | Código baixo | Eventos de plataforma, Captura de dados de alteração | API | 3 dias | Usuário definido | 1 MB | |
| *Retransmissões de evento enviam dados apenas para o AWS EventBridge | |||||||
#### Ferramentas relevantes para o padrão de mensagens passadas
| Fluxo e comportamento de evento | Considerações sobre carga útil | ||||||
|---|---|---|---|---|---|---|---|
| Ferramentas disponíveis | Habilidades necessárias | Publicar via | Assinar via | Período de repetição | Estrutura de carga útil | Limites de carga útil | |
| MuleSoft | MuleSoft Anypoint Apache Kafka Connector | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum |
| Conector de Pub/Sub do Salesforce | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| Salesforce Platform | Apache Kafka on Heroku | Código profissional | APIs, alterações de registro no Heroku Postgres | N/A | 1 a 6 semanas | Usuário definido | Usuário definido |
| Captura de dados de alteração | Baixo código para Pro-code | Alterações de registro | Apex, APIs, Componentes da Web Lightning (LWC) | 3 dias | Predefinido | 1 MB | |
| Eventos de plataforma | Baixo código para Pro-code | APIs, Apex, Fluxo | Apex, APIs, Flow, LWC | 3 dias | Usuário definido | 1 MB | |
| Pub/Sub API | Código profissional | API ou APIs Pub/Sub, Fluxo do Apex | API Pub/Sub | 3 dias | Usuário definido | 1 MB | |
| Retransmissões de evento* | Código baixo | Eventos de plataforma, Captura de dados de alteração | API | 3 dias | Usuário definido | 1 MB | |
| *Retransmissões de evento enviam dados apenas para o AWS EventBridge | |||||||
#### Ferramentas relevantes para o padrão de streaming
| Fluxo e comportamento de evento | Considerações sobre carga útil | ||||||
|---|---|---|---|---|---|---|---|
| Ferramentas disponíveis | Habilidades necessárias | Publicar via | Assinar via | Período de repetição | Estrutura de carga útil | Limites de carga útil | |
| MuleSoft | MuleSoft Anypoint Data Streams | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum |
| Conector de Pub/Sub do Salesforce | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| MuleSoft Anypoint Apache Kafka Connector | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| Salesforce Platform | Apache Kafka on Heroku | Código profissional | APIs, alterações de registro no Heroku Postgres | N/A | 1 a 6 semanas | Usuário definido | Usuário definido |
| Pub/Sub API | Código profissional | API ou APIs Pub/Sub, Fluxo do Apex | API Pub/Sub | 3 dias | Usuário definido | 1 MB | |
#### Ferramentas relevantes para o padrão de enfileiramento
| Fluxo e comportamento de evento | Considerações sobre carga útil | ||||||
|---|---|---|---|---|---|---|---|
| Ferramentas disponíveis | Habilidades necessárias | Publicar via | Assinar via | Período de repetição | Estrutura de carga útil | Limites de carga útil | |
| MuleSoft | MuleSoft Anypoint MQ | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum |
| Conector de Pub/Sub do Salesforce | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| MuleSoft Anypoint Apache Kafka Connector | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| MuleSoft Anypoint MQ Connector | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| Conector MQTT do MuleSoft Anypoint | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| Conector do MuleSoft Anypoint AMQP | Código profissional | APIs | APIs | Configurado | Usuário definido | Nenhum | |
| Salesforce Platform | Apache Kafka on Heroku | Código profissional | APIs, alterações de registro no Heroku Postgres | N/A | 1 a 6 semanas | Usuário definido | Usuário definido |
| Captura de dados de alteração | Baixo código para Pro-code | Alterações de registro | Apex, APIs, Componentes da Web Lightning (LWC) | 3 dias | Predefinido | 1 MB | |
| Eventos de plataforma | Baixo código para Pro-code | APIs, Apex, Fluxo | Apex, APIs, Flow, LWC | 3 dias | Usuário definido | 1 MB | |
| Pub/Sub API | Código profissional | API ou APIs Pub/Sub, Apex, Fluxo | API Pub/Sub | 3 dias | Usuário definido | 1 MB | |
| Retransmissões de evento* | Código baixo | Eventos de plataforma, Captura de dados de alteração | API | 3 dias | Usuário definido | 1 MB | |
| *Retransmissões de evento enviam dados apenas para o AWS EventBridge | |||||||
| Fluxo | O Fluxo Salesforce é uma ferramenta avançada de automação de apontar e clicar que permite aos usuários criar processos comerciais complexos, telas e lógica visualmente usando o Flow Builder, sem escrever código. Ele automatiza tarefas como atualizações de dados, envio de emails e orientação de usuários, oferecendo flexibilidade por meio de tipos como Fluxos de tela (interação do usuário) e Fluxos acionados (eventos de registro/agendamento). |
| Apex | O Salesforce Apex é uma linguagem de programação proprietária e orientada a objetos para a plataforma Salesforce, semelhante a Java, usada para criar lógica de negócios personalizada, automatizar processos e estender as principais funcionalidades do CRM além das ferramentas declarativas. |
Conforme o escopo e a complexidade do seu aplicativo Salesforce aumentam, confirme-se com um único ponto de entrada principal: Fluxo acionado por registro ou Acionadores do Apex. Evite particionar automações entre vários mecanismos em um único objeto do Salesforce, pois isso leva à má capacidade de manutenção e à fragmentação da governança.
### A matriz de seleção de densidade
Use essa matriz para determinar o padrão de arquitetura necessário para seu objeto do Salesforce.
- O **Fluxo acionado por registro** é a solução preferida para baixa densidade de automação. Ele oferece um equilíbrio de poder e acessibilidade ideal para automações diretas e independentes umas das outras.
- **O padrão híbrido (Fluxo acionado por registro com Apex invocável)** é uma escolha poderosa e manejável para automações de média densidade com complexidade crescente. Esse padrão permite que as equipes mantenham a coreografia ordenada no Fluxo declarativo enquanto delegam operações pesadas em computação ao Apex, equilibrando acessibilidade e desempenho.
- Os acionadores **Apex** fornecem os blocos de construção necessários para uma base arquitetônica sólida para suportar automações de alta densidade. O desempenho, o controle granular e a abstração e o polimorfismo orientados a objetos do Apex são mais adequados para gerenciar a complexidade e a escala desses cenários.
| Nível de densidade | Quantidade de automação | Volume de dados (tamanho do lote) | Sprawl de dependência | Padrão arquitetônico |
|---|---|---|---|---|
| Baixo | < 15 Automações |
Padrão Interações de interface do usuário orientadas pelo usuário ou cargas de API pequenas (1 a 200 registros) |
Discreto Lógica independente. 0 a 1 operações de DML a jusante no mesmo objeto ou em um objeto relacionado. |
Fluxo acionado por registro |
| Médio | 15–30 Automações |
Moderar Processamento em lote padrão (com lógica que requer massificação cuidadosa) |
Acoplado Pai/filho atualiza de 2 a 4 operações de DML a jusante. Risco de recursão |
Padrão híbrido Fluxo + Apex invocável |
| Alto | > 30 Automações |
Alto Grandes volumes de dados com carregamentos de API em massa (2.000 a 10.000 registros) |
Complexo e Recursivo Gráfico de dependência profunda (5 operações DML a jusante). Risco de loops de recursão triangular |
Apex Trigger Metadata Framework |
| Capacidade | Fluxo acionado por registro | Acionador do Apex |
|---|---|---|
| Velocidade de entrega e manutenção | Recomendado A interface de usuário visual do Flow Builder permite que administradores e outros criadores declarativos criem e modifiquem automações mais rapidamente do que escrever, testar e implementar Apex code. Essa interface permite que uma gama mais ampla de membros da equipe ofereça valor comercial e reduza a dependência de recursos de desenvolvedor especializados para tarefas simples. |
Requer conhecimento O Apex exige que desenvolvedores de software habilitados para implementar, testar e manter o código. |
| Modularidade | Disponível Fluxos acionados por registro são modulares por padrão. Em vez de lógica monolítica, as equipes criam fluxos separados para requisitos específicos e os coreografam juntas usando o Explorador do Acionador de fluxo. Essa modularidade permite a modificação isolada e a extensão simples, reduzindo significativamente o custo de propriedade de longo prazo. |
Disponível O Apex é dividido em módulos funcionais por design. Cada classe do Apex tem como objetivo implementar um único módulo de funcionalidade. |
| Visibilidade e governança | Recomendado A natureza visual do Fluxo fornece uma representação intuitiva da lógica de negócios. O Explorador do acionador de fluxo fornece uma visualização consolidada de todos os fluxos em um objeto, tornando mais fácil para arquitetos e administradores entenderem, governarem e solucionarem problemas sem lerem código. |
Requer conhecimento Usar uma estrutura de metadados para organizar acionadores é vantajoso, mas o Apex exige uma equipe de desenvolvimento disciplinada para manter o código organizado e mantido. |
| Processamento de dados em massa de alto desempenho | Não recomendado Há um maior risco de atingir os limites do controlador ao lidar com lógica complexa ou grandes volumes de dados. |
Recomendado O Apex code é executado mais próximo dos serviços centrais da plataforma e oferece aos desenvolvedores um controle aprimorado sobre a otimização de consultas, o tratamento de dados e a eficiência algorítmica. Isso resulta em melhor desempenho e escala, especialmente em cenários complexos que envolvem grandes volumes de dados. |
| Lógica robusta e estruturas de dados | Disponível O Elemento Transformação de Fluxo pode ajudar com algumas tarefas complexas de processamento. No entanto, o Fluxo não tem estruturas de dados Mapear e Definir nativas, tornando o processamento de dados complexo complicado e computacionalmente ineficiente. |
Recomendado O Apex oferece acesso total a loops Map, Set e Programmatic para manipulação de dados altamente eficiente e segura em massa. Como uma linguagem de programação com recursos completos, o Apex também oferece acesso a construções lógicas complexas, estruturas de dados e padrões de design que podem ajudar a resolver problemas de negócios complexos de forma mantida e eficiente. O Apex inclui uma rica biblioteca padrão de funções avançadas (por exemplo, BusinessHours, Crypto) que atualmente não estão disponíveis em ferramentas declarativas. |
| Controlo da transação | Não disponível O fluxo não fornece acesso a operações de DML `Database.savepoint`, `Database.rollback` ou parcialmente bem-sucedidas para confirmações ou reversões de transações parciais. |
Disponível O Apex fornece controle completo e granular sobre a integridade da transação e cenários complexos de recuperação de erros. |
| Distribuição de email | Recomendado Enviar alertas por email pré-configurados de um fluxo acionado por registro é fácil e escalonável. Alertas por email personalizados podem ser elaborados e distribuídos no tempo de execução. Emails personalizados estão sujeitos a limites diários de envio de email. |
Disponível O Apex pode gerar e enviar mensagens de email personalizadas. Todos os emails enviados do Apex estão sujeitos aos limites diários de envio de email. |
| Aplicando salvaguardas de plataforma | Recomendado O fluxo inclui proteções integradas, como massificação automática e novas tentativas automáticas. Essas proteções aumentam a velocidade de valorização e impedem armadilhas de desempenho que exigem codificação manual complexa. |
Implementação manual necessária Proteções como massificação devem ser codificadas explicitamente (por exemplo, gerenciar coleções e evitar SOQL dentro de loops). As novas tentativas automáticas não são nativas de acionadores e exigem a implementação de uma lógica personalizada complexa. |
| Processamento assíncrono | Disponível O Fluxo oferece mecanismos fáceis para automações que exigem uma transação separada em um caminho assíncrono. Essas automações estão sujeitas a limites diários. |
Disponível O Apex permite o controle total por meio da Captura de dados de alteração e eventos enfileiráveis que são tratados por um assinante de acionador desacoplado. |
| Processamento agendado | Recomendado Os caminhos agendados do fluxo fornecem uma funcionalidade de agendamento exclusiva e eficiente (por exemplo, "desligar 3 dias antes da data de fechamento"). Essa funcionalidade inclui cancelamento automático e reagendamento se os dados do registro mudarem. Essas automações estão sujeitas a limites diários. |
Não disponível Um acionador do Apex não pode agendar nativamente um evento temporal específico do registro com cancelamento automático. Embora o Apex agendado exista, é um mecanismo fundamentalmente diferente que é executado em um horário específico e não é agendado durante o processamento de um registro individual como parte de um acionador. |
| Ordenamento e coreografia | Disponível O Explorador do acionador de fluxo permite que os administradores definam uma ordem de execução relativa para vários fluxos no mesmo objeto. |
Disponível Uma estrutura de acionador fornece controle granular sobre a ordem exata das automações. |
| Atualizações de campo de mesmo registro | Disponível (antes de salvar) O Fluxo acionado por registro é a opção declarativa de melhor desempenho para atualizar o registro acionador antes da confirmação DML inicial. |
Disponível (antes de salvar) O Apex oferece o melhor desempenho com pouca sobrecarga. |
| CRUD de objeto cruzado | Disponível (depois de salvar) O fluxo é adequado para operações de DML de objeto cruzado simples e de baixa complexidade. |
Disponível (depois de salvar) O Apex oferece controle superior sobre a remoção de duplicação, o tratamento de erros e o desempenho para operações DML entre objetos. |
| Deduplicação de cálculos caros | Disponível O fluxo se destaca na eliminação de consultas redundantes e instruções DML por meio de massificação automática. No entanto, o estado não pode ser armazenado em cache ou compartilhado entre diferentes acionadores de fluxo ou entre várias invocações do mesmo fluxo em uma transação. Essa limitação pode se tornar importante em cenários de desempenho extremo. |
Recomendado O Apex fornece mecanismos para desduplicar operações caras. Os desenvolvedores podem aproveitar o armazenamento em cache transacional usando propriedades e variáveis estáticas e o armazenamento em cache no nível da plataforma usando o Cache da plataforma para armazenar e reutilizar dados. Essas técnicas são importantes para reduzir o consumo de limites de controlador transacional, como consultas SOQL, e garantir alto desempenho e escalabilidade. |
| Tratamento de erros personalizados | Disponível O elemento CustomError pode bloquear uma operação de salvamento e exibir uma mensagem ao usuário. |
Recomendado O método addError() fornece mensagens de erro condicionais e em nível de campo flexíveis. |
| Caso de uso | Descrição | Melhor ajuste | Racionalidade |
|---|---|---|---|
| Processamento em lote de alto desempenho | Qualquer automação que precise processar milhares de registros de maneira eficiente | Apex | O Apex fornece APIs avançadas para interface com a plataforma e velocidade bruta. |
| Processamento de dados complexo | Cenários que exigem manipulação de dados avançada | Apex | O Apex fornece estruturas de dados, como Mapa e Conjunto, que não estão disponíveis nativamente no Fluxo e podem ser essenciais para escrever um código de alto desempenho e seguro em massa. |
| Controle transacional | Controlar mecanismos como pontos de salvamento, reversões e confirmações parciais | Apex | O Apex fornece acesso a mecanismos como Database.savepoint e Database.rollback e tem a capacidade de processar operações DML parcialmente bem-sucedidas. |
| Validação personalizada sofisticada | Validação de dados em vários campos em um registro | Apex | Embora o Fluxo possa impedir uma gravação com o elemento `CustomError', ele não está disponível em todos os tipos de fluxo, incluindo subfluxos. O método Apex addError() fornece várias mensagens de erro específicas do campo que podem ser adicionadas a um registro a qualquer momento durante o processamento do acionador. |
| Lógica moderadamente complexa em um processo simples | Lógica e manipulação de dados de complexidade moderada, simplificada por uma biblioteca padrão de funções avançadas, que ocorre como parte de um processo não complicado | Fluxo + Apex | O Fluxo acionado por registro atua como a camada de orquestração, enquanto operações de alta complexidade são encapsuladas no Apex invocável. |
| Lógica simples a moderadamente complexa | Manipulação de dados de baixa a moderada complexidade, com atualizações de acionador para os objetos de dados primários e relacionados | Fluxo | O fluxo costuma ser a opção recomendada, pois é baseado em um modelo declarativo que o torna acessível a administradores e desenvolvedores. |
| Notificações e mensagens de saída | Enviar emails e mensagens de saída | Fluxo | O fluxo torna o envio de alertas por email e mensagens de saída em alterações de registro fácil e altamente escalonável. |
| Processamento agendado | Automação em uma data futura e dinâmica (por exemplo, três dias antes de uma data de fechamento) | Fluxo | Os caminhos agendados fornecem um poder exclusivo ao Fluxo, pois a plataforma gerencia automaticamente o agendamento, o cancelamento e o reagendamento desses caminhos se os dados do registro mudarem. |
### A alternativa de trabalho agendado
Como o fluxograma indica, quando você está enfrentando operações de DML de alto volume, mas não pode usar a Captura de dados de alteração (talvez devido a limites de objeto), a melhor escolha arquitetônica é muitas vezes evitar um processo invocado por acionador completamente.
Em vez disso, considere usar um processo agendado. Isso pode ser um Fluxo agendado ou Apex agendado. As etapas necessárias são:
1. Realize uma atualização simples e de baixo custo no acionador síncrono. Por exemplo, defina um campo de `Status__c` como "processamento pendente" ou insira um registro relacionado a baixo custo, como uma publicação do Chatter, para indicar que o registro precisa ser processado.
2. Crie um trabalho agendado, seja um fluxo agendado ou Apex agendado, que é executado periodicamente, como a cada 15 minutos ou a cada hora.
3. Tenha a consulta de trabalho agendada para todos os registros no estado pendente, execute a lógica complexa em um contexto controlado e de alto volume e atualize os registros conforme processados.
Esse padrão desconecta totalmente o processamento pesado do salvamento síncrono do usuário, não está sujeito ao limite de um trabalho por transação de um lote acionado pelo acionador e fornece uma solução altamente escalonável e regulável para requisitos não em tempo real.
Se a latência de um trabalho agendado não for aceitável para os requisitos de negócios e você ainda estiver impedido de usar o CDC ou uma fila acionada pelo acionador, isso indicará uma incompatibilidade arquitetônica significativa. Nesse ponto, diferentes mecanismos devem ser considerados. Reavaliar o design do aplicativo principal pode levar a determinadas conclusões, como:
- Comprar o complemento para remover limites de objeto da CDC.
- Desafiar fundamentalmente o requisito de negócios para determinar se o processamento quase em tempo real é realmente um "must-have" ou se a latência de um trabalho agendado é uma compensação aceitável para a estabilidade da plataforma.
## Considerações não funcionais
### Complexidade
O nível de complexidade em uma implementação faz parte do custo total de propriedade de uma solução, bem como sua capacidade de se adaptar a mudanças nos requisitos de negócios. A complexidade pode afetar qualquer implementação se as práticas recomendadas não forem seguidas. Na seção Práticas recomendadas _relacionadas_ deste documento, há recomendações para reduzir a complexidade da sua solução, incluindo estes padrões:
- Padrão híbrido: Apex invocável para lógica complexa no fluxo
- Usando uma estrutura de metadados para acionadores do Apex
- Mega-fluxos vs. Vários fluxos
### Processos e padrões
A documentação é tão importante quanto a automação em si. Não apenas garante a capacidade de manutenção, mas também é essencial para IA e ferramentas baseadas em agente. A documentação ajuda você a entender e gerenciar seus processos de negócios.
**Em fluxo**
- Estabeleça uma convenção de nomenclatura consistente para todos os elementos e variáveis.
- Use o campo Descrição do fluxo para explicar seu propósito geral, critérios de acionador e resultado pretendido.
- Use o campo Descrição em cada elemento individual (por exemplo, `Get Records`, `Action`, `Transform`). Essa prática é a melhor maneira de transmitir a intenção. É especialmente importante para ações e subfluxos invocáveis, em que a descrição é o principal lugar para explicar a lógica complexa realizada pela ação.
**No Apex**
- Comente seu código claramente para explicar o _porquê_ por trás de sua lógica, não apenas o _o quê_.
- Se estiver usando uma estrutura conduzida por metadados, garanta que seus registros de metadados incluam e preencham um campo de Descrição legível por humanos para explicar o que cada classe de manipulador faz e quando ela deve ser executada.
DevOps e controle de origem fazem parte de um ciclo de vida de desenvolvimento maduro. Sempre use uma ferramenta de controle de código-fonte, como Git para projetos do Salesforce. As classes do Apex e os Fluxos do Salesforce são metadados que definem sua lógica de negócios e devem ser controlados e gerenciados com controle de versão.
No contexto do gerenciamento de automações acionadas por registro, um pipeline DevOps moderno oferece benefícios essenciais.
- **Verificações de qualidade automatizadas:** Ferramentas como o [Salesforce Code Analyzer](https://developer.salesforce.com/docs/platform/salesforce-code-analyzer/overview) podem ser configuradas para ser executadas automaticamente em seu pipeline. A análise estática pode detectar padrões problemáticos em ambas as ferramentas de automação antes de serem promovidas, sinalizando problemas como elementos de `Get Records` ineficientes dentro de um loop de Fluxo ou consultas de `SOQL` dentro de um loop do Apex, que são causas comuns de degradação do desempenho.
- **Prevenção de regressão:** Conforme sua densidade de automação aumenta, uma mudança para um Fluxo ou classe do Apex pode ter consequências indesejadas para outras automações no mesmo objeto. Uma estratégia de teste DevOps robusta, em que os testes automatizados do Apex são executados em relação a qualquer alteração proposta, é a maneira mais confiável de garantir que uma nova versão do Fluxo não quebre a lógica do Apex existente (e vice-versa).
- **Colaboração e visibilidade:** O controle de origem é a "única fonte da verdade". Permite que administradores e desenvolvedores trabalhem em automação para o mesmo objeto em paralelo. Ele também fornece uma trilha de auditoria inestimável: quando um processo de produção é interrompido, você pode ver instantaneamente _quem_ mudou a automação, _quando_ mudou e — através de mensagens de compromisso — _por que_ mudou.
Para equipes com uma combinação de administradores e desenvolvedores, o [DevOps Center](https://help.salesforce.com/s/articleView?id=platform.devops_center_overview.htm&type=5) fornece uma interface unificada para ajudar a organizar todas essas etapas, tornando um processo de desenvolvimento escalonável e baseado em controle de código-fonte acessível a todos na equipe.
Essa disciplina combinada de documentação e DevOps garante a integridade e a manutenção de longo prazo da sua organização, o que beneficiará todos os arquitetos e administradores que o seguem.
## Melhores práticas relacionadas
O guia de decisão acima é melhor usado antes de planejar sua implementação. Ele tem como objetivo ajudá-lo a escolher o melhor produto para seus casos de uso. Após a seleção do produto, é importante entender as práticas recomendadas existentes para sua implementação.
### Explorar o padrão híbrido: Apex invocável para lógica complexa no fluxo
O princípio _Uma ferramenta por objeto_ é crucial para gerenciar a automação de alta densidade, mas não o interprete como uma escolha binária entre uma pilha puramente declarativa ou puramente programática. Um padrão arquitetônico mais eficaz e mantido aproveita um modelo híbrido: posicione o Fluxo acionado por registro como a camada de orquestração, encapsulando operações de alta complexidade no Apex invocável.
#### A Camada de orquestração: Fluxo
O Fluxo acionado por registro serve como a camada de orquestração para o processo de negócios. Ele é o proprietário dos critérios de entrada e do contexto de execução (o _o que_ e _quando_). Ao reter a lógica de decisão e o roteamento nessa camada, a topologia de processo da arquitetura permanece transparente e gerenciável por meio do Explorador do acionador de fluxo, impedindo que a lógica de negócios crítica seja ocultada no código.
#### O componente complexo: Apex invocável
Um exemplo comum de um componente complexo é a implementação de cálculos de Acordo de nível de serviço (SLA) para registros de Caso. Como o objeto BusinessHours e sua lógica relacionada, essenciais para cálculos precisos que excluem horas de trabalho e feriados, não estão acessíveis nativamente no Fluxo, uma classe do Apex dedicada é usada. Essa classe, muitas vezes chamada de algo como `ServiceLevelAgreementCalculator`, é projetada com um único método estático, anotado com `@InvocableMethod`, para calcular o horário comercial decorrido, determinar se o SLA é "Dentro da meta" ou "Fechado" e retornar uma saída estruturada. Essa abordagem encapsula a lógica complexa e de alto desempenho no Apex, ao mesmo tempo que permite que ela seja executada e integrada na camada de orquestração declarativa de um fluxo acionado por registro.
Depois que a classe `ServiceLevelAgreementCalculator` do Apex for definida, ela estará disponível para uso em um fluxo acionado por registro:
Esse padrão demonstra uma separação rígida das preocupações. A camada declarativa é usada para gerenciar o ciclo de vida da transação e a orquestração enquanto o código é usado para execução de alta complexidade. Ao tratar o código como um utilitário funcional em vez da base, equilibramos o desempenho e a capacidade de manutenção.
#### Principais ganhos com o padrão híbrido
**Modularidade**: A decisão afasta-se da singularidade de usar o Apex ou o Fluxo para todo o processo. Em vez disso, a arquitetura encapsula a lógica complexa em unidades separadas, seguras em massa e testáveis de modo independente. Essas unidades funcionam como componentes reutilizáveis consumidos pela camada declarativa, garantindo as escalas de automação sem complicar o design arquitetônico.
**Reusabilidade**: A lógica é desacoplada do evento de acionador. Uma unidade de código bem projetada (como uma `InvocableMethod`) é escrita uma vez, mas aproveitada em vários pontos de entrada: Fluxos acionados por registro, fluxos de tela ou integrações externas. Essa reutilização de código elimina o desenvolvimento redundante.
**Manutenção**: A lógica de fluxo de processo permanece visível e gerenciável no Fluxo declarativo. Essa centralização reduz drasticamente a sobrecarga de depuração e garante que a ordem de execução do sistema seja determinista e transparente.
#### Limitações e compensações do padrão híbrido
Embora o modelo híbrido de usar o Apex invocável do fluxo seja poderoso, não é uma abordagem unidimensional. Os arquitetos devem estar cientes das limitações e compensações específicas antes de se comprometerem com uma solução híbrida.
- **Nenhum suporte antes de salvar**: Esta é a limitação mais crítica. Ações invocáveis estão disponíveis apenas no contexto após salvar (fluxos para ações e registros relacionados). Eles não podem ser usados no contexto de alto desempenho antes de salvar (fluxos para atualizações de campo rápido). Portanto, esse padrão não pode ser usado para delegar atualizações de campo do mesmo registro. Faça esse trabalho de alto desempenho usando elementos de Fluxo nativos em um fluxo antes de salvar ou em um acionador do Apex antes do contexto.
- **Sem suporte após a exclusão cancelada:** Atualmente, o Fluxo acionado por registro não oferece suporte ao contexto após a exclusão cancelada. Se um objeto do Salesforce tiver um requisito de negócio para executar a automação quando um registro for restaurado da lixeira, um acionador do Apex será a única solução.
- ** Sobrecarga de desempenho em cenários de alto volume:** A transição do tempo de execução do Fluxo para o tempo de execução do Apex não é uma operação de custo zero. Embora geralmente seja rápido, o ato de cair em uma Ação invocável do tempo de execução do Fluxo não é tão rápido computacionalmente quanto a execução nativa que permanece inteiramente dentro de um acionador do Apex. Para a maioria das automações de média densidade, essa sobrecarga é uma compensação insignificante e útil para a maior acessibilidade. No entanto, para cenários de alto desempenho e alto volume, uma estrutura somente do Apex terá uma vantagem de velocidade de computação bruta.
### Estratégias para automação legada
Embora a heurística de densidade de automação forneça orientação definitiva para uma arquitetura de greenfield mais recente, a realidade dos ambientes corporativos do Salesforce costuma ser mais detalhada. Em organizações maduras, é comum encontrar fluxos acionados por registro e acionadores do Apex que operam no mesmo objeto do Salesforce. Este cenário é diferente do padrão híbrido explicado anteriormente: aqui, os fluxos e acionadores do Apex não estão acoplados nem projetados para trabalharem juntos.
Essa coexistência geralmente é resultado de funcionalidades de plataforma em evolução ou débito técnico legado. Embora esse seja um estado operacional tolerado, os arquitetos devem tratá-lo como uma compensação calculada em vez de um estado final.
A orquestração fragmentada gera uma sobrecarga significativa de governança e manutenção, tornando as atividades de desenvolvimento, teste e tratamento de incidentes desagrupadas e complicadas. Isso leva a um maior Tempo para resolução (TTR) e complexidade operacional.
- Para novos objetos do Salesforce, siga o princípio de densidade de automação como o guia principal.
- Para Objetos do Salesforce existentes com uma pegada híbrida e acionador Apex duplo e pontos de entrada de fluxo acionados por registro, avalie a densidade e, em seguida, arquite para o refator para um estado híbrido mantido.
- Para baixa densidade, o Apex refator aciona fluxos acionados por registro e especifica a ordem de execução, levando-os a um único ponto de entrada de automação.
- Para densidade média, o complexo do refator faz megafluxos em um subconjunto de fluxos com a ordem de execução certa. Introduza acionadores do Apex apenas quando absolutamente necessário, por exemplo, para dar suporte após a exclusão de contexto cancelada.
- Para alta densidade, implemente acionadores do Apex.
### Usando uma estrutura de metadados para acionadores do Apex
Conforme os processos de negócios de uma organização na Salesforce Platform amadurecem, o volume e a complexidade da automação acionada por registro aumentam inevitavelmente. Uma prática recomendada fundamental é manter _um acionador do Apex por objeto do Salesforce_. Essa regra é crítica porque a plataforma não garante a ordem de execução de vários acionadores no mesmo objeto para o mesmo evento. Essa limitação pode levar a comportamentos não deterministas, condições de corrida e problemas de depuração difíceis.
No entanto, aderir ao princípio de _um acionador_ introduz um desafio arquitetônico: como gerenciar e orquestrar toda a lógica de negócios invocada desse ponto de entrada único de uma maneira mantida e escalonável.
#### As limitações dos manipuladores do acionador clássico
A primeira evolução dessa arquitetura foi o padrão do Manipulador de acionador clássico. Nesta abordagem, o acionador Apex único delega toda a sua lógica a uma classe de manipulador correspondente (por exemplo, `OpportunityTriggerHandler`). Esse método separa a lógica do arquivo de acionador e fornece aos desenvolvedores controle determinístico sobre a ordem de execução dentro dos métodos da classe manipuladora (por exemplo, `afterInsert()`).
Embora seja uma melhoria, esse padrão geralmente leva a classes de manipulador monolíticas. Ao longo do tempo, à medida que mais requisitos de negócios são adicionados, a classe se torna grande, difícil de gerenciar e difícil de testar em isolamento. A ordem de execução de todos os processos individuais é codificada em um único método, tornando a classe propensas a conflitos de mesclagem, aumentando dramaticamente a sobrecarga de governança e manutenção em um ambiente corporativo grande.
#### A solução: Uma estrutura do acionador conduzida por metadados
Para resolver os problemas centrais da modularidade e da orquestração, os arquitetos mudam para uma **Quadro do acionador conduzido por metadados**. Este é um salto arquitetônico significativo que separa a própria lógica de automação da configuração de _como_ e _quando_ ela é executada.
Essa estrutura é baseada em três principais vantagens:
- **Particionamento:** Em vez de uma única classe de manipulador, a lógica de negócios principal é dividida em classes do Apex pequenas e atômicas (por exemplo, uma classe de `RecalculateAccountValues` ou uma classe de `NotifySalesLeads`), com cada classe aderindo ao _Princípio de Responsabilidade Única_. Essa modularidade facilita o teste, a depuração e a compreensão da lógica isoladamente.
- **Ordem e coreografia:** A ordem de execução não é mais codificada no Apex. Em vez disso, é definido declarativamente por registros de configuração, geralmente armazenados em um tipo de metadados personalizado (por exemplo, `TriggerAction__mdt`). Isso permite que os administradores reordene, adicione ou remova ações de automação simplesmente modificando um registro de metadados, o que não requer uma implantação ou alteração de código.
- **Funcionalidade de bypass:** A estrutura fornece uma funcionalidade de desvio granular padronizada. Cada ação de automação pode ser configurada por meio de seu registro de metadados para ser desativada globalmente ou ignorada para usuários administrativos específicos referenciando uma permissão personalizada.
O acionador Apex único para o objeto então serve apenas como um supervisor dinâmico. Ele não contém lógica de negócios, mas instancia uma classe central de `MetadataTriggerHandler`. Esse manipulador consulta os registros de metadados personalizados para determinar dinamicamente a sequência de execução e invocar as classes atômicas Apex corretas na ordem prescrita. A automação é unificada sob uma única camada transparente e governável.
### Removendo operações caras na transação
Uma vantagem importante do uso do Apex em uma estrutura robusta é a capacidade de gerenciar o estado transacional e otimizar o desempenho eliminando o trabalho redundante. Conforme a lógica se acumula, é comum que diferentes automações no pedido de salvamento executem de modo independente as mesmas operações caras, consumindo limites valiosos do regulador e aumentando o tempo de operação de DML.
A estrutura é arquitetada para lidar com isso com duas estratégias principais:
- **Gerenciamento de estado compartilhado:** No escopo de uma única transação do Apex, propriedades estáticas e variáveis são aproveitadas para armazenar dados em cache. Isso garante que uma operação cara, como uma consulta de `SOQL` para uma configuração de configuração, seja executada apenas uma vez, mesmo que a lógica de automação seja invocada várias vezes em diferentes registros ou fases do acionador. O consumo dos limites transacionais é significativamente reduzido.
- **Utilização de cache da plataforma:** Para ir além do simples armazenamento em cache dentro da transação, use o cache da plataforma para evitar consultar todo o banco de dados para determinados dados. Esse cache gerenciado na memória é ideal para recuperar dados que não sejam primitivos, sejam lidos com frequência na base de códigos e sejam imutáveis ao longo de uma transação (por exemplo, perfis, papéis, horário comercial). Usando a interface de `Cache.CacheBuilder`, o sistema verifica o cache primeiro e realiza a consulta de banco de dados apenas se os dados não estiverem presentes, maximizando o desempenho e a escalabilidade.
### Usar antes de salvar para atualizações de mesmo registro
Sempre use uma atualização antes de salvar quando sua automação precisar apenas alterar os valores de campo no registro que inicia a transação. Isso se aplica tanto a atualizações de campo rápido no Fluxo (que são executadas antes de salvar) quanto à lógica antes do contexto nos Acionadores do Apex (antes da inserção, antes da atualização).
Esse padrão tem desempenho, independentemente da ferramenta usada, pois evita uma segunda operação DML e um ciclo de salvamento recursivo. As alterações são feitas no registro na memória _antes_ de ele ser vinculado ao banco de dados e são salvas como parte da transação original. A sobrecarga de um segundo salvamento, que, caso contrário, reexecutaria todo o pedido de salvamento e acionaria toda a automação novamente, é eliminada.
### Evitando recursão não controlada
A recursão não controlada é uma armadilha comum em acionadores após a atualização, em que a lógica de um acionador realiza uma atualização de DML que, por sua vez, faz o mesmo acionador ser disparado novamente. Isso cria um loop infinito que termina com uma exceção de limite do regulador. Embora sinalizadores booleanos estáticos ou coleções de IDs de registro processados tenham sido usados historicamente para evitar essa recursão, um padrão mais preciso e robusto é criar a lógica por meio da comparação de valores de campo entre as versões novas e antigas do próprio registro.
Execute a lógica apenas se um campo específico de interesse tiver realmente mudado. Isso impede que o acionador execute sua lógica em operações de DML subsequentes na mesma transação em que os dados críticos permanecem inalterados.
#### Controlar a recursão no fluxo acionado por registro
Em um fluxo acionado por registro, evite a recursão não controlada definindo o fluxo para ser executado apenas quando o registro for atualizado para atender aos requisitos de condição:
Se você optar por usar uma fórmula de critérios de entrada em seu fluxo, poderá evitar a recursão de escape comparando a variável global `$Record` (que representa os novos valores) com a variável global `$RecordPrior` (que representa os valores originais antes do salvamento). Por exemplo, para garantir que um fluxo seja executado apenas se o campo Valor em uma oportunidade tiver sido alterado, use isto nos critérios de entrada:
```
$Record.Amount != $Record__Prior.Amount
```
#### Controlando a recursão no Apex
Compare os valores de campo da nova versão do registro, `Trigger.new`, com os valores de campo da versão antiga do registro, `Trigger.oldMap`, para ver se a alteração específica que você está procurando ocorreu. Essa abordagem garante que a automação seja idempotente e seja executada apenas quando necessário, tornando o sistema mais eficiente e evitando loops recursivos catastróficos.
### Ignorar automação
Uma organização do Salesforce bem arquitetada requer um mecanismo consistente e confiável para contornar a automação. Esse não é um recurso opcional, mas um requisito operacional essencial para manter a integridade dos dados e habilitar tarefas administrativas.
Uma estrutura de desvio é essencial para alguns cenários:
- Ao carregar grandes volumes de dados, acionar acionadores para cada registro pode desacelerar drasticamente o processo, causar exceções de limite e criar registros relacionados e notificações incorretos. Um desvio permite que os dados sejam inseridos de maneira limpa e eficiente.
- Um usuário de integração pode precisar sincronizar dados de um sistema externo de registro. A automação que normalmente é acionada para uma alteração iniciada pelo usuário (por exemplo, enviar um email, criar uma tarefa) pode ser indesejável ou redundante quando a alteração se origina de outro sistema.
- Os administradores ou a equipe de suporte podem precisar realizar atualizações corretivas em registros. Um mecanismo de ignorar permite que eles façam essas alterações sem acionar a automação de negócios padrão, o que pode ter consequências indesejadas.
**Permissões personalizadas**: O padrão moderno e escalonável para implementar a lógica de desvio é permissões personalizadas. Esses métodos são superiores aos métodos mais antigos por diversos motivos:
- **Flexibilidade:** As permissões personalizadas podem ser atribuídas aos usuários por meio de conjuntos de permissões. Essa prática está alinhada ao moderno modelo de segurança e acesso do Salesforce, permitindo uma atribuição granular e flexível. Um desvio pode ser concedido a um usuário específico ou mesmo temporariamente com uma data/hora de expiração específica.
- **Manutenção:** O uso de permissões personalizadas evita que perfis de codificação permanente ou usuários entrem na lógica de automação. Se o papel de um usuário mudar ou um novo perfil precisar ignorar o acesso, a alteração será uma simples atribuição de Conjunto de permissões, não uma modificação de código ou fluxo que exija uma implantação.
- **Escalabilidade:** As permissões personalizadas fornecem uma estrutura dimensionável para gerenciar exceções em uma base de usuários complexa. Eles podem ser atribuídos a usuários por meio de conjuntos de permissões, grupos de conjuntos de permissões ou perfis. Sua associação a um conjunto de permissões ou perfil também é representável nos metadados de origem.
**Padrões de implementação**: Aplique um padrão de desvio consistente a todas as automações acionadas por registro na organização.
**Pular um fluxo acionado por registro**: A maneira mais eficiente de ignorar um fluxo é impedi-lo de ser executado. Isso é feito adicionando uma condição aos critérios de entrada do fluxo.
- No elemento Iniciar do fluxo acionado por registro, defina Requisitos da condição como Fórmula avaliada como verdadeira.
- No construtor de fórmula, incorpore uma verificação para a permissão personalizada usando a variável global `$Permission`. Combine a verificação com seus critérios de entrada existentes.
- Padrão de fórmula:
```
( ) && NOT($Permission.Bypass_This_Flow)
```
- Esse padrão garante que o fluxo seja executado somente se o usuário _não_ tiver a permissão personalizada especificada atribuída. Essa verificação é realizada antes mesmo da criação da entrevista de fluxo, tornando-a a abordagem com melhor desempenho.
**Excluindo uma estrutura de acionador do Apex**: No Apex, integre a lógica de desvio diretamente na estrutura de acionador orientada por metadados, permitindo um controle granular.
- O tipo de metadados personalizados `TriggerAction__mdt` deve incluir um campo de texto, por exemplo, `BypassPermission__c`.
- Na classe `MetadataTriggerHandler`, antes de executar uma ação dinamicamente, o código deve ler o valor desse campo.
- Se o campo for preenchido, o manipulador usará o método `FeatureManagement.checkPermission()` para determinar se o usuário em execução atual tem a permissão personalizada especificada.
- Se `checkPermission()` retornar verdadeiro, o manipulador ignora essa ação específica e avança para a próxima na sequência.
- Esse padrão é poderoso porque permite tanto um bypass global (se todos os registros de `TriggerAction__mdt` referenciarem a mesma permissão) quanto um bypass granular por ação (se diferentes registros referenciarem permissões diferentes ou se alguns não tiverem permissão de bypass).
### Mega-fluxos vs. Vários fluxos
É um antipadrão consolidar toda a automação de um objeto em um único megafluxo maciço. Consolidar em um fluxo versus dividir a lógica em vários fluxos bem condicionados não tem um impacto significativo no desempenho. Os ganhos de desempenho mais significativos vêm de:
- Usar fluxos antes de salvar para atualizações de campo do mesmo registro.
- Escrever condições de entrada precisas para garantir que os fluxos sejam excluídos da execução em alterações que não afetam seu caso de uso específico.
O [Flow Trigger Explorer](https://trailhead.salesforce.com/content/learn/modules/record-triggered-flows/meet-flow-trigger-explorer) permite atribuir um valor de ordem a cada fluxo em um objeto, garantindo uma ordem de execução sequencial.
## Recursos
| Apex | Fluxo | Operações |
|---|---|---|
Agora, divida esse diagrama e comece a criar as peças.
## Agendamento com fluxo agendado
O Fluxo agendado oferece várias vantagens como mecanismo de agendamento:
- Fluxos agendados podem ser empacotados e implementados como metadados. Isso não se aplica a trabalhos agendados por meio do Apex (ou pela página Trabalhos agendados).
- O elemento Aguardar é crítico para estruturas que exigem chamadas. Ao usá-lo no Fluxo, as chamadas não são necessárias na parte Invocável da estrutura.
- A granularidade do agendamento atende aos requisitos: o intervalo mínimo para Fluxos agendados é diário. Se você precisar de uma frequência maior (por exemplo, por hora), reconsidere Fluxo agendado para esse requisito.
Outra consideração ao configurar o Fluxo agendado é o encaminhamento de ambiente. Antes de invocar a ação do Apex, adicione um elemento Decisão que avalie a variável `{!$Api.Enterprise_Server_URL_100}`. Isso garante que o trabalho seja executado apenas nos ambientes pretendidos, como UAT e Produção. Esse padrão é importante porque os sandboxes são atualizados com frequência ou recém-criados durante o SDLC, e sem uma verificação de ambiente explícita, um Fluxo agendado pode ser executado inadvertidamente em ambientes em que a estrutura não deve ser executada. Usar o operador `contains` no elemento Decisão torna a configuração resiliente a futuras criações de sandbox ou alterações de URL.
Por fim, considere como a estrutura deve capturar falhas. Sempre adicione um caminho de falha quando o Fluxo chamar qualquer Ação; por exemplo, você pode encaminhar falhas à ação "Adicionar entrada de registro" do [Nebula Logger](https://www.nebulalogger.com/). Como o Nebula Logger grava registros em objetos personalizados, os clientes devem estar cientes de que os dados de registro consomem o armazenamento da organização. Por padrão, os registros são armazenados por 14 dias em uma organização e, em seguida, são limpos. Esse período de retenção é configurável. O Nebula Logger também usa os Eventos da plataforma para publicar registros, de modo que as entradas do registro são salvas independentemente da transação principal de processamento de dados – isso garante que as falhas sejam capturadas mesmo que a ação principal do Fluxo ou do Apex seja revertida. Os clientes devem avaliar os requisitos de retenção e volume de registros esperados ao considerar a adição de uma estrutura de registro.
Esta é a aparência do Fluxo:
Vamos passar para as primeiras partes do Apex code com o requisito de agendamento agora atendido.
## Criação de uma interface de etapa
Defina uma interface de `Step`:
```java
public interface Step {
void execute();
void finalize();
String getName();
Boolean shouldRestart();
}
```
Para este artigo, a interface de `step` é mostrada como uma classe externa para maior clareza. A estrutura em si é flexível – as equipes podem organizar a interface e suas implementações usando qualquer padrão de empacotamento do Apex que preferem, desde que todas as classes de Etapa façam referência à mesma interface.
Há alguns aspectos a serem considerados sobre os métodos definidos em nossa interface:
- `execute`, embora sem argumento no momento, melhora quando passamos uma classe de `State` (ou interface) para orquestrar dados entre etapas quando a ordem importa.
- Os `getName` podem retornar um valor de `System.Type` em vez de um `String`. A meta é dar à camada de orquestração uma maneira de registrar nomes de etapa sem expor outras propriedades.
Esta é a primeira implementação concreta para mostrar como essas peças se encaixam. Com uma exceção, recomendamos usar o Apex enfileirável para implementar processamento assíncrono no Apex; o Apex em lote normalmente não é necessário (e os métodos de `@future` são desencorajados). O Apex enfileirável é iniciado rapidamente e, com os Cursores do Apex, tem muitas vantagens em relação ao Apex em lote.
### Uma implementação semelhante a cursor do Apex
Os [Cursores do Apex](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_cursors.htm) oferecem uma alternativa moderna ao modelo Apex em lote tradicional. De modo semelhante ao processamento em lote, uma implementação de cursor pode buscar registros em blocos (até 2.000 por lote). No entanto, os cursores permitem várias busca em uma única transação, permitindo uma taxa de transferência significativamente maior para operações de grande volume.
Ao adotar cursores como parte dessa estrutura, as equipes devem estar cientes das limitações atuais de teste e simulação. Como o comportamento do cursor em testes pode ser diferente do comportamento de produção, é importante projetar estratégias de teste que evitem depender de elementos internos do cursor e validar a lógica de orquestração nos limites. Conforme a plataforma evolui, essas áreas continuarão melhorando, mas a orientação principal permanece: Os cursores proporcionam um desempenho maior e uma sobrecarga de orquestração reduzida em comparação ao Apex em lote para muitos casos de uso.
Para definir um limite claro entre o cursor fornecido pelo sistema e seu próprio código, recomendamos criar uma representação semelhante ao cursor ao implementar a interface de `Step`. Considere este código:
```java
public inherited sharing abstract class CursorStep implements Step {
private static final Integer MAX_CHUNK_SIZE = 2000;
protected Cursor cursor;
private Integer chunkSize = System.Limits.getLimitDMLRows();
private Integer position = 0;
protected abstract Cursor getCursor();
protected abstract void innerExecute(List