Должен ли StartNewAsyn c ожидаться на клиенте оркестровки? - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть Azure оркестрация, где клиент оркестрации, который запускает оркестровку, выдал исключение тайм-аута.

Функция клиента оркестровки выполняет только две вещи, начиная две оркестровки, ожидая каждого в качестве примера кода Предлагаю.

await orchestrationClient.StartNewAsync("TableOrchestrator", updates);
await orchestrationClient.StartNewAsync("ClientOrchestrator", clientExport);

Однако, как я понимаю, клиент оркестрации не является специальной функцией, такой как функции оркестрации, поэтому он может работать не более 10 минут. Очевидно, существует высокая вероятность того, что общее время выполнения двух моих оркестровок в общей сложности превысит 10 минут.

Вопросы:

  1. Сохранено ли состояние клиента оркестровки как фактические функции оркестровки?
  2. Нужно ли ждать оркестрации, они не зависят от предыдущих результатов оркестровки?

Обновление Сделан полный пример того, что мой код делает, и время выполнения, как показано ниже.

Кажется, что начало оркестровки будет ждать его, если после него будет написан код, но не, если оркестровка является последним оператором!

Обновленные вопросы:

  1. Будет ли какой-либо код после вызова StartNewAsyn c () заставлять функцию ждать, пока оркестровка действительно не завершится? или, например, операторы журнала не будут запускать такое поведение?
  2. Рекомендуется ли при использовании кода StartNewAsyn c () вызываться только после выполнения всего другого кода?

.

public static class testOrchestration
{
    [FunctionName("Start")]
    public static async Task Start([TimerTrigger("0 */30 * * * *", RunOnStartup = true, UseMonitor = false)]TimerInfo myStartTimer, [OrchestrationClient] DurableOrchestrationClient orchestrationClient, ILogger log)
    {
        var startTime = DateTime.Now;
        log.LogInformation(new EventId(0, "Startup"), "Starting Orchestror 1 ***");

        await orchestrationClient.StartNewAsync("Orchestrator", "ONE");
        log.LogInformation($"Elapsed time, await ONE: {DateTime.Now - startTime}");

        await Task.Delay(5000);
        log.LogInformation($"Elapsed time, await Delay: {DateTime.Now - startTime}");

        log.LogInformation(new EventId(0, "Startup"), "Starting Orchestror 2 ***");
        await orchestrationClient.StartNewAsync("Orchestrator", "TWO");
        log.LogInformation($"Elapsed time, await TWO: {DateTime.Now - startTime}");
    }


    [FunctionName("Orchestrator")]
    public static async Task<string> TestOrchestrator([OrchestrationTrigger] DurableOrchestrationContextBase context, ILogger log)
    {
        var input = context.GetInput<string>();
        log.LogInformation($"Running {input}");
        await Task.Delay(5000);

        return $"Done {input}";
    }
}

Запуск этого дает мне следующий вывод:

Starting Orchestror 1 ***
Elapsed time, await ONE: 00:00:08.5445755
Running ONE
Elapsed time, await Delay: 00:00:13.5541264
Starting Orchestror 2 ***
Elapsed time, await TWO: 00:00:13.6211995
Running TWO

Ответы [ 2 ]

3 голосов
/ 27 февраля 2020

StartNewAsync() только намечает запуск оркестраторов (немедленно). Ожидание этих вызовов не означает, что ваша первоначальная функция действительно будет ждать запуска оркестровщиков - или даже фактически запустить и завершить sh свою работу.

StartNewAsyn c (. NET) или метод startNew (JavaScript) в привязке клиента оркестрации запускает новый экземпляр. Внутренне этот метод помещает сообщение в очередь управления, которая затем запускает запуск функции с указанным именем, которое использует привязку триггера оркестровки.

Эта асинхронная операция c завершается, когда оркестрация процесс успешно запланирован

Источник

Эта асинхронная c операция завершается, когда процесс оркестровки успешно запланирован.

Так что да: вы должны ждать этих звонков (также может быть сделано параллельно, как предложил Мигель). Но это не займет больше времени, чем несколько миллисекунд.

1 голос
/ 27 февраля 2020

Если они не зависят друг от друга, вы можете запустить их параллельно, используя:

var t1 = orchestrationClient.StartNewAsync("TableOrchestrator", updates);
var t2 = orchestrationClient.StartNewAsync("ClientOrchestrator", clientExport);
await Task.WhenAll(t1, t2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...