Устойчивые оркестрацииDurable Orchestrations

Устойчивые функции — это расширение Функций Azure.Durable Functions is an extension of Azure Functions. Функцию оркестратора можно использовать для оркестрации выполнения других Устойчивых функций в приложении-функции.You can use an orchestrator function to orchestrate the execution of other Durable functions within a function app. Функции оркестратора обладают следующими характеристиками.Orchestrator functions have the following characteristics:

  • Функции оркестратора определяют рабочий процесс функции, используя процедурный код.Orchestrator functions define function workflows using procedural code. Не требуются декларативные схемы или конструкторы.No declarative schemas or designers are needed.
  • Функции оркестратора могут вызывать другие устойчивые функции синхронно и асинхронно.Orchestrator functions can call other durable functions synchronously and asynchronously. Выходные данные вызванной функции могут быть надежно сохранены в локальных переменных.Output from called functions can be reliably saved to local variables.
  • Функции оркестратора являются устойчивыми и надежными.Orchestrator functions are durable and reliable. Ход выполнения автоматически фиксируется, когда функция ожидает или получает результат.Execution progress is automatically checkpointed when the function "awaits" or "yields". Локальное состояние не теряется при перезапуске процесса или при перезагрузке виртуальной машины.Local state is never lost when the process recycles or the VM reboots.
  • Функции оркестратора могут быть длительными.Orchestrator functions can be long-running. Общее время существования экземпляра оркестрации может измеряться в секундах, днях, месяцах или никогда не заканчиваться.The total lifespan of an orchestration instance can be seconds, days, months, or never-ending.

В этой статье представлен обзор функций оркестратора и того, как они могут помочь в решении различных задач по разработке приложений.This article gives you an overview of orchestrator functions and how they can help you solve various app development challenges. Если вы еще не знакомы с типами функций, доступных в приложении "Устойчивые функции", сначала прочитайте статью о типах Устойчивых функций.If you are not already familiar with the types of functions available in a Durable Functions app, read the Durable Function types article first.

Идентификатор оркестрацииOrchestration identity

Каждый экземпляр оркестрации обладает идентификатором экземпляра (также известный как ИД экземпляра).Each instance of an orchestration has an instance identifier (also known as an instance ID). По умолчанию каждый идентификатор экземпляра является автоматически созданным глобальным уникальным идентификатором (GUID).By default, each instance ID is an autogenerated GUID. Однако идентификаторы экземпляров также могут быть любыми строковыми значениями, созданными пользователем.However, instance IDs can also be any user-generated string value. Идентификатор каждого экземпляра оркестрации должен быть уникальным в пределах центра задач.Each orchestration instance ID must be unique within a task hub.

Ниже приведены некоторые правила для идентификаторов экземпляров.The following are some rules about instance IDs:

  • Идентификаторы экземпляров должны содержать от 1 до 256 символов.Instance IDs must be between 1 and 256 characters.
  • Идентификаторы экземпляров не должны начинаться со знака @.Instance IDs must not start with @.
  • Идентификаторы экземпляров не должны содержать символы /, \, # или ?.Instance IDs must not contain /, \, #, or ? characters.
  • Идентификаторы экземпляров не должны содержать управляющие символы.Instance IDs must not contain control characters.

Примечание

Обычно рекомендуется по мере возможности использовать автоматически создаваемые идентификаторы экземпляров.It is generally recommended to use autogenerated instance IDs whenever possible. Созданные пользователем идентификаторы экземпляров предназначены для сценариев, в которых существует сопоставление "один к одному" между экземпляром оркестрации и некоторой внешней сущностью приложения, такой как заказ на покупку или документ.User-generated instance IDs are intended for scenarios where there is a one-to-one mapping between an orchestration instance and some external application-specific entity, like a purchase order or a document.

Идентификатор экземпляра оркестрации является обязательным параметром для большинства операций управления экземпляром.An orchestration's instance ID is a required parameter for most instance management operations. Они также важны для диагностики, например для поиска в данных отслеживания оркестрации в Application Insights для устранения неполадок или аналитики.They are also important for diagnostics, such as searching through orchestration tracking data in Application Insights for troubleshooting or analytics purposes. По этой причине рекомендуется сохранять созданные идентификаторы экземпляров за пределами текущей среды (например, в базе данных или в журналах приложений), где на них можно будет легко ссылаться позже.For this reason, it is recommended to save generated instance IDs to some external location (for example, a database or in application logs) where they can be easily referenced later.

