SDK de execução durável
O SDK de execução durável é a base para a criação de funções duráveis. Ele fornece os elementos básicos de que você precisa para verificar o progresso, lidar com novas tentativas e gerenciar o fluxo de execução. O SDK abstrai a complexidade do gerenciamento e da reprodução de pontos de verificação, permitindo que você escreva um código sequencial que automaticamente se torna com tolerância a falhas.
O SDK está disponível para JavaScript, TypeScript e Python. Para obter exemplos e documentação completa da API, consulte o SDK do Javascript/TypeScript
DurableContext
O SDK fornece à sua função um objeto DurableContext que expõe todas as operações duráveis. Esse contexto substitui o contexto padrão do Lambda e fornece métodos para a criação de pontos de verificação, gerenciamento do fluxo de execução e coordenação com sistemas externos.
Para usar o SDK, encapsule seu manipulador Lambda com o wrapper de execução durável:
O wrapper intercepta a invocação da sua função, carrega qualquer log de ponto de verificação existente e fornece o DurableContext que gerencia a reprodução e a criação dos pontos de verificação.
O que o SDK faz
O SDK lida com três responsabilidades críticas que habilitam a execução durável:
Gerenciamento de pontos de verificação: o SDK cria pontos de verificação automaticamente à medida que sua função executa operações duráveis. Cada ponto de verificação registra o tipo de operação, as entradas e os resultados. Quando sua função conclui uma etapa, o SDK persiste no ponto de verificação antes de prosseguir. Isso garante que sua função possa ser retomada a partir de qualquer operação concluída, caso seja interrompida.
Coordenação de reprodução: quando sua função é retomada após uma pausa ou interrupção, o SDK executa a reprodução. Ele executa seu código desde o início, mas ignora as operações concluídas, usando resultados de pontos de verificação armazenados em vez de reexecutá-las. O SDK garante que a reprodução seja determinística, de forma que, dadas as mesmas entradas e o mesmo log do ponto de verificação, sua função produz os mesmos resultados.
Isolamento de estado: o SDK mantém o estado de execução separadamente da sua lógica de negócios. Cada execução durável tem seu próprio log de ponto de verificação que outras execuções não podem acessar. O SDK criptografa os dados em repouso do ponto de verificação e garante que o estado permaneça consistente em todas as reproduções.
Como o ponto de verificação funciona
Quando você chama uma operação durável, o SDK segue esta sequência:
Verificar o ponto de verificação existente: o SDK verifica se essa operação já foi concluída em uma invocação anterior. Se existir um ponto de verificação, o SDK retornará o resultado armazenado sem reexecutar a operação.
Executar a operação: se não existir nenhum ponto de verificação, o SDK executará seu código de operação. Para etapas, isso significa chamar sua função. Para esperas, isso significa agendar a retomada.
Criar ponto de verificação: após a conclusão da operação, o SDK serializa o resultado e cria um ponto de verificação. O ponto de verificação inclui o tipo de operação, nome, entradas, resultado e timestamp.
Persistir o ponto de verificação: o SDK chama a API de ponto de verificação do Lambda para persistir o ponto de verificação. Isso garante que o ponto de verificação seja durável antes de prosseguir com a execução.
Retornar resultado: o SDK retorna o resultado da operação para seu código, que prossegue até a próxima operação.
Essa sequência garante que, após a conclusão da operação, seu resultado seja armazenado com segurança. Se sua função for interrompida em algum momento, o SDK poderá reproduzi-la até o último ponto de verificação concluído.
Comportamento da reprodução
Quando sua função é retomada após uma pausa ou interrupção, o SDK executa a reprodução.
Carregar log do ponto de verificação: o SDK recupera o log do ponto de verificação para essa execução do Lambda.
Executar desde o início: o SDK invoca sua função de manipulador desde o início, não de onde ela foi pausada.
-
Ignorar operações duráveis concluídas: à medida que seu código chama operações duráveis, o SDK compara cada uma delas com base no log do ponto de verificação. Para operações duráveis concluídas, o SDK retorna o resultado armazenado sem executar o código da operação.
nota
Se o resultado do contexto secundário for maior que o tamanho máximo do ponto de verificação (256 KB), o código do contexto será executado novamente durante a reprodução. Isso permite que você construa grandes resultados a partir das operações duráveis executadas dentro do contexto, que serão consultadas no log do ponto de verificação. Portanto, é imperativo executar apenas código determinístico no próprio contexto. Ao usar contextos secundários com grandes resultados, é uma prática recomendada realizar trabalhos de longa duração ou não determinísticos dentro das etapas e realizar apenas tarefas de curta duração que combinem os resultados no próprio contexto.
Retomar no ponto de interrupção: quando o SDK alcança uma operação sem um ponto de verificação, ele é executado normalmente e cria novos pontos de verificação à medida que as operações duráveis são concluídas.
Esse mecanismo de reprodução exige que seu código seja determinístico. Com as mesmas entradas e o mesmo log do ponto de verificação, sua função deve fazer a mesma sequência de chamadas de operação duráveis. O SDK aplica isso validando se os nomes e tipos de operação correspondem ao log do ponto de verificação durante a reprodução.
Operações duráveis disponíveis
O DurableContext fornece operações para diferentes padrões de coordenação. Cada operação durável cria pontos de verificação automaticamente, garantindo que sua função possa ser retomada a partir de qualquer ponto.
Steps
Executa a lógica de negócios com verificação automática e nova tentativa. Use etapas para operações que chamem serviços externos, realizem cálculos ou executem qualquer lógica que deva ser verificada. O SDK cria um ponto de verificação antes e depois da etapa, armazenando o resultado para reprodução.
As etapas oferecem suporte a estratégias de reprodução configuráveis, semântica de execução (no máximo uma vez ou pelo menos uma vez) e serialização personalizada.
Espera
Pausa a execução por um período especificado sem consumir recursos computacionais. O SDK cria um ponto de verificação, encerra a invocação da função e agenda a retomada. Quando a espera é concluída, o Lambda invoca sua função novamente e o SDK faz a reprodução até o ponto de espera antes de prosseguir.
Retornos de chamada
Os retornos de chamadas permitem que sua função faça uma pausa e aguarde até que sistemas externos forneçam entrada. Quando você cria um retorno de chamada, o SDK gera um ID de retorno de chamada exclusivo e cria um ponto de verificação. Em seguida, sua função é suspensa (encerra a invocação) sem incorrer em cobranças computacionais. Sistemas externos enviam resultados de retorno de chamada usando as APIs SendDurableExecutionCallbackSuccess ou SendDurableExecutionCallbackFailure do Lambda. Quando um retorno de chamada é enviado, o Lambda invoca sua função novamente, o SDK faz a reprodução até o ponto de retorno de chamada e sua função prossegue com o resultado do retorno de chamada.
O SDK fornece dois métodos para o trabalho com retornos de chamadas:
createCallback: cria um retorno de chamada e retorna uma promessa e um ID de retorno de chamada. Você envia o ID de retorno de chamada para um sistema externo, que envia o resultado usando a API do Lambda.
waitForCallback: simplifica o tratamento do retorno de chamada combinando a criação e o envio de retornos de chamada em uma única operação. O SDK cria o retorno de chamada, executa sua função de envio com o ID de retorno de chamada e aguarda pelo resultado.
Configure os tempos limite para evitar que as funções esperem indefinidamente. Se um retorno de chamada atingir o tempo limite, o SDK lançará um CallbackError e sua função poderá tratar o caso de tempo limite. Use tempos limite de pulsação para retornos de chamada de longa duração para detectar quando os sistemas externos param de responder.
Use retornos de chamada para fluxos de trabalho com humanos no loop, integração de sistemas externos, respostas de webhook ou qualquer cenário em que a execução deva ser pausada para entradas externas.
Execução paralela
Execute várias operações simultaneamente com o controle de simultaneidade opcional. O SDK gerencia a execução paralela, cria pontos de verificação para cada operação e trata as falhas de acordo com sua política de conclusão.
Use parallel para executar operações independentes simultaneamente.
Mapa
Execute simultaneamente uma operação em cada item em uma matriz com controle de simultaneidade opcional. O SDK gerencia a execução simultânea, cria pontos de verificação para cada operação e trata as falhas de acordo com sua política de conclusão.
Use map para processar matrizes com controle de simultaneidade.
Contextos secundários
Cria um contexto de execução isolado para operações de agrupamento. Os contextos secundários têm seu próprio log de pontos de verificação e podem conter várias etapas, esperas e outras operações. O SDK trata todo o contexto secundário como uma única unidade para novas tentativas e recuperações.
Use contextos secundários para organizar fluxos de trabalho complexos, implementar subfluxos de trabalho ou isolar operações que devem ser tentadas novamente juntas.
O mecanismo de reprodução exige que operações duráveis ocorram em uma ordem determinística. Usando vários contextos secundários, é possível ter vários fluxos de trabalho executados simultaneamente, e o determinismo se aplica separadamente em cada contexto. Isso permite que você crie funções de alta performance que utilizem com eficiência vários núcleos de CPU.
Por exemplo, imagine que iniciamos dois contextos secundários, A e B. Na invocação inicial, as etapas dentro dos contextos foram executadas nessa ordem, com as etapas 'A' sendo executadas simultaneamente com as etapas 'B': A1, B1, B2, A2, A3. Na reprodução, o tempo é muito mais rápido, pois os resultados são recuperados do log do ponto de verificação e as etapas são encontradas em uma ordem diferente: B1, A1, A2, B2, A3. Como as etapas 'A' foram encontradas na ordem correta (A1, A2, A3) e as etapas 'B' foram encontradas na ordem correta (B1, B2), a necessidade de determinismo foi satisfeita corretamente.
Esperas condicionais
Sondagens para uma condição com verificação automática entre as tentativas. O SDK executa sua função de verificação, cria um ponto de verificação com o resultado, espera de acordo com sua estratégia e repete até que a condição seja atendida.
Use waitForCondition para sondar sistemas externos, esperar que os recursos estejam prontos ou implementar novas tentativas com recuo.
invocação de funções
Invoca uma outra função do Lambda e aguarda seu resultado. O SDK cria um ponto de verificação, invoca a função de destino e retoma sua função quando a invocação é concluída. Isso permite a composição da função e a decomposição do fluxo de trabalho.
Como as operações duráveis são medidas
Cada operação durável que você executa por DurableContext cria pontos de verificação para monitorar o progresso da execução e armazenar dados de estado. Essas operações incorrem em cobranças com base em seu uso, e os pontos de verificação podem conter dados que contribuam para seus custos de gravação e retenção de dados. Os dados armazenados incluem dados de eventos de invocação, cargas úteis retornadas das etapas e dados transmitidos ao concluir retornos de chamada. Entender como as operações duráveis são medidas ajuda você a estimar os custos de execução e a otimizar seus fluxos de trabalho. Para obter detalhes de preços, consulte a página de dfinição de preços do Lambda
O tamanho da carga útil se refere ao tamanho dos dados serializados em que uma operação durável persiste. Os dados são medidos em bytes e o tamanho pode variar dependendo do serializador usado pela operação. A carga útil de uma operação pode ser o resultado em si de uma conclusão com êxito ou o objeto de erro serializado se a operação falhar.
Operações básicas
As operações básicas são os blocos de construção fundamentais para funções duráveis:
| Operation | Tempo do ponto de verificação | Número de operações | Dados persistidos |
|---|---|---|---|
| Execução | Started | 1 | Tamanho da carga útil da entrada |
| Execução | Concluído (Com êxito/Falhado/Interrompido) | 0 | Tamanho da carga útil da saída |
| N.º da etapa | Tentativa nova/Com êxito/Falhado | 1 + N novas tentativas | Tamanho da carga útil retornado de cada tentativa |
| Aguardar | Started | 1 | N/D |
| WaitForCondition | Cada tentativa de sondagem | 1 + N sondagens | Tamanho da carga útil retornado de cada tentativa de sondagem |
| Nova tentativa em nível de invocação | Started | 1 | Carga útil para objeto de erro |
Operações de retorno de chamada
Os retornos de retorno de chamada permitem que sua função faça uma pausa e aguarde até que sistemas externos forneçam entrada. Essas operações criam pontos de verificação quando o retorno de chamada é criado e quando é concluído:
| Operation | Tempo do ponto de verificação | Número de operações | Dados persistidos |
|---|---|---|---|
| CreateCallback | Started | 1 | N/D |
| Conclusão do retorno de chamada por meio de chamada de API | Concluído | 0 | Carga útil de retorno de chamada |
| WaitForCallback | Started | 3 + N novas tentativas (contexto + retorno de chamada + etapa) | Cargas retornadas pelas tentativas de etapa do remetente, mais duas cópias da carga útil de retorno de chamada |
Operações compostas
As operações compostas combinam várias operações duráveis para lidar com padrões complexos de coordenação, como execução paralela, processamento de matrizes e contextos aninhados:
| Operation | Tempo do ponto de verificação | Número de operações | Dados persistidos |
|---|---|---|---|
| Paralelo | Started | 1 + N ramificações (1 contexto primário + N contextos secundários) | Até duas cópias do tamanho da carga útil retornada de cada ramificação, mais os status de cada ramificação |
| mapa | Started | 1 + N ramificações (1 contexto primário + N contextos secundários) | Até duas cópias do tamanho da carga útil retornada de cada iteração, mais os status de cada iteração |
| Ajudantes de promessas | Concluído | 1 | Tamanho da carga útil retornado da promessa |
| RunInChildContext | Com êxito/Falhado | 1 | Tamanho da carga útil retornado do contexto secundário |
Para contextos, como de runInChildContext ou usados internamente por operações compostas, resultados menores que 256 KB são verificados diretamente. Resultados maiores não são armazenados. Em vez disso, eles são reconstruídos durante a reprodução por meio do reprocessamento das operações do contexto.