Как я могу вернуться до того, как задача завершится, но сохранить ее работоспособной? - PullRequest
1 голос
/ 02 мая 2020

У меня есть Azure Функция, в которой асинхронный метод async Task<IActionResult> MethodA вызывает async Task MethodB. Поскольку ожидается, что MethodB всегда будет длиться более 1 минуты, мы должны начать MethodB и вернуть 202 Принимается в MethodA до окончания MethodB. Внутри MethodB мы отслеживаем статус, сохраняя информацию в таблице. Если MethodB завершается неудачей или выдает исключение, мы ловим исключение и соответствующим образом обновляем таблицу. Таким образом, когда клиент запрашивает состояние задачи, он выбирает результат из таблицы. Вот псевдокод того, что происходит на самом деле:

// The starting method.
[FunctionName("MethodA")]
public static async Task<IActionResult> MethodA(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "start")] HttpRequest request,
    ILogger logger)
{
    // Somehow start MethodB so that it runs and we can return 202 Accepted before it finishes.
    return new AcceptedResult();
}

private static async Task MethodB(ILogger logger)
{
    try
    {
        // Insert row into table with status "running" and do logging.
        // Do stuff that takes longer than 1 minute and do more logging.
    }
    catch(Exception exception) // Very general exception handling for pseudo-code.
    {
        // Update row in table to status "failed" an do some logging.
    }
}

[FunctionName("MethodC")
public static async Task<IActionResult> MethodC(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "get")] HttpRequest request,
    ILogger logger)
{
    // Looks for row in table, gets the status, and do logging.
    // Returns 200 Ok if still running or succeeded, otherwise otherwise some failure code.
    // Also returns the exact status in the table to differentiate between running and succeeded.
}

Какие есть варианты для запуска MethodB, чтобы он продолжал работать после того, как я верну 202 Принято? Я видел много вещей о разных решениях, некоторые из которых блокируют потоки, а некоторые нет, поэтому меня это немного смущает, так как я новичок в этом.

1 Ответ

1 голос
/ 02 мая 2020

Azure функции поддерживают долговечные функции. Одним из вариантов использования для этого, как описано в документах , является шаблон API asyn c HTTP для запуска длительной задачи, раннего возврата и поддержки проверки состояния от клиента позже. В зависимости от деталей ваших методов A и B вы также можете использовать это для цепочки , но похоже, что вы действительно можете использовать долговременную функцию и избавиться от A и C в целом, потому что вы пытаетесь реализовать то, что они уже поддерживают.

...