НадежностьReliability

Функции оркестратора надежно сохраняют свое состояние выполнения с помощью конструктивного шаблона Источник событий.Orchestrator functions reliably maintain their execution state by using the event sourcing design pattern. Вместо непосредственного сохранения текущего состояния оркестрации платформа устойчивых задач использует инкрементируемое хранилище для записи полной последовательности действий, взятых из функции оркестрации.Instead of directly storing the current state of an orchestration, the Durable Task Framework uses an append-only store to record the full series of actions the function orchestration takes. Инкрементируемое хранилище обладает множеством преимуществ по сравнению с выполнением дампа полного состояния среды выполнения.An append-only store has many benefits compared to "dumping" the full runtime state. К этим преимуществам относятся: повышение производительности, масштабируемость и скорость реагирования.Benefits include increased performance, scalability, and responsiveness. Вы также получаете итоговую согласованность данных о транзакциях и все аудиторские следы и журналы.You also get eventual consistency for transactional data and full audit trails and history. Аудиторские следы поддерживают надежные компенсирующие действия.The audit trails support reliable compensating actions.

Устойчивые функции прозрачно используют источник событий.Durable Functions uses event sourcing transparently. По сути оператор await (C#) или yield (JavaScript) в функции оркестратора передает управление потоком оркестратора обратно диспетчеру платформы устойчивых задач.Behind the scenes, the await (C#) or yield (JavaScript) operator in an orchestrator function yields control of the orchestrator thread back to the Durable Task Framework dispatcher. Затем диспетчер совершает любые новые действия, запланированные функцией оркестратора (например, вызов одной или нескольких дочерних функций или планирование устойчивого таймера) в хранилище.The dispatcher then commits any new actions that the orchestrator function scheduled (such as calling one or more child functions or scheduling a durable timer) to storage. Это прозрачное действие фиксации добавляется в журнал выполнения экземпляра оркестрации.The transparent commit action appends to the execution history of the orchestration instance. Журнал хранится в таблице хранилища.The history is stored in a storage table. Затем действие фиксации добавляет сообщения в очередь для планирования фактической работы.The commit action then adds messages to a queue to schedule the actual work. На этом этапе функцию оркестрации можно выгрузить из памяти.At this point, the orchestrator function can be unloaded from memory.

После того, как функции оркестрации получают больше работы (например, получено ответное сообщение или истек срок действия устойчивого таймера), оркестратор активируется и повторно запускает всю функцию с самого начала, чтобы перестроить локальное состояние.When an orchestration function is given more work to do (for example, a response message is received or a durable timer expires), the orchestrator wakes up and re-executes the entire function from the start to rebuild the local state. Если во время этого воспроизведения код пытается вызвать функцию (или выполнить любую другую асинхронную работу), платформа устойчивых задач просматривает журнал выполнения текущей оркестрации.During the replay, if the code tries to call a function (or do any other async work), the Durable Task Framework consults the execution history of the current orchestration. Если он обнаруживает, что функция действия уже выполнена и получен результат, он воспроизводит результат этой функции, а код оркестратора продолжает выполняться.If it finds that the activity function has already executed and yielded a result, it replays that function's result and the orchestrator code continues to run. Воспроизведение продолжится до тех пор, пока не завершится код функции или пока не будет запланирована новуя асинхронная работа.Replay continues until the function code is finished or until it has scheduled new async work.

Примечание

Чтобы шаблон воспроизведения работал правильно и надежно, код функции оркестратора должен быть детерминированным.In order for the replay pattern to work correctly and reliably, orchestrator function code must be deterministic. Дополнительные сведения об ограничениях кода для функций оркестратора см. в статье Orchestrator function code constraints (Ограничения кода для функций оркестратора).For more information about code restrictions for orchestrator functions, see the orchestrator function code constraints topic.

Примечание

Если функция оркестратора отправляет сообщения журнала, поведение при воспроизведении может привести к отправке дублированных сообщений журнала.If an orchestrator function emits log messages, the replay behavior may cause duplicate log messages to be emitted. Ознакомьтесь с разделом Ведение журнала, чтобы узнать больше о том, почему происходит такое поведение и как его устранить.See the Logging topic to learn more about why this behavior occures and how to work around it.

Журнал оркестрацийOrchestration history

Поведение источника событий в платформе устойчивых задач тесно связано с написанным кодом функции оркестратора.The event-sourcing behavior of the Durable Task Framework is closely coupled with the orchestrator function code you write. Предположим, у вас есть функция связывания действий оркестратора, например, следующая функция:Suppose you have an activity-chaining orchestrator function, like the following orchestrator function:

[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", "London"));

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

В каждой инструкции await (C#) или yield (JavaScript) платформа устойчивых задач создает контрольные точки состояния выполнения функции в некоторых устойчивых внутренних частях хранилища (обычно это хранилище таблиц Azure).At each await (C#) or yield (JavaScript) statement, the Durable Task Framework checkpoints the execution state of the function into some durable storage backend (typically Azure Table storage). Это состояние также называется журналом оркестрации.This state is what is referred to as the orchestration history.

Таблица журналаHistory table

Как правило, платформа устойчивых задач выполняет следующие действия в каждой контрольной точке:Generally speaking, the Durable Task Framework does the following at each checkpoint:

  1. Сохраняет журнал выполнения в таблицах службы хранилища Azure.Saves execution history into Azure Storage tables.
  2. Помещает в очередь сообщения для функций, которые хочет вызвать оркестратор.Enqueues messages for functions the orchestrator wants to invoke.
  3. Помещает в очередь сообщения для самого оркестратора, например сообщения устойчивого таймера.Enqueues messages for the orchestrator itself — for example, durable timer messages.

После создания контрольной точки функцию оркестратора можно удалить из памяти, пока для нее не появится работа.Once the checkpoint is complete, the orchestrator function is free to be removed from memory until there is more work for it to do.

Примечание

Служба хранилища Azure не предоставляет никаких гарантий выполнения транзакций между сохранением данных в хранилище таблиц и очередях.Azure Storage does not provide any transactional guarantees between saving data into table storage and queues. Для обработки ошибок поставщик хранилища устойчивых функций использует шаблоны итоговой согласованности.To handle failures, the Durable Functions storage provider uses eventual consistency patterns. Эти шаблоны позволяют избежать потери данных в случае аварийного завершения или потери возможности подключения в середине контрольной точки.These patterns ensure that no data is lost if there is a crash or loss of connectivity in the middle of a checkpoint.

По завершении приведенный выше журнал функций будет выглядеть примерно как в следующей таблице в хранилище таблиц Azure (следующий пример приведен в сокращенном виде):Upon completion, the history of the function shown earlier looks something like the following table in Azure Table Storage (abbreviated for illustration purposes):

PartitionKey (InstanceId)PartitionKey (InstanceId) EventTypeEventType Отметка времениTimestamp Входные данныеInput ИмяName РезультатResult СостояниеStatus
eaee885beaee885b ExecutionStartedExecutionStarted 2017-05-05T18:45:28.852Z2017-05-05T18:45:28.852Z nullnull E1_HelloSequenceE1_HelloSequence
eaee885beaee885b OrchestratorStartedOrchestratorStarted 2017-05-05T18:45:32.362Z2017-05-05T18:45:32.362Z
eaee885beaee885b TaskScheduledTaskScheduled 2017-05-05T18:45:32.670Z2017-05-05T18:45:32.670Z E1_SayHelloE1_SayHello
eaee885beaee885b OrchestratorCompletedOrchestratorCompleted 2017-05-05T18:45:32.670Z2017-05-05T18:45:32.670Z
eaee885beaee885b TaskCompletedTaskCompleted 2017-05-05T18:45:34.201Z2017-05-05T18:45:34.201Z """Hello Tokyo!""""""Hello Tokyo!"""
eaee885beaee885b OrchestratorStartedOrchestratorStarted 2017-05-05T18:45:34.232Z2017-05-05T18:45:34.232Z
eaee885beaee885b TaskScheduledTaskScheduled 2017-05-05T18:45:34.435Z2017-05-05T18:45:34.435Z E1_SayHelloE1_SayHello
eaee885beaee885b OrchestratorCompletedOrchestratorCompleted 2017-05-05T18:45:34.435Z2017-05-05T18:45:34.435Z
eaee885beaee885b TaskCompletedTaskCompleted 2017-05-05T18:45:34.763Z2017-05-05T18:45:34.763Z """Hello Seattle!""""""Hello Seattle!"""
eaee885beaee885b OrchestratorStartedOrchestratorStarted 2017-05-05T18:45:34.857Z2017-05-05T18:45:34.857Z
eaee885beaee885b TaskScheduledTaskScheduled 2017-05-05T18:45:34.857Z2017-05-05T18:45:34.857Z E1_SayHelloE1_SayHello
eaee885beaee885b OrchestratorCompletedOrchestratorCompleted 2017-05-05T18:45:34.857Z2017-05-05T18:45:34.857Z
eaee885beaee885b TaskCompletedTaskCompleted 2017-05-05T18:45:34.919Z2017-05-05T18:45:34.919Z """Hello London!""""""Hello London!"""
eaee885beaee885b OrchestratorStartedOrchestratorStarted 2017-05-05T18:45:35.032Z2017-05-05T18:45:35.032Z
eaee885beaee885b OrchestratorCompletedOrchestratorCompleted 2017-05-05T18:45:35.044Z2017-05-05T18:45:35.044Z
eaee885beaee885b ExecutionCompletedExecutionCompleted 2017-05-05T18:45:35.044Z2017-05-05T18:45:35.044Z "[""Hello Tokyo!"",""Hello Seattle!"",""Hello London!""]""[""Hello Tokyo!"",""Hello Seattle!"",""Hello London!""]" ЗавершеноCompleted

Некоторые сведения о значениях столбцов:A few notes on the column values:

  • PartitionKey. Содержит идентификатор экземпляра оркестрации.PartitionKey: Contains the instance ID of the orchestration.
  • EventType. Предоставляет тип события.EventType: Represents the type of the event. Принимается один из следующих типов:May be one of the following types:
    • OrchestrationStarted. Функция оркестратора, которая возобновлена после состояния ожидания или выполняется впервые.OrchestrationStarted: The orchestrator function resumed from an await or is running for the first time. Столбец Timestamp используется, чтобы заполнить детерминированное значение для интерфейсов API CurrentUtcDateTime (.NET) и currentUtcDateTime (JavaScript).The Timestamp column is used to populate the deterministic value for the CurrentUtcDateTime (.NET) and currentUtcDateTime (JavaScript) APIs.
    • ExecutionStarted. Функция оркестратора, которая начала выполнение впервые.ExecutionStarted: The orchestrator function started executing for the first time. Это событие также содержит входные данные функции в столбце Input.This event also contains the function input in the Input column.
    • TaskScheduled. Функция действия была запланирована.TaskScheduled: An activity function was scheduled. Имя функции действия сохраняется в столбце Name.The name of the activity function is captured in the Name column.
    • TaskCompleted. Функция действия выполнена.TaskCompleted: An activity function completed. Результаты функции находятся в столбце Result.The result of the function is in the Result column.
    • TimerCreated. Устойчивый таймер создан.TimerCreated: A durable timer was created. Столбец FireAt содержит запланированное время в формате UTC, когда истекает срок действия таймера.The FireAt column contains the scheduled UTC time at which the timer expires.
    • TimerFired. Активирован устойчивый таймер.TimerFired: A durable timer fired.
    • EventRaised. Внешнее событие было отправлено в экземпляр оркестрации.EventRaised: An external event was sent to the orchestration instance. Столбец Name содержит имя события, а столбец Input — полезные данные события.The Name column captures the name of the event and the Input column captures the payload of the event.
    • OrchestratorCompleted. Функция оркестратора находится в состоянии ожидания.OrchestratorCompleted: The orchestrator function awaited.
    • ContinueAsNew. Функция оркестратора выполнена и автоматически перезапущена с новым состоянием.ContinueAsNew: The orchestrator function completed and restarted itself with new state. Столбец Result содержит значение, которое используется в качестве входных данных в перезапущенном экземпляре.The Result column contains the value, which is used as the input in the restarted instance.
    • ExecutionCompleted. Функция оркестратора выполнена (или завершилась сбоем).ExecutionCompleted: The orchestrator function ran to completion (or failed). Выходные данные функции или сведения об ошибке хранятся в столбце Result.The outputs of the function or the error details are stored in the Result column.
  • Timestamp. Метка времени события журнала в формате UTC.Timestamp: The UTC timestamp of the history event.
  • Name. Имя вызванной функции.Name: The name of the function that was invoked.
  • Input. Входные данные функции в формате JSON.Input: The JSON-formatted input of the function.
  • Result. Выходные данные функции (то есть ее возвращаемое значение).Result: The output of the function; that is, its return value.

Предупреждение

Хотя это удобно использовать в качестве средства отладки, не используйте в таблице никакие зависимости.While it's useful as a debugging tool, don't take any dependency on this table. Они могут измениться при развитии расширения устойчивых функций.It may change as the Durable Functions extension evolves.

Каждый раз, когда функция возобновляется из состояния await (C#) или yield (JavaScript), платформа устойчивых задач повторно выполняет функцию оркестратора с нуля.Every time the function resumes from an await (C#) or yield (JavaScript), the Durable Task Framework reruns the orchestrator function from scratch. При каждом повторном выполнении она учитывает журнал выполнения, чтобы определить, выполнялась ли асинхронная операция.On each rerun, it consults the execution history to determine whether the current async operation has taken place. Если операция выполнялась, платформа немедленно воспроизводит выходные данные этой операции и переходит к следующему объекту с состоянием await (C#) или yield (JavaScript).If the operation took place, the framework replays the output of that operation immediately and moves on to the next await (C#) or yield (JavaScript). Этот процесс продолжается, пока не будет воспроизведен весь журнал.This process continues until the entire history has been replayed. После воспроизведения текущего журнала локальные переменные будут восстановлены до своих прежних значений.Once the current history has been replayed, the local variables will have been restored to their previous values.

Возможности и шаблоныFeatures and patterns

В следующих разделах описываются функции и шаблоны функций оркестратора.The next sections describe the features and patterns of orchestrator functions.

Вложенные оркестрацииSub-orchestrations

Функции оркестратора могут вызывать функции действия, а также другие функции оркестратора.Orchestrator functions can call activity functions, but also other orchestrator functions. Например, вы можете построить создать крупную оркестрацию из библиотеки функций оркестратора.For example, you can build a larger orchestration out of a library of orchestrator functions. Или можно запустить несколько экземпляров функции оркестратора одновременно.Or, you can run multiple instances of an orchestrator function in parallel.

Дополнительные сведения и примеры см. в статье Sub-orchestrations in Durable Functions (Azure Functions) (Вложенные оркестрации в устойчивых функциях (Функции Azure)).For more information and for examples, see the Sub-orchestrations article.

Устойчивые таймерыDurable timers

Оркестрации могут планировать устойчивые таймеры для реализации задержек или для настройки обработки времени ожидания при асинхронных действиях.Orchestrations can schedule durable timers to implement delays or to set up timeout handling on async actions. Используйте устойчивые таймеры в функциях оркестратора вместо Thread.Sleep и Task.Delay (C#) или setTimeout() и setInterval() (JavaScript).Use durable timers in orchestrator functions instead of Thread.Sleep and Task.Delay (C#) or setTimeout() and setInterval() (JavaScript).

Дополнительные сведения и примеры см. в статье Timers in Durable Functions (Azure Functions) (Таймеры в устойчивых функциях (Функции Azure)).For more information and for examples, see the Durable timers article.

Внешние событияExternal events

Функции оркестратора могут ожидать передачи внешних событий для обновления экземпляра оркестрации.Orchestrator functions can wait for external events to update an orchestration instance. Эта возможность устойчивых функций часто используется для обработки действий человека или других внешних обратных вызовов.This Durable Functions feature often is useful for handling a human interaction or other external callbacks.

Дополнительные сведения и примеры см. в статье Handling external events in Durable Functions (Azure Functions) (Обработка внешних событий в устойчивых функциях (Функции Azure)).For more information and for examples, see the External events article.

Обработка ошибокError handling

Функции оркестратора могут использовать функции обработки ошибок языка программирования.Orchestrator functions can use the error-handling features of the programming language. Существующие шаблоны, такие как try/catch, поддерживаются в коде оркестрации.Existing patterns like try/catch are supported in orchestration code.

Функции оркестратора также могут добавлять политики повтора к действиям или функциям вложенных оркестраций, которые они вызывают.Orchestrator functions can also add retry policies to the activity or sub-orchestrator functions that they call. Если действие или функция вложенной оркестрации завершается сбоем с исключением, указанная политика повтора может автоматически задерживать и повторять выполнение исключения до указанного числа раз.If an activity or sub-orchestrator function fails with an exception, the specified retry policy can automatically delay and retry the execution up to a specified number of times.

Примечание

Если в функции оркестратора есть необработанное исключение, экземпляр оркестрации завершится в состоянии Failed.If there is an unhandled exception in an orchestrator function, the orchestration instance will complete in a Failed state. Экземпляр оркестрации нельзя повторить после сбоя.An orchestration instance cannot be retried once it has failed.

Дополнительные сведения и примеры см. в статье Handling errors in Durable Functions (Azure Functions) (Обработка ошибок в устойчивых функциях (Функции Azure)).For more information and for examples, see the Error handling article.

Критические разделы (Устойчивые функции 2.x сейчас поддерживается только .NET)Critical sections (Durable Functions 2.x, currently .NET only)

Экземпляры оркестрации являются однопотоковыми, поэтому нет необходимости беспокоиться о состоянии гонки внутри оркестрации.Orchestration instances are single-threaded so it isn't necessary to worry about race conditions within an orchestration. Однако условия гонки возможны, когда оркестрации взаимодействуют с внешними системами.However, race conditions are possible when orchestrations interact with external systems. Чтобы устранить состояние гонки при взаимодействии с внешними системами, функции оркестратора могут определять критические секции с помощью метода LockAsync в .NET.To mitigate race conditions when interacting with external systems, orchestrator functions can define critical sections using a LockAsync method in .NET.

В следующем примере кода показана функция оркестратора, определяющая критическую секцию.The following sample code shows an orchestrator function that defines a critical section. Она входит в критическую секцию, используя метод LockAsync.It enters the critical section using the LockAsync method. Этот метод требует передачи одной или нескольких ссылок на устойчивую сущность, которая длительно управляет состоянием блокировки.This method requires passing one or more references to a Durable Entity, which durably manages the lock state. Только один экземпляр этой оркестрации может одновременно выполнять код в критической секции.Only a single instance of this orchestration can execute the code in the critical section at a time.

[FunctionName("Synchronize")]
public static async Task Synchronize(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var lockId = new EntityId("LockEntity", "MyLockIdentifier");
    using (await context.LockAsync(lockId))
    {
        // critical section - only one orchestration can enter at a time
    }
}

Объект LockAsync приобретает устойчивые замки и возвращает объект IDisposable, который завершает критическую секцию при удалении.The LockAsync acquires the durable lock(s) and returns an IDisposable that ends the critical section when disposed. Этот результат IDisposable можно использовать вместе с блоком using, чтобы получить синтаксическое представление критической секции.This IDisposable result can be used together with a using block to get a syntactic representation of the critical section. Когда функция оркестратора входит в критическую секцию, только один экземпляр может выполнить этот блок кода.When an orchestrator function enters a critical section, only one instance can execute that block of code. Любые другие экземпляры, которые пытаются войти в критическую секцию, будут заблокированы, пока предыдущий экземпляр не выйдет из критической секции.Any other instances that try to enter the critical section will be blocked until the previous instance exits the critical section.

Функция критической секции также полезна для согласования изменений в устойчивых сущностях.The critical section feature is also useful for coordinating changes to durable entities. Дополнительные сведения о критических секциях см. в статье Entity functions (preview) (Функции сущностей (предварительная версия)).For more information about critical sections, see the Durable entities "Entity coordination" topic.

Примечание

Критические секции доступны в Устойчивых функциях версии 2.0 и выше.Critical sections are available in Durable Functions 2.0 and above. В настоящее время только оркестрации .NET реализуют эту функцию.Currently, only .NET orchestrations implement this feature.

Вызов конечных точек HTTP (Устойчивые функции 2.x)Calling HTTP endpoints (Durable Functions 2.x)

Функциям оркестратора не разрешено выполнять операции ввода-вывода, как описано в ограничениях кода функции оркестратора.Orchestrator functions aren't permitted to do I/O, as described in orchestrator function code constraints. Типичным обходным решением для этого ограничения является перенос любого кода, который должен выполнять операции ввода-вывода, в функцию действия.The typical workaround for this limitation is to wrap any code that needs to do I/O in an activity function. Оркестрации, которые взаимодействуют с внешними системами, часто используют функции действий для выполнения вызовов HTTP и возврата результата в оркестрацию.Orchestrations that interact with external systems frequently use activity functions to make HTTP calls and return the result to the orchestration.

Чтобы упростить этот распространенный шаблон, функции оркестратора могут использовать метод CallHttpAsync для вызова API-интерфейсов HTTP напрямую.To simplify this common pattern, orchestrator functions can use the CallHttpAsync method to invoke HTTP APIs directly.

[FunctionName("CheckSiteAvailable")]
public static async Task CheckSiteAvailable(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    Uri url = context.GetInput<Uri>();

    // Makes an HTTP GET request to the specified endpoint
    DurableHttpResponse response = 
        await context.CallHttpAsync(HttpMethod.Get, url);

    if (response.StatusCode >= 400)
    {
        // handling of error codes goes here
    }
}

Помимо поддержки базовых шаблонов запросов/ответов, метод поддерживает автоматическую обработку общих асинхронных шаблонов опроса HTTP 202, а также проверку подлинности с помощью внешних служб с использованием Управляемых удостоверений.In addition to supporting basic request/response patterns, the method supports automatic handling of common async HTTP 202 polling patterns, and also supports authentication with external services using Managed Identities.

Дополнительные сведения и подробные примеры см. в статье HTTP Features (Функции HTTP).For more information and for detailed examples, see the HTTP features article.

Примечание

Вызов конечных точек HTTP напрямую из функций оркестратора доступен в Устойчивых функциях версии 2.0 и выше.Calling HTTP endpoints directly from orchestrator functions is available in Durable Functions 2.0 and above.

Передача нескольких параметровPassing multiple parameters

Передать несколько параметров непосредственно в функцию действия нельзя.It isn't possible to pass multiple parameters to an activity function directly. Мы рекомендуем передать массив объектов или составные объектов.The recommendation is to pass in an array of objects or composite objects.

В .NET можно также использовать объекты ValueTuples.In .NET you can also use ValueTuples objects. В следующем примере используются новые функции ValueTuples, добавленные в C# 7:The following sample is using new features of ValueTuples added with C# 7:

[FunctionName("GetCourseRecommendations")]
public static async Task<object> RunOrchestrator(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    string major = "ComputerScience";
    int universityYear = context.GetInput<int>();

    object courseRecommendations = await context.CallActivityAsync<object>(
        "CourseRecommendations",
        (major, universityYear));
    return courseRecommendations;
}

[FunctionName("CourseRecommendations")]
public static async Task<object> Mapper([ActivityTrigger] IDurableActivityContext inputs)
{
    // parse input for student's major and year in university
    (string Major, int UniversityYear) studentInfo = inputs.GetInput<(string, int)>();

    // retrieve and return course recommendations by major and university year
    return new
    {
        major = studentInfo.Major,
        universityYear = studentInfo.UniversityYear,
        recommendedCourses = new []
        {
            "Introduction to .NET Programming",
            "Introduction to Linux",
            "Becoming an Entrepreneur"
        }
    };
}

Дальнейшие действияNext steps