Controlar tarefas de execução prolongada com temporizadores

Concluído

Quando você estiver trabalhando com um fluxo de trabalho de longa execução, é importante considerar alguns cenários adicionais. Por exemplo, o que deve acontecer se uma tarefa não for concluída dentro de um período de tempo aceitável? Como pode verificar o estado de uma tarefa? Pode abordar estes problemas com tempos limite e caminhos de escalamento.

No cenário de exemplo, foi-lhe pedido que corrigisse o seu novo fluxo de trabalho para incorporar um passo de escalamento de forma a tomar medidas caso uma proposta de design de projetos não seja aprovada atempadamente.

Nesta unidade, você aprenderá como controlar tarefas de longa execução usando temporizadores duráveis e como adicionar um caminho de escalonamento com base no temporizador.

Temporizadores na Durable Functions

A Durable Functions fornece temporizadores para utilizar nas funções de orquestrador, que pode utilizar para implementar atrasos ou configurar tempos limite para ações assíncronas. Deve utilizar temporizadores duráveis em funções de orquestrador em vez das funções setTimeout() e setInterval().

Você pode criar um temporizador durável chamando o método createTimer() do DurableOrchestrationContext. Este método devolve uma tarefa que é retomada numa data e hora especificadas.

Utilizar temporizadores para atrasos

O seguinte exemplo ilustra como utilizar os temporizadores duráveis para atrasos, o que envia um lembrete todos os dias durante 10 dias.

const df = require("durable-functions");
const moment = require("moment");

module.exports = df.orchestrator(function*(context) {
    for (let i = 0; i < 10; i++) {
        const deadline = moment.utc(context.df.currentUtcDateTime).add(i, 'd');
        yield context.df.createTimer(deadline.toDate());
        yield context.df.callActivity("SendReminder");
    }
});

Deve utilizar sempre o parâmetro currentUtcDateTime para obter a data e hora atuais, em vez de Date.now ou Date.UTC.

Utilizar temporizadores para tempo limite

O exemplo seguinte ilustra como utilizar temporizadores duráveis para tempos limite, o que irá executar um caminho diferente se ocorrer um tempo limite. Neste exemplo, a função aguarda até que a função de atividade GetQuote seja concluída ou o temporizador deadline expire. Se a função de atividade for concluída, o código segue o success case. Caso contrário, segue o timeout case.

const df = require("durable-functions");
const moment = require("moment");

module.exports = df.orchestrator(function*(context) {
    const deadline = moment.utc(context.df.currentUtcDateTime).add(30, "s");

    const activityTask = context.df.callActivity("GetQuote");
    const timeoutTask = context.df.createTimer(deadline.toDate());

    const winner = yield context.df.Task.any([activityTask, timeoutTask]);
    if (winner === activityTask) {
        // success case
        timeoutTask.cancel();
        return true;
    }
    else
    {
        // timeout case
        return false;
    }
});

No próximo exercício, você usará essas informações para adicionar um caminho de escalonamento ao nosso cenário de exemplo na função orchestrator.