Ao executar um processo no Salesforce, a primeira pergunta que você deve fazer é se deve 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 eles oferecem vantagens significativas para sua arquitetura técnica.
O que é Processamento Assíncrono?
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. Melhor 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 que eles terminem. Isso permite que os usuários continuem seu trabalho ininterruptamente, enquanto também melhora os tempos de carregamento das páginas e o desempenho geral do sistema.
2. Limites Maiores
O Salesforce impõe limites rigorosos em transações síncronas, como o número de consultas ou operações DML por transação. O processamento assíncrono fornece limites de execução adicionais, dando mais margem para escalar suas operações.
3. Escalabilidade
Ao descarregar tarefas complexas ou que consomem muitos 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 várias ferramentas que Salesforce fornece para processamento assíncrono.
Considerações Chave
Até agora, exploramos o processamento assíncrono, seus benefícios e as várias ferramentas que o Salesforce oferece para essas tarefas. No entanto, existem vários fatores importantes a considerar antes de escolher o processamento assíncrono para as necessidades de sua empresa.
1. O Processamento Assíncrono Não Tem 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 trabalho que são sensíveis ao tempo.
2. Escolha a Ferramenta Certa para o Trabalho
Como mencionado anteriormente, o Salesforce oferece várias 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. Bulkifique Seu Código
Embora o Salesforce forneça limites de execução mais altos para processos assíncronos, ainda é crítico bulkificar suas operações. Isso garante que seu código possa lidar eficientemente com múltiplos registros, permanecendo dentro dos limites da plataforma e mantendo o desempenho.
4. Implementação de 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 acompanhamento. Além disso, implemente lógica de tentativas para gerenciar falhas intermitentes, como problemas de chamadas de API, para garantir a confiabilidade dos seus processos.
Profundidade 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 usados 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ços web externos, onde o usuário não precisa esperar pela conclusão da operação.
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 da operação demorada
}
}
Pontos importantes sobre os métodos futuros:
- Estático. Os métodos futuros devem ser estáticos.
- Tipo de retorno void. Eles só podem retornar
void
. - Tipos de dados primitivos. Os métodos futuros só podem aceitar tipos de dados primitivos (por exemplo,
String
,Integer
,Id
). Eles não podem aceitar objetos complexos como parâmetros. - Chamadas. 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.
public class FutureClass {
@future(callout = true)
public static void myFutureMethod(){
//chamada aqui
}
}
Apex em Filas
Similar 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 membros 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á sendo executado, 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, o Batch Apex é a solução ideal. Ele divide seu grande conjunto de dados em fragmentos 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. Ele 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. Ele é tipicamente usado para tarefas de pós-processamento, como o envio de e-mails de notificação. Cada execução do trabalho em lote é considerada uma única transação, 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
aceita 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 Apex Assíncrono
Ao Evitar Acionar Métodos Futuros ou em Fila em Processos de Alto Volume
Seja cauteloso ao acionar métodos futuros ou em fila a partir de processos que poderiam exceder os limites assíncronos diários, como os gatilhos Apex. Esses processos podem rapidamente consumir os recursos assíncronos disponíveis.
Otimizar o Desempenho
Assegure-se de que o desempenho dos métodos futuros ou em fila esteja otimizado. Isso inclui:
- Otimizar consultas para reduzir o tempo de processamento.
- Minimizar a duração das chamadas de serviço web.
- Otimizar qualquer lógica associada, como gatilhos ou fluxos, para evitar gargalos.
Utilizar o Batch Apex para Grandes Volumes de Dados
Para processar grandes quantidades de registros, sempre prefira o Batch Apex em vez de métodos futuros ou em fila. O Batch Apex é projetado para lidar eficientemente com conjuntos massivos de dados, enquanto os métodos futuros e em fila são mais adequados para tarefas menores.
O Queueable Apex Oferece Maior Flexibilidade
O Queueable Apex 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 Lote, 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 seu 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