Controlar tarefas de execução prolongada usando temporizadores

Concluído

Quando se trabalha com um fluxo de trabalho de longa duração, é importante considerar alguns cenários adicionais. Por exemplo, o que deverá acontecer se uma tarefa não for concluída dentro de um período aceitável? Como verificar o status de uma tarefa? É possível solucionar esses problemas com tempos limite e caminhos de escalonamento.

No cenário de exemplo, você foi encarregado de corrigir seu novo fluxo de trabalho a fim de incorporar uma etapa de escalonamento para executar uma ação, caso uma proposta de design de projeto não seja aprovada em tempo hábil.

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

Temporizadores nas Durable Functions

As Durable Functions fornecem temporizadores para uso nas funções de orquestrador, que você pode aproveitar para implementar atrasos ou configurar tempos limite em ações assíncronas. Use 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() de DurableOrchestrationContext. Esse método retorna uma tarefa que é retomada em uma data e uma hora especificadas.

Como usar temporizadores para atraso

O exemplo a seguir ilustra como usar temporizadores duráveis para atraso, que enviam um lembrete todos os dias durante dez 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");
    }
});

Você sempre deve usar currentUtcDateTime para obter a data e a hora atuais, em vez de Date.now ou Date.UTC.

Como usar temporizadores para tempo limite

O exemplo a seguir ilustra como usar temporizadores duráveis para tempo limite, que executarão 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 seguirá o caso de sucesso; caso contrário, ele seguirá o caso de tempo limite.

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 de orquestrador.