Огонь и забывать звонки в функциях Azure - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть длительная задача в функции Azure, которую я хочу запустить в фоновом потоке с помощью Task.Run. Мне плевать на результат.

public static async Task Run(...)
{
 var taskA = await DoTaskA();     
 Task.Run(new Action(MethodB));
 ....
 // return result based on taskA
}

Это приемлемый шаблон в функциях Azure? (это триггерная функция HTTP)

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

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Нет, нет и нет.

Ваша функция, запускаемая по HTTP, возвращает 202 Accepted, результаты которого вы позже отправляете на URL-адрес большого двоичного объекта. 202 должен включать заголовок Location, который указывает на скоро появившийся блоб-URL и, возможно, также заголовок Retry-after, если у вас есть приблизительное представление о том, сколько времени занимает обработка .

Задача длительной обработки должна представлять собой функцию, запускаемую очередью. Зачем? Потому что все не всегда идет по плану, и вам может потребоваться повторить обработку. Почему бы не встроить повтор?

0 голосов
/ 01 мая 2018

В зависимости от сложности вашего сценария, вы можете рассмотреть Durable Functions . Durable Functions дает вам больший контроль над множеством сценариев, включая длительные задачи.

0 голосов
/ 27 апреля 2018

Лучше всего иметь Azure Function, работающий TaskA, и сделать так, чтобы он отправил сообщение в ServiceBus, которое вызовет другое Azure Function, работающее TaskB, когда что-то будет опубликовано в этом ServiceBus, поскольку нет ответ все равно нужен.

Вот пример, показанный на сайте Microsoft :

[FunctionName("FunctionB")]                    
public static void Run(
    [ServiceBusTrigger("myqueue", AccessRights.Manage, Connection = "ServiceBusConnection")] 
    string myQueueItem, 
    TraceWriter log)
{
    log.Info($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
    MethodB();
}

В этой ситуации вам не нужно начинать новое задание. Просто позвоните MethodB().

Это даст вам гибкость в настройке плана вашего Azure Functions (Служба приложений и план потребления) и минимизирует общую стоимость.

...