Al ejecutar un proceso en Salesforce, la primera pregunta que debes hacer es si ejecutarlo de forma síncrona o asíncrona. Si la tarea puede ser retrasada y no requiere un resultado inmediato, siempre es beneficioso aprovechar los procesos asíncronos de Salesforce, ya que ofrecen ventajas significativas a tu arquitectura técnica.
¿Qué es el Procesamiento Asíncrono?
Los procesos asíncronos se ejecutan en su propio hilo, permitiendo que la tarea se complete sin mantener al usuario esperando. Aquí están los beneficios clave:
1. Mejora de la Experiencia del Usuario y Rendimiento
Dado que los procesos asíncronos se ejecutan en segundo plano, los usuarios no tienen que esperar a que terminen. Esto les permite a los usuarios continuar su trabajo sin interrupciones, al mismo tiempo que mejora los tiempos de carga de página y el rendimiento general del sistema.
2. Límites más Altos
Salesforce impone límites estrictos en transacciones síncronas, como el número de consultas u operaciones DML por transacción. El procesamiento asíncrono proporciona límites de ejecución adicionales, dándote más margen para escalar tus operaciones.
3. Escalabilidad
Al descargar tareas complejas o intensivas en recursos para ejecutarse en segundo plano, el procesamiento asíncrono ayuda a que tu negocio escale eficientemente sin comprometer el rendimiento del sistema.
Aquí están las diversas herramientas Salesforce que proporciona para el procesamiento asincrónico.
Consideraciones Clave
Hasta ahora, hemos explorado el procesamiento asincrónico, sus beneficios y las diversas herramientas que Salesforce proporciona para estas tareas. Sin embargo, hay varios factores importantes a considerar antes de elegir el procesamiento asincrónico para las necesidades de su negocio.
1. El Procesamiento Asincrónico No Tiene SLA
Recuerde que los procesos asincrónicos no tienen un Acuerdo de Nivel de Servicio (SLA) garantizado. Se ejecutan en su propio hilo siempre que haya recursos disponibles, lo que significa que no hay garantía de que la tarea se complete dentro de un plazo específico. Por lo tanto, es importante evitar usar el procesamiento asincrónico para flujos de trabajo que son sensibles al tiempo.
2. Elija la Herramienta Adecuada para el Trabajo
Como se mencionó anteriormente, Salesforce ofrece varias herramientas para el procesamiento asincrónico, cada una diseñada para diferentes casos de uso. Comprender las fortalezas y limitaciones de cada herramienta le ayudará a seleccionar la más adecuada para sus necesidades específicas.
3. Bulkifique Su Código
Aunque Salesforce proporciona límites de ejecución más altos para los procesos asincrónicos, sigue siendo crítico bulkificar sus operaciones. Esto asegura que su código pueda manejar eficientemente múltiples registros, manteniéndose dentro de los límites de la plataforma y manteniendo el rendimiento.
4. Implementación de Manejo de Errores y Monitoreo
Dado que los trabajos asíncronos se ejecutan en segundo plano, es esencial contar con un sólido manejo de errores y monitoreo. Utiliza bloques try-catch
y registra los errores en objetos personalizados para un seguimiento más fácil. Además, implementa lógica de reintento para gestionar fallas intermitentes, como problemas de llamadas a API, asegurando la fiabilidad de tus procesos.
Profundización en Herramientas Asíncronas
Vamos a analizar más de cerca cada una de las herramientas asíncronas en Salesforce.
Métodos Futuros
Los métodos futuros se utilizan para operaciones que pueden ejecutarse de forma independiente en su propio hilo. Un caso de uso común es ejecutar llamadas a servicios web externos donde el usuario no necesita esperar a que la operación se complete.
Para definir un método futuro, simplemente anota el método con la anotación @future
.
public class FutureClass {
@future
public static void myFutureMethod(list recordIds){
//código de operación de larga duración
}
}
Puntos clave sobre los métodos futuros:
- Estático. Los métodos futuros deben ser estáticos.
- Tipo de retorno void. Solo pueden devolver
void
. - Tipos de datos primitivos. Los métodos futuros solo pueden aceptar tipos de datos primitivos (por ejemplo,
String
,Integer
,Id
). No pueden recibir objetos complejos como parámetros. - Llamadas. Si el método futuro necesita hacer una llamada a un servicio web, debes incluir el atributo
callout=true
en la anotación para permitir que el método realice la llamada.
public class FutureClass {
@future(callout = true)
public static void myFutureMethod(){
//llamada aquí
}
}
Apex en Cola
Similar a los métodos futuros, Queueable Apex te permite ejecutar operaciones en su propio hilo, lo que lo hace ideal para tareas de larga duración. Aprovecha la cola de trabajos de Apex y proporciona un enfoque más flexible y poderoso para el procesamiento asíncrono en comparación con los métodos futuros.
Para implementar Queueable Apex, tu clase debe implementar la interfaz Queueable
. La clase siempre debe definir un método execute
, que contiene la lógica para la operación asíncrona.
public class QueueableClass implements Queueable{
public void execute(QueueableContext context){
//operación de larga duración
}
}
Puedes ejecutar Queueable Apex llamando a System.enqueueJob()
, que agrega el trabajo a la cola y devuelve un ID de trabajo. Este ID de trabajo se puede utilizar para monitorear el estado del trabajo consultando el objeto AsyncApexJob
.
ID jobID = System.enqueueJob(new QueueableClass());
Puntos clave sobre Queueable Apex:
- Tipos de datos no primitivos. A diferencia de los métodos futuros, puedes usar tipos de datos no primitivos como variables miembro en una clase Queueable.
- Encadenamiento de trabajos. Los trabajos Queueable se pueden encadenar, lo que te permite iniciar un segundo trabajo desde uno que ya se está ejecutando, creando una secuencia de operaciones asíncronas.
Batch Apex
Cuando necesitas ejecutar operaciones asíncronas en un gran número de registros, Batch Apex es la solución ideal. Divide tu conjunto de datos grande en fragmentos más pequeños y manejables para su procesamiento.
Para implementar Batch Apex, su clase debe implementar la interfaz Database.Batchable
. La clase Batch Apex debe definir tres métodos: start
, execute
y finish
.
1. Método de Inicio
Este método se ejecuta al principio del trabajo por lotes. Debe contener la consulta SOQL para recopilar el gran conjunto de datos y devolver un QueryLocator
. El límite del gobernador sobre el número total de registros recuperados por una consulta SOQL se omite en el método start
al usar Batch Apex.
public Database.QueryLocator start(Database.BatchableContext bc) {}
2. Método de Ejecución
El método execute
se llama para cada lote de registros. Tenga en cuenta que no se garantiza el orden en que se procesan los registros.
public void execute(Database.BatchableContext bc, list<Object>){}
3. Método de Finalización
El método finish
se llama después de que se hayan procesado todos los lotes de registros. Se utiliza típicamente para tareas de post-procesamiento, como enviar correos electrónicos de notificación. Cada ejecución del trabajo por lotes se considera una transacción única y los límites del gobernador se reinician para cada lote.
Para activar un trabajo por lotes, utilice el método Database.executeBatch
. Esto agrega el trabajo por lotes a la cola asíncrona.
El método Database.executeBatch
tiene dos parámetros:
- Una instancia de la clase Batch Apex.
- Un parámetro de tamaño de lote opcional, que especifica el número de registros por lote. El tamaño máximo de lote que puede especificar es 2000.
ID batchprocessid = Database.executeBatch(new BatchApex(),2000);
Mejores Prácticas al Usar Apex Asíncrono
Avoidar disparar métodos futuros o en cola en procesos de alto volumen
Sé cauteloso al disparar métodos futuros o en cola desde procesos que podrían agotar los límites asíncronos diarios, como los desencadenadores de Apex. Estos procesos pueden consumir rápidamente los recursos asíncronos disponibles.
Optimizar el rendimiento
Asegúrate de que el rendimiento de los métodos futuros o en cola esté optimizado. Esto incluye:
- Optimizar consultas para reducir el tiempo de procesamiento.
- Minimizar las duraciones de las llamadas de servicio web.
- Agilizar cualquier lógica asociada, como desencadenadores o flujos, para evitar cuellos de botella.
Usar Batch Apex para volúmenes grandes de datos
Para procesar grandes cantidades de registros, siempre es preferible Batch Apex en lugar de métodos futuros o en cola. Batch Apex está diseñado para manejar conjuntos de datos masivos de manera eficiente, mientras que los métodos futuros y en cola son más adecuados para tareas más pequeñas.
Queueable Apex ofrece mayor flexibilidad
Queueable Apex ofrece más control sobre la ejecución de trabajos en comparación con los métodos futuros, como la capacidad de encadenar trabajos o manejar volúmenes de datos más grandes de manera más eficiente.
Conclusión
En conclusión, el Apex asíncrono en Salesforce es una herramienta poderosa para manejar procesos de larga duración y con alto consumo de recursos, al mismo tiempo que se mantiene el rendimiento del sistema y la experiencia del usuario. Al comprender los diferentes métodos asíncronos disponibles, como los Métodos Futuros, Apex en Cola y Apex por Lotes, y siguiendo las mejores prácticas, puedes diseñar soluciones eficientes y escalables que optimicen tanto tu código como los recursos de tu sistema. Recuerda considerar factores como los límites de gobernador, la optimización del rendimiento y el manejo de errores para garantizar que tus trabajos asíncronos se ejecuten de manera fluida y confiable.
Source:
https://dzone.com/articles/asynchronous-processing-salesforce-overview