Поделиться через


Цепочки функций в устойчивых функциях — пример последовательности Hello

Цепочкой функций называют схему выполнения последовательности функций в определенном порядке. Часто требуется передать выходные данные одной функции во входные данные другой. В этой статье описывается последовательность цепочки, созданная при выполнении краткого руководства по Устойчивые функции (C#, JavaScript, TypeScript, Python, PowerShell или Java). Дополнительные сведения об Устойчивых функций см. в статье, посвященной обзору Устойчивых функций.

Необходимые компоненты

Примечание.

Общедоступна версия 4 модели программирования Node.js для Функции Azure. Новая модель версии 4 предназначена для более гибкого и интуитивно понятного интерфейса для разработчиков JavaScript и TypeScript. Дополнительные сведения о различиях между версиями 3 и 4 см. в руководстве по миграции.

В следующих фрагментах кода JavaScript (PM4) обозначает модель программирования версии 4, новый интерфейс.

Функции

В этой статье описаны следующие функции в примере приложения:

  • E1_HelloSequence. Функция оркестратора, вызывающая E1_SayHello несколько раз подряд. При этом сохраняются выходные данные каждого вызова E1_SayHello и записываются результаты.
  • E1_SayHello. Функция действия, которая добавляет Hello в начало строки.
  • HttpStart: Функция долговременного клиента, активируемая по протоколу HTTP, которая запускает экземпляр оркестратора.

Функция оркестратора E1_HelloSequence

[FunctionName("E1_HelloSequence")]
public static async Task<List<string>> Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var outputs = new List<string>();

    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello", "Tokyo"));
    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello", "Seattle"));
    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello_DirectInput", "London"));

    // returns ["Hello Tokyo!", "Hello Seattle!", "Hello London!"]
    return outputs;
}

Для всех функций оркестратора на C# должен использоваться параметр типа DurableOrchestrationContext, который присутствует в сборке Microsoft.Azure.WebJobs.Extensions.DurableTask. Этот объект контекста позволяет вызывать другие функции действия и передавать им входные параметры с помощью метода CallActivityAsync.

Этот код трижды последовательно вызывает E1_SayHello с разными значениями параметров. Значение, возвращаемое при каждом вызове, добавляется в список outputs, который возвращается в качестве результата функции.

Функция действия E1_SayHello

[FunctionName("E1_SayHello")]
public static string SayHello([ActivityTrigger] IDurableActivityContext context)
{
    string name = context.GetInput<string>();
    return $"Hello {name}!";
}

Действия используют атрибут ActivityTrigger. Используйте предоставленный IDurableActivityContext для выполнения действий, связанных с операциями, например для доступа к входному значению с помощью GetInput<T>.

Функция E1_SayHello реализует достаточно простую операцию форматирования строки.

Вместо привязки к IDurableActivityContext можно выполнить прямую привязку к типу, передаваемому в функцию действия. Например:

[FunctionName("E1_SayHello_DirectInput")]
public static string SayHelloDirectInput([ActivityTrigger] string name)
{
    return $"Hello {name}!";
}

Функция клиента HttpStart

Экземпляр функции оркестратора можно запустить с помощью функции клиента. HttpStartДля запуска экземпляров E1_HelloSequence будет использоваться функция, активируемая HTTP.

public static class HttpStart
{
    [FunctionName("HttpStart")]
    public static async Task<HttpResponseMessage> Run(
        [HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = "orchestrators/{functionName}")] HttpRequestMessage req,
        [DurableClient] IDurableClient starter,
        string functionName,
        ILogger log)
    {
        // Function input comes from the request content.
        object eventData = await req.Content.ReadAsAsync<object>();
        string instanceId = await starter.StartNewAsync(functionName, eventData);

        log.LogInformation($"Started orchestration with ID = '{instanceId}'.");

        return starter.CreateCheckStatusResponse(req, instanceId);
    }
}

Для взаимодействия с оркестраторами функция должна включать входную привязку DurableClient. Для запуска оркестрации используется клиент. Он также может помочь вернуть ответ HTTP, содержащий URL-адреса для проверки состояния новой оркестрации.

Запуск примера

Чтобы запустить оркестрацию E1_HelloSequence, отправьте указанный ниже запрос HTTP POST в функцию HttpStart.

POST http://{host}/orchestrators/E1_HelloSequence

Примечание.

В предыдущем фрагменте HTTP предполагается, что в файле host.json существует запись, которая позволяет удалить префикс api/ по умолчанию из всех URL-адресов функций для триггеров HTTP. Разметку для этой конфигурации можно найти в файле host.json в примерах.

Скажем, если пример выполняется в приложении-функции с именем myfunctionapp, замените {host} значением myfunctionapp.azurewebsites.net.

Вы получите примерно такой ответ HTTP с кодом 202 (фрагмент ответа):

HTTP/1.1 202 Accepted
Content-Length: 719
Content-Type: application/json; charset=utf-8
Location: http://{host}/runtime/webhooks/durabletask/instances/96924899c16d43b08a536de376ac786b?taskHub=DurableFunctionsHub&connection=Storage&code={systemKey}

(...trimmed...)

Функция оркестратора помещается в очередь и немедленно передается на выполнение. URL-адрес из заголовка Location позволяет проверить состояние выполнения функции.

GET http://{host}/runtime/webhooks/durabletask/instances/96924899c16d43b08a536de376ac786b?taskHub=DurableFunctionsHub&connection=Storage&code={systemKey}

В ответе на такой запрос возвращаются сведения о состоянии оркестрации. Функция выполняется и завершается достаточно быстро, поэтому, вероятнее всего, отобразится состояние Завершено в ответе примерно такого вида (фрагмент ответа):

HTTP/1.1 200 OK
Content-Length: 179
Content-Type: application/json; charset=utf-8

{"runtimeStatus":"Completed","input":null,"output":["Hello Tokyo!","Hello Seattle!","Hello London!"],"createdTime":"2017-06-29T05:24:57Z","lastUpdatedTime":"2017-06-29T05:24:59Z"}

Как видите, параметр runtimeStatus для экземпляра имеет значение Завершено, а output содержит результат выполнения функции оркестратора, сериализованный в формате JSON.

Примечание.

Вы можете использовать аналогичную логику запуска и для других типов триггеров, например queueTrigger, eventHubTrigger или timerTrigger.

Просмотрите журналы выполнения функции. Функция E1_HelloSequence была запущена и завершена несколько раз в соответствии с логикой повторов, описанной в разделе о надежности оркестрации. С другой стороны, функция E1_SayHello выполнялась только три раза, поскольку для таких процессов логика повторов не применяется.

Следующие шаги

В этом примере показана простая оркестрация с цепочкой функций. В приведенном ниже примере кода показана реализация шаблона развертывания и объединения.