Para las funciones con lógica de larga duración, uso intensivo de recursos o propensa a errores, utilice la invocación asíncrona. Esto mejora la capacidad de respuesta de la aplicación y gestiona de forma confiable los picos de tráfico. Cuando invoca una función de manera asíncrona, no necesita esperar una respuesta. Function Compute almacena la solicitud en una cola interna para garantizar su procesamiento. En este tema se describen los casos de uso y las funciones comunes de la invocación asíncrona.
Casos de uso
A continuación se muestran algunos ejemplos de casos de uso para la invocación asíncrona:
-
Procesamiento de audio y video
Cuando utiliza Function Compute para cargas de trabajo de audio y video, es común ejecutar tareas que consumen mucho tiempo, como la codificación, decodificación y transcodificación. Al invocar estas tareas de forma asíncrona, se ejecutan en segundo plano sin bloquear el frontend, lo cual mejora la experiencia del usuario. Si un proyecto es grande, también puede dividirlo en varias tareas para procesarlo en paralelo. Otra opción es convertir un video a múltiples formatos mediante la invocación asíncrona de varias funciones. De esta manera se reduce el tiempo total de procesamiento.
-
Procesamiento de datos ETL
En un pipeline de extracción, transformación y carga (ETL), el proceso de extraer datos de un origen, transformarlos y cargarlos en un sistema de destino suele implicar varias operaciones independientes. Por ejemplo, consultas a bases de datos, operaciones de entrada y salida de archivos o limpieza de datos. La invocación asíncrona permite ejecutar estas operaciones en paralelo, lo que reduce el tiempo de procesamiento y mejora el rendimiento del sistema. Para tareas de larga duración, como el procesamiento de grandes conjuntos de datos o transformaciones complejas, la invocación asíncrona permite ejecutarlas en segundo plano. Así se evita bloquear el frontend y se mejora la experiencia del usuario.
-
Desarrollo de aplicaciones web
Puede usar Function Compute junto con otros servicios en la nube para construir aplicaciones web rápidamente. Cuando los usuarios envían formularios, ejecutan consultas de búsqueda o cargan páginas con mucho contenido, la invocación asíncrona evita que la página se congele por esperas prolongadas de respuestas del backend. Los usuarios pueden seguir interactuando con otras partes de la página sin notar latencia. En escenarios de alta concurrencia, donde muchos usuarios acceden a la aplicación al mismo tiempo, la invocación asíncrona distribuye la carga de solicitudes y previene la sobrecarga del servicio.
Invocación diferida
Puede configurar Function Compute para desencadenar una invocación asíncrona después de un retraso específico.
Agregue el encabezado de solicitud HTTP x-fc-async-delay a su código. El valor debe estar en segundos y dentro del rango de (0, 3600). Function Compute inicia un temporizador cuando se desencadena la ejecución e invoca la función después del retraso especificado en x-fc-async-delay.
Política de reintentos
El mecanismo de invocación asíncrona incluye manejo de errores y reintentos integrados. Si un paso falla con errores, el sistema puede reprogramar la tarea sin afectar el flujo de trabajo general. Cuando una invocación de función asíncrona falla, Function Compute reintenta automáticamente la invocación.
Mecanismo de reintentos
La siguiente tabla describe la política de reintentos predeterminada para los errores más comunes.
|
Tipo de error |
Comportamiento de reintento |
Facturado |
Solución |
|
|
Se realizan hasta 3 reintentos de forma predeterminada. Ajuste la cantidad de reintentos según sus necesidades de negocio. |
Sí: se factura por invocación. Consulte Descripción general de facturación. |
Corrija el error en el código de su función. |
|
Límite de concurrencia excedido |
Se reintenta durante un máximo de 5 horas mediante retroceso exponencial. El primer reintento comienza 0.5 segundos después del fallo; los intervalos posteriores se duplican (1 s, 2 s, 4 s, 8 s, …). |
No |
Aumente su cuota de concurrencia en Quota Center. De forma predeterminada, cada cuenta de Alibaba Cloud puede ejecutar hasta 100 instancias por región. |
|
Error interno |
Sin reintentos |
No |
Póngase en contacto con el soporte técnico a través de DingTalk (ID de grupo: 64970014484). |
|
Recursos insuficientes de Function Compute |
Sin reintentos |
No |
— |
Configurar la política de reintentos
Function Compute le permite personalizar el número máximo de reintentos y el tiempo de vida máximo del mensaje.
Inicie sesión en la consola de Function Compute. En el panel de navegación izquierdo, elija .
En la barra de navegación superior, seleccione una región. En la página Functions, haga clic en la función de destino.
-
En la página de detalles de la función, haga clic en la pestaña Tasks y luego haga clic en Task Mode a la derecha de Modify. En el panel Task Mode, establezca los siguientes parámetros. Una vez completada la configuración, haga clic en Deploy.
Parámetro
Descripción
Task Mode
Especifica si se habilita Task Mode para una tarea asíncrona. Para obtener más información, consulte Asynchronous tasks.
Maximum Retries
Número máximo de reintentos para una invocación asíncrona. El valor debe ser un número entero de 0 a 8.
De forma predeterminada, Function Compute reintenta 3 veces una invocación asíncrona fallida. Puede ajustar la cantidad de reintentos según sus necesidades de negocio.
Maximum Message Lifetime
Tiempo de vida máximo de un mensaje en una cola de invocación asíncrona. El valor debe ser un número entero de 1 a 604,800. El valor predeterminado es 86,400. Unidad: segundos.
Esta duración se calcula desde el momento en que se desencadena la invocación asíncrona. Si el tiempo de vida del mensaje supera el valor configurado, el mensaje se descarta. Los mensajes descartados se registran mediante la métrica de monitoreo Asynchronous Invocation Events en CloudMonitor. Para obtener más información sobre las métricas, consulte Monitoring metrics.
Devolución de llamada de resultado
Cuando Function Compute recibe una solicitud de invocación asíncrona, la almacena y devuelve una respuesta de inmediato sin esperar a que se ejecute. Para conservar las solicitudes que se descartan tras agotar todos los reintentos, o para notificar a un servicio posterior el resultado de la invocación asíncrona, configure la función de devolución de llamada de resultado. Después de configurar un servicio de destino, Function Compute llama automáticamente al servicio correspondiente según el resultado de ejecución cuando finaliza la invocación asíncrona.
Cómo funciona
La siguiente figura muestra el flujo de trabajo de la devolución de llamada de resultado.
Casos de uso
-
Guardar eventos descartados para su procesamiento posterior
Cuando una solicitud asíncrona falla y agota todos los reintentos según la política configurada, Function Compute descarta la solicitud. Si configuró un destino para fallos, Function Compute envía automáticamente la información de contexto de la solicitud fallida a un servicio de mensajería, como ApsaraMQ for RocketMQ, para su procesamiento posterior. También puede establecer otra función como servicio de destino. En ese caso, Function Compute envía automáticamente la información de contexto de la solicitud fallida a dicha función para ejecutar su lógica personalizada de manejo de errores.
-
Notificar automáticamente los resultados de ejecución a los servicios posteriores
Tras una ejecución exitosa, si se configuró un destino para éxitos, el sistema Function Compute envía automáticamente el contexto de la solicitud al servicio de destino posterior. Por ejemplo, si configura Function Compute para descomprimir automáticamente un archivo ZIP subido a OSS y desea recibir una notificación de mensaje al finalizar, puede configurar un servicio de destino de devolución de llamada de resultado para la función correspondiente.
Servicios de destino compatibles
Si el resultado de una invocación asíncrona cumple con las condiciones configuradas, Function Compute envía el contexto y los datos de la solicitud al servicio de destino especificado. Puede configurar distintos servicios de destino para diferentes funciones, alias y versiones. Los siguientes servicios de destino son compatibles con la invocación asíncrona:
Simple Message Queue (formerly MNS)
Function Compute
EventBridge
ApsaraMQ for RocketMQ
Solo puede configurar instancias de la serie 4.0 de ApsaraMQ for RocketMQ como servicio de destino. Las instancias de la serie 5.0 no son compatibles.
Para obtener información sobre los límites de carga útil de los servicios de destino, consulte Function runtime resource limits.
La configuración de destinos de invocación asíncrona incluye lo siguiente:
-
Contenido del evento para los destinos de invocación asíncrona
Cuando Simple Message Queue (formerly MNS), Function Compute o ApsaraMQ for RocketMQ es el destino de una invocación de función asíncrona, el contenido del evento tiene el siguiente formato.
{ "timestamp": 1660120276975, "requestContext": { "requestId": "xxx", "functionArn": "acs:fc:{regionid}:{accountid}:functions/xxxx", "condition": "FunctionResourceExhausted", "approximateInvokeCount": 3 }, "requestPayload": "", "responseContext": { "statusCode": 200, "functionError": "" }, "responsePayload": "" }Tabla 1. Descripciones de los parámetros
Parámetro
Descripción
timestamp
Marca de tiempo de la invocación.
requestContext
Contexto de la solicitud.
requestContext.requestId
ID de solicitud de la invocación asíncrona.
requestContext.functionArn
Nombre de recurso de Alibaba Cloud (ARN) de la función invocada de forma asíncrona.
requestContext.condition
Código de error de la invocación.
requestContext.approximateInvokeCount
Número de veces que se ejecutó la invocación asíncrona. Un valor mayor que 1 indica que Function Compute reintentó la invocación.
requestPayload
Carga útil original de la solicitud de la función.
responseContext
Contexto de la respuesta.
responseContext.statusCode
Código de estado del sistema devuelto por la invocación de la función. Si el código de estado no es 200, ocurrió un error del sistema.
responseContext.functionError
Mensaje de error de la invocación.
responsePayload
Carga útil original devuelta por la ejecución de la función.
Cuando se usa EventBridge como destino de una invocación de función asíncrona, el evento tiene el siguiente formato. Para obtener más información, consulte Event Overview.
{ "datacontenttype": "application/json", "aliyunaccountid": "143xxxx", "data": { "requestContext": { "condition": "", "approximateInvokeCount": 1, "requestId": "0fcb7f0c-xxxx", "functionArn": "acs:fc:{regionid}:{accountid}:functions/xxxx" }, "requestPayload": "", "responsePayload": "", "responseContext": { "functionError": "", "statusCode": 200 }, "timestamp": 1660120276975 }, "subject": "acs:fc:{regionid}:{accountid}:functions/xxxx", "source": "acs:fc", "type": "fc:AsyncInvoke:succeeded", "aliyunpublishtime": "2021-01-03T09:44:31.233Asia/Shanghai", "specversion": "1.0", "aliyuneventbusname": "xxxxxxx", "id": "ecc4865xxxxxx", "time": "2021-01-03T01:44:31Z", "aliyunregionid": "cn-shanghai-vpc", "aliyunpublishaddr": "199.99.xxx.xxx" } -
Límites de carga útil
Los límites máximos de carga útil para los servicios de destino compatibles son los siguientes:
Simple Message Queue (formerly MNS): 64 KB
Function Compute: sujeto a los límites descritos en Function runtime resource limits.
EventBridge: 64 KB
ApsaraMQ for RocketMQ: 4 MB
-
Evitar bucles de invocación
Al configurar un destino para una ejecución asíncrona, evite crear un bucle de invocación. Por ejemplo, si configura la Función B como destino de las invocaciones exitosas de la Función A, y la Función A como destino de las invocaciones exitosas de la Función B. En este caso, si desencadena de forma asíncrona la Función A y se ejecuta correctamente, podría generarse un bucle de invocación de A hacia B y de regreso a A.
Configurar un servicio de destino
Inicie sesión en la consola de Function Compute. En el panel de navegación izquierdo, elija .
En la barra de navegación superior, seleccione una región. En la página Functions, haga clic en la función de destino.
-
En la página de detalles de la función, haga clic en la pestaña Tasks y luego haga clic en Edit a la derecha de Modify. En el panel Task destination, establezca los siguientes parámetros. Una vez completada la configuración, haga clic en Deploy.
-
Configurar un destino para éxitos
Establezca Invoke Other Services upon Success en Enable y luego configure el servicio de destino para las ejecuciones exitosas. Los parámetros se describen a continuación:
Parámetro
Descripción
Destination Service
Function Compute. Cuando selecciona Function Compute como servicio de destino, debe configurar los siguientes parámetros:
Function name: especifique el nombre de la función de destino.
Version or alias: especifique el alias o la versión de la función.
Simple Message Queue (formerly MNS). Cuando selecciona Simple Message Queue (formerly MNS) como servicio de destino, debe configurar los siguientes parámetros:
Destination type: seleccione un tipo de destino. Valores válidos:
Queue:
En el modelo de cola, los productores envían mensajes a una cola y los consumidores extraen mensajes de ella. Cada mensaje solo puede ser consumido por un consumidor, lo que hace que este modelo sea adecuado para la distribución de tareas y el procesamiento de cargas de trabajo.
Topic:
En el modelo de tema, un publicador envía un mensaje a un tema y SMQ lo distribuye a todas las suscripciones activas. Cada suscripción enruta los mensajes a un endpoint especificado, como una cola. Este modelo de uno a varios es adecuado para la difusión de eventos y los patrones fan-out.
Queue: seleccione el nombre de la cola de Simple Message Queue (formerly MNS). Este parámetro es obligatorio si establece Queue en Queue.
Topic: seleccione el nombre del tema de Simple Message Queue (formerly MNS). Este parámetro es obligatorio si establece Topic en Topic.
ApsaraMQ for RocketMQ. Si selecciona ApsaraMQ for RocketMQ como servicio de destino, debe configurar los siguientes parámetros:
Instance: seleccione la instancia de destino.
Topic: seleccione el tema de destino.
EventBridge. Si selecciona EventBridge como servicio de destino, debe especificar un Custom event bus.
-
Configurar un destino para fallos
Establezca Invoke Other Services upon Failure en Enable y luego configure el servicio de destino para las ejecuciones fallidas. Los parámetros son los mismos que para un destino de éxitos.
-
Fallos de devolución de llamada
Las devoluciones de llamada a un servicio de destino pueden fallar por permisos insuficientes o por indisponibilidad del servicio. Function Compute proporciona métricas y registros relevantes que puede utilizar para solucionar problemas. La siguiente tabla describe los errores comunes y los comportamientos correspondientes del sistema.
|
Código de error |
Causa |
Comportamiento del sistema |
|
5xx |
Limitación de velocidad o errores de contenido. |
El sistema Function Compute reintenta automáticamente con retroceso exponencial. El intervalo inicial de reintento es de 500 ms y la duración máxima de reintento es de 30 minutos. |
|
4xx |
Permisos faltantes, parámetros de solicitud no válidos (por ejemplo, el recurso de destino se eliminó) o el cuerpo de la solicitud supera el límite del servicio de destino. |
Devuelve un error y registra la información del error. |
Métricas de devolución de llamada de resultado
Si una devolución de llamada al servicio de destino falla, Function Compute registra las métricas correspondientes en la consola. Inicie sesión en la consola de Function Compute. En el panel de navegación izquierdo, elija . Luego, en la lista Function Name, haga clic en el nombre de la función de destino para consultar sus métricas.
|
Nombre de la métrica |
Descripción |
|
Destination Invocation Errors (FunctionDestinationErrors) |
Número de intentos fallidos para invocar el destino de una invocación de función asíncrona. La métrica se agrega por suma cada minuto o cada hora. |
|
Destination Invocation Successes (FunctionDestinationSucceed) |
Número de intentos exitosos para invocar el destino de una invocación de función asíncrona. La métrica se agrega por suma cada minuto o cada hora. |
Para obtener más información sobre las métricas de monitoreo, consulte Monitoring Metrics.
Preguntas frecuentes
¿Cómo desencadenar una invocación asíncrona?
Puede usar uno de los siguientes métodos para invocar de forma asíncrona una función en Function Compute:
Inicie sesión en la consola de Function Compute, busque la función de destino, vaya a la pestaña Test, seleccione I want to make the call asynchronously. y luego haga clic en Test Function.
Llame a la API InvokeFunction y establezca el parámetro
x-fc-invocation-typeenAsync.Use Serverless Devs para configurar una invocación asíncrona. Establezca el parámetro
invocation-typeenAsync. Para obtener más información, consulte Invoke a function.Cree un disparador compatible con la invocación asíncrona para desencadenar la función de esa manera. Para obtener más información, consulte Event-driven invocations.
-
Cuando use un disparador HTTP o un dominio personalizado para una invocación, establezca el encabezado de solicitud
X-Fc-Invocation-Typeen Async, como se muestra en el siguiente ejemplo.curl -v -H "X-Fc-Invocation-Type: Async" https://example.cn-shenzhen.fcapp.run/$pathNotaLlamar a una Web Function: por ejemplo, si usa Flask y desea probar una función de Python con una ruta definida como
@app.route('/test'), reemplace$pathportest. Cuando pruebe una función de Python con una ruta definida como@app.route('/'), llame directamente al endpoint público del disparador HTTP.Invocar una Event Function: llame directamente al endpoint público del disparador HTTP.
Pasos siguientes
Para rastrear el estado de una solicitud asíncrona en cada etapa, habilite Task Mode. Para obtener más información, consulte Asynchronous tasks.