Ao executar um processo no Salesforce, a primeira pergunta que você deve fazer é se executá-lo de forma síncrona ou assíncrona. Se a tarefa puder ser adiada e não exigir um resultado imediato, é sempre benéfico aproveitar os processos assíncronos do Salesforce, pois oferecem vantagens significativas para sua arquitetura técnica.
O que é Processamento Assíncrono?
Os processos assíncronos são executados em sua própria thread, permitindo que a tarefa seja concluída sem manter o usuário esperando. Aqui estão os principais benefícios:
1. Melhoria na Experiência do Usuário e Desempenho
Como os processos assíncronos são executados em segundo plano, os usuários não precisam esperar sua conclusão. Isso permite que os usuários continuem seu trabalho sem interrupções, ao mesmo tempo que melhora os tempos de carregamento das páginas e o desempenho geral do sistema.
2. Limites Mais Altos
O Salesforce impõe limites rigorosos às transações síncronas, como o número de consultas ou operações DML por transação. O processamento assíncrono fornece limites adicionais de execução, dando mais espaço para escalar suas operações.
3. Escalabilidade
Ao transferir tarefas complexas ou intensivas em recursos para serem executadas em segundo plano, o processamento assíncrono ajuda sua empresa a escalar de forma eficiente sem comprometer o desempenho do sistema.
Aqui estão as diversas ferramentas que o Salesforce fornece para processamento assíncrono.
Considerações Principais
Até agora, exploramos o processamento assíncrono, seus benefícios e as diversas ferramentas que o Salesforce oferece para essas tarefas. No entanto, existem vários fatores importantes a serem considerados antes de escolher o processamento assíncrono para as necessidades de negócios.
1. O Processamento Assíncrono Não Possui SLA
Tenha em mente que os processos assíncronos não têm um Acordo de Nível de Serviço (SLA) garantido. Eles são executados em sua própria thread sempre que os recursos estão disponíveis, o que significa que não há garantia de que a tarefa será concluída dentro de um prazo específico. Portanto, é importante evitar o uso de processamento assíncrono para fluxos de negócios que são sensíveis ao tempo.
2. Escolha a Ferramenta Certa para o Trabalho
Como mencionado anteriormente, o Salesforce oferece diversas ferramentas para processamento assíncrono, cada uma projetada para diferentes casos de uso. Compreender os pontos fortes e limitações de cada ferramenta ajudará você a selecionar a mais adequada para suas necessidades específicas.
3. Torne Seu Código Bulkify
Embora o Salesforce forneça limites de execução mais altos para processos assíncronos, ainda é fundamental tornar seu código bulkify. Isso garante que seu código possa lidar eficientemente com vários registros, permanecendo dentro dos limites da plataforma e mantendo o desempenho.
4. Implementar Tratamento de Erros e Monitoramento
Como os trabalhos assíncronos são executados em segundo plano, um tratamento de erros e monitoramento robustos são essenciais. Utilize blocos try-catch
e registre os erros em objetos personalizados para facilitar o rastreamento. Além disso, implemente lógica de repetição para gerenciar falhas intermitentes, como problemas de chamadas de API, para garantir a confiabilidade de seus processos.
Aprofundamento nas Ferramentas Assíncronas
Vamos analisar mais de perto cada uma das ferramentas assíncronas no Salesforce.
Métodos Futuros
Os métodos futuros são utilizados para operações que podem ser executadas de forma independente em sua própria thread. Um caso de uso comum é a execução de chamadas de serviço web externo onde o usuário não precisa esperar a operação ser concluída.
Para definir um método futuro, basta anotar o método com a anotação @future
.
public class FutureClass {
@future
public static void myFutureMethod(list recordIds){
//código de operação de longa duração
}
}
Pontos-chave sobre métodos futuros:
- Estático. Métodos futuros devem ser estáticos.
- Tipo de retorno void. Eles só podem retornar
void
. - Tipos de dados primitivos. Métodos futuros só podem aceitar tipos de dados primitivos (por exemplo,
String
,Integer
,Id
). Eles não podem receber objetos complexos como parâmetros. - Chamadas externas. Se o método futuro precisar fazer uma chamada de serviço web, você deve incluir o atributo
callout=true
na anotação para permitir que o método realize a chamada externa.
public class FutureClass {
@future(callout = true)
public static void myFutureMethod(){
//chamada externa aqui
}
}
Apex Enfileirável
Semelhante aos métodos futuros, o Queueable Apex permite que você execute operações em sua própria thread, tornando-o ideal para tarefas de longa duração. Ele aproveita a fila de trabalhos do Apex e fornece uma abordagem mais flexível e poderosa para o processamento assíncrono em comparação com os métodos futuros.
Para implementar o Queueable Apex, sua classe deve implementar a interface Queueable
. A classe deve sempre definir um método execute
, que contém a lógica para a operação assíncrona.
public class QueueableClass implements Queueable{
public void execute(QueueableContext context){
//operação de longa duração
}
}
Você pode executar o Queueable Apex chamando System.enqueueJob()
, que adiciona o trabalho à fila e retorna um ID de trabalho. Esse ID de trabalho pode ser usado para monitorar o status do trabalho consultando o objeto AsyncApexJob
.
ID jobID = System.enqueueJob(new QueueableClass());
Pontos-chave sobre o Queueable Apex:
- Tipos de dados não primitivos. Ao contrário dos métodos futuros, você pode usar tipos de dados não primitivos como variáveis de membro em uma classe Queueable.
- Encadeamento de trabalhos. Os trabalhos Queueable podem ser encadeados, permitindo que você inicie um segundo trabalho a partir de um que já está em execução, criando uma sequência de operações assíncronas.
Batch Apex
Quando você precisa executar operações assíncronas em um grande número de registros, Batch Apex é a solução ideal. Ele divide seu grande conjunto de dados em partes menores e gerenciáveis para processamento.
Para implementar o Batch Apex, sua classe deve implementar a interface Database.Batchable
. A classe Batch Apex deve definir três métodos: start
, execute
e finish
.
1. Método Start
Este método é executado no início do trabalho em lote. Deve conter a consulta SOQL para coletar o grande conjunto de dados e retornar um QueryLocator
. O limite do governador sobre o número total de registros recuperados por uma consulta SOQL é ignorado no método start
ao usar o Batch Apex.
public Database.QueryLocator start(Database.BatchableContext bc) {}
2. Método Execute
O método execute
é chamado para cada lote de registros. Observe que a ordem em que os registros são processados não é garantida.
public void execute(Database.BatchableContext bc, list<Object>){}
3. Método Finish
O método finish
é chamado após todos os lotes de registros terem sido processados. Geralmente é usado para tarefas de pós-processamento, como enviar emails de notificação. Cada execução do trabalho em lote é considerada uma transação única, e os limites do governador são redefinidos para cada lote.
Para acionar um trabalho em lote, use o método Database.executeBatch
. Isso adiciona o trabalho em lote à fila assíncrona.
O método Database.executeBatch
recebe dois parâmetros:
- Uma instância da classe Batch Apex.
- Um parâmetro opcional de tamanho de lote, que especifica o número de registros por lote. O tamanho máximo de lote que você pode especificar é 2000.
ID batchprocessid = Database.executeBatch(new BatchApex(),2000);
Melhores Práticas ao Usar o Apex Assíncrono
Avoidar a ativação de métodos futuros ou enfileiráveis em processos de alto volume
Tenha cuidado ao ativar métodos futuros ou enfileiráveis a partir de processos que podem esgotar os limites assíncronos diários, como os acionadores Apex. Esses processos podem consumir rapidamente os recursos assíncronos disponíveis.
Otimizar o Desempenho
Garanta que o desempenho dos métodos futuros ou enfileiráveis esteja otimizado. Isso inclui:
- Otimizar consultas para reduzir o tempo de processamento.
- Minimizar a duração das chamadas de serviço da web.
- Agilizar qualquer lógica associada, como acionadores ou fluxos, para evitar gargalos.
Utilize o Batch Apex para Grandes Volumes de Dados
Para processar grandes quantidades de registros, prefira sempre o Batch Apex em relação aos métodos futuros ou enfileiráveis. O Batch Apex é projetado para lidar de forma eficiente com conjuntos massivos de dados, enquanto os métodos futuros e enfileiráveis são mais adequados para tarefas menores.
O Apex Enfileirável Oferece Maior Flexibilidade
O Apex Enfileirável oferece mais controle sobre a execução de trabalhos em comparação com os métodos futuros, como a capacidade de encadear trabalhos ou lidar de forma mais eficiente com grandes volumes de dados.
Conclusão
Em conclusão, o Apex assíncrono no Salesforce é uma ferramenta poderosa para lidar com processos demorados e intensivos em recursos, mantendo o desempenho do sistema e a experiência do usuário. Ao entender os diferentes métodos assíncronos disponíveis, como Métodos Futuros, Apex Enfileirável e Apex em Lotes, e seguir as melhores práticas, você pode projetar soluções eficientes e escaláveis que otimizam tanto o seu código quanto os recursos do sistema. Lembre-se de considerar fatores como limites de governança, otimização de desempenho e tratamento de erros para garantir que seus trabalhos assíncronos sejam executados de forma suave e confiável.
Source:
https://dzone.com/articles/asynchronous-processing-salesforce-overview