Para funções com lógica de longa duração, uso intensivo de recursos ou propensa a erros, use a invocação assíncrona para melhorar a responsividade da aplicação e lidar com picos de tráfego de forma confiável. Ao invocar uma função de maneira assíncrona, não é necessário aguardar uma resposta. O Function Compute persiste a solicitação em uma fila interna para garantir o processamento confiável. Este tópico descreve os casos de uso e os recursos comuns da invocação assíncrona.
Casos de uso
Exemplos de casos de uso para invocação assíncrona incluem:
-
Processamento de áudio e vídeo
Ao usar o Function Compute para cargas de trabalho de áudio e vídeo, é comum executar tarefas demoradas, como codificação, decodificação e transcodificação. A invocação assíncrona dessas tarefas permite a execução em segundo plano sem bloquear o front-end, melhorando a experiência do usuário. Em projetos grandes, divida o trabalho em várias tarefas para processamento paralelo ou converta um vídeo em vários formatos invocando múltiplas funções assincronamente. Essa abordagem reduz o tempo total de processamento.
-
Processamento de dados ETL
Em um pipeline de extração, transformação e carga (ETL), o processo de extrair dados de uma origem, transformá-los e carregá-los em um sistema de destino pode envolver várias operações independentes, como consultas a banco de dados, E/S de arquivos ou limpeza de dados. A invocação assíncrona permite executar essas operações em paralelo, reduzindo o tempo de processamento e melhorando o desempenho do sistema. Para tarefas de longa duração, como processamento de grandes conjuntos de dados ou transformações complexas, a invocação assíncrona viabiliza a execução em segundo plano, evitando o bloqueio do front-end e aprimorando a experiência do usuário.
-
Desenvolvimento de aplicações web
Use o Function Compute com outros serviços de nuvem para criar aplicações web rapidamente. Quando usuários enviam formulários, executam buscas ou carregam páginas com muito conteúdo, a invocação assíncrona evita que a página trave devido à longa espera por respostas do back-end. Os usuários continuam interagindo com outras partes da página sem perceber latência significativa. Em cenários de alta concorrência, como acessos simultâneos de muitos usuários, a invocação assíncrona distribui a carga de solicitações e previne a sobrecarga do serviço.
Invocação adiada
Configure o Function Compute para acionar uma invocação assíncrona após um atraso especificado.
Adicione o cabeçalho de solicitação HTTP x-fc-async-delay ao seu código. O valor deve estar em segundos e dentro do intervalo de (0, 3600). O Function Compute inicia um temporizador ao acionar a execução e invoca a função após o atraso definido por x-fc-async-delay.
Política de nova tentativa
O mecanismo de invocação assíncrona oferece tratamento de erros e novas tentativas integrados. Se uma etapa falhar, o sistema reagendará a tarefa sem afetar o fluxo de trabalho geral. Quando uma invocação de função assíncrona falha, o Function Compute tenta automaticamente a invocação novamente.
Mecanismo de nova tentativa
A tabela a seguir descreve a política padrão de novas tentativas para erros comuns.
Configurar a política de nova tentativa
O Function Compute permite personalizar o número máximo de novas tentativas e o tempo de vida máximo da mensagem.
Faça login no console do Function Compute. No painel de navegação à esquerda, escolha .
Na barra de navegação superior, selecione uma região. Na página Functions, clique em na função desejada.
-
Na página de detalhes da função, clique em na aba Tasks e, em seguida, clique em Task Mode à direita de Modify. No painel Task Mode, defina os parâmetros a seguir. Após concluir a configuração, clique em Deploy.
Parâmetro
Descrição
Task Mode
Define se o Task Mode deve ser ativado para uma tarefa assíncrona. Para mais informações, consulte Tarefas assíncronas.
Maximum Retries
Número máximo de novas tentativas para uma invocação assíncrona. O valor deve ser um número inteiro de 0 a 8.
Por padrão, o Function Compute tenta novamente uma invocação assíncrona com falha 3 vezes. Ajuste o número de tentativas conforme as necessidades do seu negócio.
Maximum Message Lifetime
Tempo de vida máximo de uma mensagem na fila de invocação assíncrona. O valor deve ser um número inteiro de 1 a 604.800. O valor padrão é 86.400. Unidade: segundos.
Essa duração é calculada a partir do momento em que a invocação assíncrona é acionada. Se o tempo de vida da mensagem exceder o valor configurado, a mensagem será descartada. As mensagens descartadas são registradas pela métrica de monitoramento Asynchronous Invocation Events no CloudMonitor. Para mais informações sobre métricas, consulte Métricas de monitoramento.
Callback de resultado
Quando o Function Compute recebe uma solicitação de invocação assíncrona, ele persiste a solicitação e retorna imediatamente uma resposta sem esperar a conclusão da execução. Para reter solicitações descartadas após a falha de todas as novas tentativas ou notificar um serviço downstream sobre o resultado da invocação assíncrona, configure o recurso de callback de resultado. Após configurar um serviço de destino, o Function Compute chama automaticamente o serviço correspondente com base no resultado da execução quando a invocação assíncrona for concluída.
Como funciona
A figura a seguir mostra o fluxo de trabalho do callback de resultado.
Casos de uso
-
Salvar eventos descartados para processamento posterior
Quando uma solicitação assíncrona falha e esgota todas as novas tentativas conforme a política configurada, o Function Compute descarta a solicitação. Se você tiver configurado um destino de falha, o Function Compute envia automaticamente as informações de contexto da solicitação com falha para um serviço de mensagens, como o ApsaraMQ for RocketMQ, para processamento subsequente. Também é possível definir outra função como serviço de destino. Nesse caso, o Function Compute envia automaticamente as informações de contexto da solicitação com falha para essa função, permitindo a execução da sua lógica personalizada de tratamento de erros.
-
Notificar automaticamente serviços downstream sobre os resultados da execução
Após uma execução bem-sucedida, se um destino de sucesso estiver configurado, o sistema Function Compute envia automaticamente o contexto da solicitação para o serviço de destino downstream. Por exemplo, se você configurar o Function Compute para descompactar automaticamente um arquivo ZIP enviado ao OSS e desejar receber uma notificação por mensagem ao concluir, configure um serviço de destino de callback de resultado para a função alvo.
Serviços de destino suportados
Se o resultado de uma invocação assíncrona atender às condições configuradas, o Function Compute envia o contexto e os dados da solicitação para o serviço de destino especificado. É possível configurar diferentes serviços de destino para diferentes funções, aliases e versões. Os seguintes serviços de destino são suportados para invocação assíncrona:
Simple Message Queue (formerly MNS)
Function Compute
EventBridge
ApsaraMQ for RocketMQ
Somente instâncias da série 4.0 do ApsaraMQ for RocketMQ podem ser configuradas como serviço de destino. Instâncias da série 5.0 não são suportadas.
Para obter informações sobre os limites de payload dos serviços de destino, consulte Limites de recursos de runtime de função.
A configuração para destinos de invocação assíncrona inclui o seguinte:
-
Conteúdo do evento para destinos de invocação assíncrona
Quando o Simple Message Queue (formerly MNS), o Function Compute ou o ApsaraMQ for RocketMQ é o destino de uma invocação de função assíncrona, o conteúdo do evento tem o seguinte formato.
{ "timestamp": 1660120276975, "requestContext": { "requestId": "xxx", "functionArn": "acs:fc:{regionid}:{accountid}:functions/xxxx", "condition": "FunctionResourceExhausted", "approximateInvokeCount": 3 }, "requestPayload": "", "responseContext": { "statusCode": 200, "functionError": "" }, "responsePayload": "" }Tabela 1. Descrições dos parâmetros
Parâmetro
Descrição
timestamp
O timestamp da invocação.
requestContext
O contexto da solicitação.
requestContext.requestId
O ID da solicitação da invocação assíncrona.
requestContext.functionArn
O Alibaba Cloud Resource Name (ARN) da função invocada de forma assíncrona.
requestContext.condition
O código de erro da invocação.
requestContext.approximateInvokeCount
O número de vezes que a invocação assíncrona foi executada. Um valor maior que 1 indica que o Function Compute tentou a invocação novamente.
requestPayload
O payload original da solicitação da função.
responseContext
O contexto da resposta.
responseContext.statusCode
O código de status do sistema retornado pela invocação da função. Se o código de status não for 200, ocorreu um erro de sistema.
responseContext.functionError
A mensagem de erro da invocação.
responsePayload
O payload original retornado pela execução da função.
Quando o EventBridge é usado como destino para uma invocação de função assíncrona, o evento segue o formato abaixo. Para mais informações, consulte Visão geral de eventos.
{ "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" } -
Limites de payload
Os limites máximos de payload para os serviços de destino suportados são os seguintes:
Simple Message Queue (formerly MNS): 64 KB
Function Compute: sujeito aos limites descritos em Limites de recursos de runtime de função.
EventBridge: 64 KB
ApsaraMQ for RocketMQ: 4 MB
-
Evitar loops de invocação
Ao configurar um destino para uma execução assíncrona, evite criar um loop de invocação. Por exemplo, se você configurar a Função B como destino para invocações bem-sucedidas da Função A e a Função A como destino para invocações bem-sucedidas da Função B, poderá ocorrer um loop de invocação de A para B e de volta para A caso a Função A seja acionada de forma assíncrona e executada com sucesso.
Configurar um serviço de destino
Faça login no console do Function Compute. No painel de navegação à esquerda, escolha .
Na barra de navegação superior, selecione uma região. Na página Functions, clique em na função desejada.
-
Na página de detalhes da função, clique em na aba Tasks e, em seguida, clique em Edit à direita de Modify. No painel Task destination, defina os parâmetros a seguir. Após concluir a configuração, clique em Deploy.
-
Configurar um destino de sucesso
Defina Invoke Other Services upon Success como Enable e configure o serviço de destino para execuções bem-sucedidas. Os parâmetros são descritos a seguir:
Parâmetro
Descrição
Destination Service
Function Compute. Ao selecionar Function Compute como serviço de destino, configure os seguintes parâmetros:
Function name: Especifique o nome da função de destino.
Version or alias: Especifique o alias ou a versão da função.
Simple Message Queue (formerly MNS). Ao selecionar Simple Message Queue (formerly MNS) como serviço de destino, configure os seguintes parâmetros:
Destination type: Selecione um tipo de destino. Valores válidos:
Queue:
Topic:
Queue: Selecione o nome da fila do Simple Message Queue (formerly MNS). Este parâmetro é obrigatório se você definir Queue como Queue.
Topic: Selecione o nome do tópico do Simple Message Queue (formerly MNS). Este parâmetro é obrigatório se você definir Topic como Topic.
ApsaraMQ for RocketMQ. Se você selecionar ApsaraMQ for RocketMQ como serviço de destino, configure os seguintes parâmetros:
Instance: Selecione a instância de destino.
Topic: Selecione o tópico de destino.
EventBridge. Se você selecionar EventBridge como serviço de destino, especifique um Custom event bus.
-
Configurar um destino de falha
Defina Invoke Other Services upon Failure como Enable e configure o serviço de destino para execuções com falha. Os parâmetros são os mesmos utilizados para um destino de sucesso.
-
Falhas de callback
Os callbacks para um serviço de destino podem falhar devido a permissões insuficientes ou indisponibilidade do serviço. O Function Compute fornece métricas e logs relevantes para solução de problemas. A tabela a seguir descreve erros comuns e os comportamentos correspondentes do sistema.
|
Código de erro |
Causa |
Comportamento do sistema |
|
5xx |
Limitação de taxa (throttling) ou erros de conteúdo. |
O sistema Function Compute tenta novamente automaticamente com backoff exponencial. O intervalo inicial de nova tentativa é de 500 ms e a duração máxima de nova tentativa é de 30 minutos. |
|
4xx |
Permissões ausentes, parâmetros de solicitação inválidos (por exemplo, o recurso de destino foi excluído) ou corpo da solicitação excede o limite do serviço de destino. |
Retorna um erro e registra as informações do erro. |
Métricas de callback de resultado
Se um callback para o serviço de destino falhar, o Function Compute registra as métricas correspondentes no console. Faça login no console do Function Compute. No painel de navegação à esquerda, escolha . Em seguida, na lista Function Name, clique em no nome da função desejada para visualizar suas métricas.
|
Nome da métrica |
Descrição |
|
Destination Invocation Errors (FunctionDestinationErrors) |
Número de tentativas com falha ao invocar o destino para uma invocação de função assíncrona. A métrica é agregada por soma por minuto ou por hora. |
|
Destination Invocation Successes (FunctionDestinationSucceed) |
Número de tentativas bem-sucedidas ao invocar o destino para uma invocação de função assíncrona. A métrica é agregada por soma por minuto ou por hora. |
Para mais informações sobre métricas de monitoramento, consulte Métricas de monitoramento.
Perguntas frequentes
Como acionar uma invocação assíncrona?
Utilize um dos métodos a seguir para invocar uma função de forma assíncrona no Function Compute:
Faça login no console do Function Compute, localize a função desejada, acesse a aba Test, selecione I want to make the call asynchronously. e clique em Test Function.
Chame a API InvokeFunction e defina o parâmetro
x-fc-invocation-typecomoAsync.Use o Serverless Devs para configurar uma invocação assíncrona. Defina o parâmetro
invocation-typecomoAsync. Para mais informações, consulte Invocar uma função.Crie um gatilho que suporte invocação assíncrona para acionar a função de forma assíncrona. Para mais informações, consulte Invocações orientadas a eventos.
-
Ao usar um gatilho HTTP ou um domínio personalizado para uma invocação, defina o cabeçalho de solicitação
X-Fc-Invocation-Typecomo Async, conforme mostrado no exemplo a seguir.curl -v -H "X-Fc-Invocation-Type: Async" https://example.cn-shenzhen.fcapp.run/$pathNotaChamar uma Web Function: Por exemplo, se você usa Flask e deseja testar uma função Python com uma rota definida como
@app.route('/test'), substitua$pathportest. Ao testar uma função Python com uma rota definida como@app.route('/'), chame diretamente o endpoint público do gatilho HTTP.Invocar uma Event Function: Chame diretamente o endpoint público do gatilho HTTP.
Próximas etapas
Para rastrear o status de uma solicitação assíncrona em cada etapa, ative o Task Mode. Para mais informações, consulte Tarefas assíncronas.