Apex Academy
Módulo 9·01·25 min

Por qué existe el asíncrono

Hay trabajo que no cabe en el guardado del usuario: demasiadas filas, una llamada a otro sistema, un proceso nocturno. El código asíncrono se ejecuta más tarde, en su propia transacción y con límites más amplios.

En Admin esEl camino «Run Asynchronously» de un flow

✓ En esta sub-lección

  1. 01Explicar qué significa que un código sea asíncrono y cuándo hace falta.
  2. 02Comparar los límites síncronos y asíncronos.
  3. 03Saber en qué contexto se está ejecutando tu código.

La nutria: ¿Te acuerdas? · Repaso del Módulo 8

El importador del Módulo 8 revienta con una LimitException a mitad de la noche. ¿La puede capturar un catch?

El importador del Módulo 8 aguanta 300 filas. Pero el ERP de Northwind acaba de anunciar que la migración del año pasado entra este mes: 300.000 renovaciones. Ninguna bulkificación hace caber eso en una sola transacción. La salida no es hacer el código más rápido: es hacerlo en otro momento.

Síncrono y asíncrono

Todo lo que has escrito hasta ahora era síncrono: pasa mientras alguien espera, dentro del mismo guardado. El código se deja en una y Salesforce lo ejecuta cuando tiene recursos libres, normalmente segundos después. Corre en su propia transacción, con su propio presupuesto, y el usuario no espera por él.

EL USUARIO

pulsa Guardar

LA COLA DE APEX

—

consultas por transacción

100

CPU por transacción

10 s

Paso 1 de 4

Todo va dentro del guardado. Pulsa Reproducir.

Guarda una renovación en los dos modos y mira quién espera y cuánto presupuesto tiene cada transacción.

La nutria: Tu camino asíncrono de siempre

Yo lo usaba sin llamarlo así: en un flow desencadenado por registro, el camino «Run Asynchronously» se ejecuta después del guardado, en su propia transacción, y es el único sitio donde el flow puede llamar a un sistema externo. Apex asíncrono es la misma idea, con cuatro herramientas distintas según el trabajo.

Por qué lo necesitarás

SituaciónPor qué no cabe en el guardado
Llamar a otro sistema (el ERP)Un trigger no puede esperar a una respuesta externa: Salesforce no permite callouts en ese momento.
Procesar cientos de miles de filasNingún presupuesto de una transacción alcanza: hay que trocearlo.
Un proceso cada nocheNadie está guardando nada a las 2:00: tiene que arrancar solo.
Un cálculo pesado tras guardarEl usuario no debería esperar diez segundos para ver su registro guardado.

Más presupuesto, pero no infinito

Límite por transacciónSíncronoAsíncrono
Consultas SOQL100200
Tiempo de CPU10 s60 s
Memoria (heap)6 MB12 MB
Instrucciones DML150150

Fíjate en la última fila: no todo sube. El asíncrono no te regala una transacción enorme; te regala muchas transacciones, cada una con su presupuesto. Por eso el Batch de la lección 4 no procesa 300.000 filas de golpe, sino en tandas de 200. Y tu código puede preguntar en cuál está: Limits.getLimitQueries() devuelve 100 o 200 según el contexto, y System.isBatch(), System.isFuture()… dicen quién lo está ejecutando.

La nutria: ¿Y por qué no un Flow? Aquí Flow también tiene su camino

Con franqueza: para «haz esto después del guardado», el camino asíncrono de un flow basta, y para «cada noche», un flow programado. Donde no llega es a la escala de este módulo. Un flow programado tiene un máximo diario de 250.000 interviews (o 200 por licencia de usuario, si es mayor): las 300.000 renovaciones del ERP no caben en un día. Y no hay forma de encadenar trabajos con estado, ni de elegir el tamaño de cada tanda. Eso es lo que te dan las cuatro herramientas de Apex.