Запускайте фоновые задания с помощью долговременных функций Azure. - PullRequest
0 голосов
/ 19 сентября 2019

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

Это сценарий, в котором я нахожусь:

  • Функция A использует HttpTrigger
  • Функция B использует ActivityTrigger

Это мой рабочий процесс:

  • A вызывается и нуждается в некоторой бизнес-логике
  • Наряду с этой бизнес-логикой мне нужно выполнить длинную фоновую задачу, которая может или не может дать сбой.Мне плевать на результаты, но мне нужно запускать эту задачу каждый раз, когда вызывается A.
  • A должен возвращаться как можно быстрее, поэтому я не могу ждать фоназадача для завершения
  • B выполняет эту фоновую задачу, в то время как A возвращает

Все примеры Durable Functions, которые я нахожу в Интернете, показывают что-то вроде этого:

await starter.StartNewAsync("BackgroundDurableFunction", data)

Моя проблема в том, что я не хочу await Durable Function, но мне нужно, чтобы она просто работала в фоновом режиме и выполняла свои функции (в основном, сетевой ввод / вывод).

Чтобы избежать ожидания этой долговременной функции, я использовал этот обходной путь:

Task.Factory.StartNew(() => starter.StartNewAsync("BackgroundDurableFunction", data));

Кажется, это работает правильно, поскольку мне не нужно ничего await, но после прочтения Опасности Task.Factory.StartNew Я немного боюсь, что это может быть опасным решением.

Итак, вопрос в том, как правильно запустить Durable Function и получить ее.работать в фоновом режиме, не заботясь о его результатах(и без предупреждения о том, что не стоит ждать задания)?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Да, долговечные функции должны хорошо работать для вашего сценария.Вы просто упускаете одну вещь: оркестратор.Это должно помочь вам начать:

[FunctionName("MyHttpTriggered")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log,
[OrchestrationClient] DurableOrchestrationClient starter)
{
    string data = "hello";
    string instanceId = await starter.StartNewAsync("MyOrchestrator", data);
    return new OkObjectResult("Orchestrator started. Instance ID={instanceId}");
}

[FunctionName("MyOrchestrator")]
public static async Task MyOrchestrator(
[OrchestrationTrigger] DurableOrchestrationContext context, ILogger log)
{
    string data = context.GetInput<string>();
    await context.CallActivityAsync("YourActivityFunction", data);
}

[FunctionName("YourActivityFunction")]
public static async Task YourActivityFunction([ActivityTrigger] string data, ILogger log)
{

    // do whatever here

}

Хотя есть await заявления, это действительно огонь, и забудьте.Противоположным будет веер .В этом случае вы в основном делаете разветвление без раздувания.

0 голосов
/ 19 сентября 2019

Если это действительно сценарий запуска и забывания, долговременные функции могут быть не лучшим подходом.

Возможно, лучшим решением будет то, что A помещает сообщение в очередь шины обслуживания Azure и B обрабатывает эти сообщения.Таким образом, у вас не будет никакой связи, и рабочий процесс будет по-настоящему запущен и забыт.

...