Управление экземплярами в Устойчивых функциях в Azure

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

Запуск экземпляров

Метод start-new (или schedule-new) в привязке клиента оркестрации запускает новый экземпляр оркестрации. На внутреннем уровне этот метод записывает сообщение с помощью поставщика хранилища Устойчивых функций, а затем возвращает ответ. Это сообщение асинхронно активирует запуск функции оркестрации с указанным именем.

Ниже приведены параметры для запуска нового экземпляра оркестрации:

  • Name. Имя функции оркестратора, для которой назначается запуск.
  • Input. Любые данные, сериализуемые в формат JSON, которые нужно передать в функцию оркестратора как входные данные.
  • InstanceId. Уникальный идентификатор экземпляра (необязательно). Если не указать этот параметр, метод будет использовать случайный идентификатор.

Совет

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

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

[FunctionName("HelloWorldQueueTrigger")]
public static async Task Run(
    [QueueTrigger("start-queue")] string input,
    [DurableClient] IDurableOrchestrationClient starter,
    ILogger log)
{
    string instanceId = await starter.StartNewAsync("HelloWorld", input);
    log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
}

Примечание.

Предыдущий пример на C# предназначен для Устойчивых функций версии 2.x. Для расширения "Устойчивые функции" версии 1.x необходимо использовать атрибут OrchestrationClient, а не DurableClient. Также следует использовать тип параметра DurableOrchestrationClient вместо IDurableOrchestrationClient. Дополнительные сведения о различиях между версиями см. в статье Версии устойчивых функций.

Azure Functions Core Tools

Вы также можете запустить экземпляр непосредственно с помощью func durable start-newкоманды в Core Tools, в которую следует передать указанные ниже параметры.

  • function-name (обязательный): имя запускаемой функции.
  • input (необязательный): входные данные функции (встроенные или в файле JSON). Поставьте в начале пути к файлу символ @ (например, @path/to/file.json).
  • id (необязательный): идентификатор экземпляра оркестрации. Если не указать этот параметр, команда будет использовать случайный GUID.
  • connection-string-setting (необязательный): имя параметра приложения, содержащего нужную строку подключения к хранилищу. По умолчанию используется AzureWebJobsStorage.
  • task-hub-name (необязательный): имя используемого центра задач устойчивых функций. По умолчанию используется DurableFunctionsHub. Это также можно задать в host.json с помощью durableTask:HubName.

Примечание.

Предполагается, что команды Core Tools запускаются из корневого каталога приложения-функции. При явном предоставлении параметров connection-string-setting и task-hub-name можно выполнять команды из любого каталога. Несмотря на то, что эти команды можно выполнять без работающего узла приложения-функции, может оказаться, что вы не сможете наблюдать некоторые результаты, если узел не запущен. Например, команда start-new ставит сообщение запуска в очередь целевого центра задач, но оркестрация запустится только после запуска хост-процесса приложения-функции, который может обработать сообщение.

Примечание.

В целях сохранения состояния среды выполнения команды Core Tools в настоящее время поддерживаются только при использовании поставщика службы хранилища Azure по умолчанию.

Следующая команда запускает функцию HelloWorld и передает ей содержимое файла counter-data.json:

func durable start-new --function-name HelloWorld --input @counter-data.json --task-hub-name TestTaskHub

Запрос к экземпляру

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

Метод get-status в привязке клиента оркестрации запрашивает состояние экземпляра оркестрации.

Он принимает параметры instanceId (обязательный), showHistory (необязательный), showHistoryOutput (необязательный) и showInput (необязательный).

  • showHistory: если задано значение true, ответ будет содержать журнал выполнения.
  • showHistoryOutput: если задано значение true, журнал выполнения будет содержать выходные данные действия.
  • showInput: если задано значение false, ответ будет содержать входные данные функции. Значение по умолчанию — true.

Этот метод возвращает объект со следующими свойствами:

  • Name. Имя функции оркестратора.
  • InstanceId. Идентификатор экземпляра оркестрации (будет совпадать с переданным значением instanceId).
  • CreatedTime. Время создания, то есть время начала выполнения функции оркестратора.
  • LastUpdatedTime. Время прохождения последней контрольной точки оркестрации.
  • Input. Входные данные функции в формате JSON. Это поле не заполняется, если showInput имеет значение false.
  • CustomStatus. Настраиваемое значение состояния оркестрации в формате JSON.
  • Output. Выходные данные функции в формате JSON (если выполнение функции успешно завершено). Если выполнение функции оркестратора завершилось сбоем, это свойство содержит сведения об ошибке. Если функция оркестратора была приостановлена или завершена, это свойство содержит сведения о причине приостановки или завершения (при наличии).
  • RuntimeStatus: одно из следующих значений:
    • Pending. Выполнение экземпляра было запланировано, но еще не начато.
    • Running. Началось выполнение экземпляра.
    • Completed. Выполнение экземпляра завершилось в обычном режиме.
    • ContinuedAsNew. Экземпляр выполнил перезапуск с очисткой журнала выполнения. Это промежуточное состояние.
    • Failed. Выполнение экземпляра завершилось ошибкой.
    • Terminated: выполнение экземпляра было прервано.
    • Suspended. Экземпляр был приостановлен и может быть возобновлен позднее.
  • History: журнал выполнения оркестрации. Это поле заполняется, только если showHistory имеет значение true.

Примечание.

Оркестратор не помечается как Completed до завершения всех своих запланированных задач и последующего возврата. Иными словами, оркестратор не имеет достаточных прав на доступ к своей инструкции return, чтобы она была помечена как Completed. Это особенно важно в тех случаях, когда используется WhenAny; эти оркестраторы часто выполняют return до выполнения всех запланированных задач.

Этот метод возвращает null (.NET и Java), undefined (JavaScript) или None (Python), если экземпляр не существует.

[FunctionName("GetStatus")]
public static async Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("check-status-queue")] string instanceId)
{
    DurableOrchestrationStatus status = await client.GetStatusAsync(instanceId);
    // do something based on the current status.
}

Примечание.

Предыдущий пример на C# предназначен для Устойчивых функций версии 2.x. Для расширения "Устойчивые функции" версии 1.x необходимо использовать атрибут OrchestrationClient, а не DurableClient. Также следует использовать тип параметра DurableOrchestrationClient вместо IDurableOrchestrationClient. Дополнительные сведения о различиях между версиями см. в статье Версии устойчивых функций.

Azure Functions Core Tools

Кроме того, можно получить сведения о состоянии экземпляра оркестрации непосредственно с помощью func durable get-runtime-statusкоманды в Core Tools.

Примечание.

На данный момент команды Core Tools поддерживаются только при использовании поставщика службы хранилища Azure, применяемого по умолчанию, для сохранения состояния среды выполнения.

Команда durable get-runtime-status принимает следующие параметры.

  • id (обязательный): идентификатор экземпляра оркестрации.
  • show-input (необязательный): если задано значение true, ответ будет содержать входные данные функции. Значение по умолчанию — false.
  • show-output (необязательный): если задано значение true, ответ будет содержать выходные данные функции. Значение по умолчанию — false.
  • connection-string-setting (необязательный): имя параметра приложения, содержащего нужную строку подключения к хранилищу. Значение по умолчанию — AzureWebJobsStorage.
  • task-hub-name (необязательный): имя используемого центра задач устойчивых функций. Значение по умолчанию — DurableFunctionsHub. Его также можно задать в файле host.json, используя durableTask:HubName.

Указанная ниже команда получает состояние (включая входные и выходные данные) экземпляра с идентификатором 0ab8c55a66644d68a3a8b220b12d209c. Предполагается, что команда func выполняется из корневого каталога приложения-функции:

func durable get-runtime-status --id 0ab8c55a66644d68a3a8b220b12d209c --show-input true --show-output true

Команду durable get-history можно использовать для получения журнала экземпляра оркестрации. Она принимает следующие параметры.

  • id (обязательный): идентификатор экземпляра оркестрации.
  • connection-string-setting (необязательный): имя параметра приложения, содержащего нужную строку подключения к хранилищу. Значение по умолчанию — AzureWebJobsStorage.
  • task-hub-name (необязательный): имя используемого центра задач устойчивых функций. Значение по умолчанию — DurableFunctionsHub. Его также можно задать в файле host.json, используя durableTask:HubName.
func durable get-history --id 0ab8c55a66644d68a3a8b220b12d209c

Запрос ко всем экземплярам

API-интерфейсы в языковом пакете SDK можно использовать для запроса состояний всех экземпляров оркестрации в центре задач. Этот API list-instances или get-status возвращает список объектов, которые представляют экземпляры оркестрации, соответствующие параметрам запроса.

[FunctionName("GetAllStatus")]
public static async Task Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient client,
    ILogger log)
{
    var noFilter = new OrchestrationStatusQueryCondition();
    OrchestrationStatusQueryResult result = await client.ListInstancesAsync(
        noFilter,
        CancellationToken.None);
    foreach (DurableOrchestrationStatus instance in result.DurableOrchestrationState)
    {
        log.LogInformation(JsonConvert.SerializeObject(instance));
    }
    
    // Note: ListInstancesAsync only returns the first page of results.
    // To request additional pages provide the result.ContinuationToken
    // to the OrchestrationStatusQueryCondition's ContinuationToken property.
}

Примечание.

Предыдущий пример на C# предназначен для Устойчивых функций версии 2.x. Для расширения "Устойчивые функции" версии 1.x необходимо использовать атрибут OrchestrationClient, а не DurableClient. Также следует использовать тип параметра DurableOrchestrationClient вместо IDurableOrchestrationClient. Дополнительные сведения о различиях между версиями см. в статье Версии устойчивых функций.

Azure Functions Core Tools

Кроме того, можно запрашивать экземпляры непосредственно с помощью func durable get-instancesкоманды в Core Tools.

Примечание.

В целях сохранения состояния среды выполнения команды Core Tools в настоящее время поддерживаются только при использовании поставщика службы хранилища Azure по умолчанию.

Команда durable get-instances принимает следующие параметры.

  • top (необязательный): эта команда поддерживает разбиение на страницы. Этот параметр соответствует количеству экземпляров, получаемых по запросу. Значение по умолчанию равно 10.
  • continuation-token (необязательный): маркер, указывающий на извлекаемую страницу или раздел экземпляров. Каждое выполнение get-instances возвращает маркер для извлечения следующего набора экземпляров.
  • connection-string-setting (необязательный): имя параметра приложения, содержащего нужную строку подключения к хранилищу. Значение по умолчанию — AzureWebJobsStorage.
  • task-hub-name (необязательный): имя используемого центра задач устойчивых функций. Значение по умолчанию — DurableFunctionsHub. Его также можно задать в файле host.json, используя durableTask:HubName.
func durable get-instances

Запрос к экземпляру с использованием фильтров

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

[FunctionName("QueryStatus")]
public static async Task Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient client,
    ILogger log)
{
    // Get the first 100 running or pending instances that were created between 7 and 1 day(s) ago
    var queryFilter = new OrchestrationStatusQueryCondition
    {
        RuntimeStatus = new[]
        {
            OrchestrationRuntimeStatus.Pending,
            OrchestrationRuntimeStatus.Running,
        },
        CreatedTimeFrom = DateTime.UtcNow.Subtract(TimeSpan.FromDays(7)),
        CreatedTimeTo = DateTime.UtcNow.Subtract(TimeSpan.FromDays(1)),
        PageSize = 100,
    };
    
    OrchestrationStatusQueryResult result = await client.ListInstancesAsync(
        queryFilter,
        CancellationToken.None);
    foreach (DurableOrchestrationStatus instance in result.DurableOrchestrationState)
    {
        log.LogInformation(JsonConvert.SerializeObject(instance));
    }
}

Примечание.

Предыдущий пример на C# предназначен для Устойчивых функций версии 2.x. Для расширения "Устойчивые функции" версии 1.x необходимо использовать атрибут OrchestrationClient, а не DurableClient. Также следует использовать тип параметра DurableOrchestrationClient вместо IDurableOrchestrationClient. Дополнительные сведения о различиях между версиями см. в статье Версии устойчивых функций.

Azure Functions Core Tools

В Azure Functions Core Tools можно также использовать команду durable get-instances с фильтрами. В дополнение к упомянутым выше параметрам top, continuation-token, connection-string-setting и task-hub-name можно также использовать три параметра фильтра (created-after, created-before и runtime-status).

Примечание.

В целях сохранения состояния среды выполнения команды Core Tools в настоящее время поддерживаются только при использовании поставщика службы хранилища Azure по умолчанию.

Далее приводятся параметры для команды durable get-instances.

  • created-after (необязательный): получение экземпляров, созданных после этой даты и времени в формате UTC. Принимаются значения даты и времени в формате ISO 8601.
  • created-before (необязательный): получение экземпляров, созданных до этой даты и времени в формате UTC. Принимаются значения даты и времени в формате ISO 8601.
  • runtime-status (необязательный): получение экземпляров с определенным состоянием (например: "выполняется" или "завершено"). Можно указать несколько состояний (через пробел).
  • top (необязательный): количество экземпляров, получаемых по запросу. Значение по умолчанию равно 10.
  • continuation-token (необязательный): маркер, указывающий на извлекаемую страницу или раздел экземпляров. Каждое выполнение get-instances возвращает маркер для извлечения следующего набора экземпляров.
  • connection-string-setting (необязательный): имя параметра приложения, содержащего нужную строку подключения к хранилищу. Значение по умолчанию — AzureWebJobsStorage.
  • task-hub-name (необязательный): имя используемого центра задач устойчивых функций. Значение по умолчанию — DurableFunctionsHub. Его также можно задать в файле host.json, используя durableTask:HubName.

Если не указать фильтры (created-after, created-before или runtime-status), команда просто извлекает экземпляры top без учета состояния выполнения или времени создания.

func durable get-instances --created-after 2021-03-10T13:57:31Z --created-before  2021-03-10T23:59Z --top 15

Завершение экземпляров

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

Эти два параметра API терминации являются идентификатором экземпляра и строкой причины, которые сохраняются в журналах и в сведениях о состоянии экземпляра.

[FunctionName("TerminateInstance")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("terminate-queue")] string instanceId)
{
    string reason = "Found a bug";
    return client.TerminateAsync(instanceId, reason);
}

Примечание.

Предыдущий пример на C# предназначен для Устойчивых функций версии 2.x. Для расширения "Устойчивые функции" версии 1.x необходимо использовать атрибут OrchestrationClient, а не DurableClient. Также следует использовать тип параметра DurableOrchestrationClient вместо IDurableOrchestrationClient. Дополнительные сведения о различиях между версиями см. в статье Версии устойчивых функций.

Завершенный экземпляр в конечном итоге перейдет в состояние Terminated. Однако этот переход не выполнится немедленно. Вместо этого операция завершения поставится в очередь в центре задач наряду с другими операциями для этого экземпляра. Интерфейсы API запроса к экземпляру можно использовать для получения сведений о том, когда завершенный экземпляр фактически достиг состояния Terminated.

Примечание.

Завершение работы экземпляра на данный момент не объявляется. Функции действий и суборкестраций выполнятся до конца, даже если экземпляр оркестрации, вызвавший их, будет завершен.

Приостановка и возобновление экземпляров

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

Эти два параметра API приостановки являются идентификатором экземпляра и строкой причины, которые сохраняются в журналах и в сведениях о состоянии экземпляра.

[FunctionName("SuspendResumeInstance")]
public static async Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("suspend-resume-queue")] string instanceId)
{
    string suspendReason = "Need to pause workflow";
    await client.SuspendAsync(instanceId, suspendReason);
    
    // Wait for 30 seconds to ensure that the orchestrator state is updated to suspended. 
    DateTime dueTime = context.CurrentUtcDateTime.AddSeconds(30);
    await context.CreateTimer(dueTime, CancellationToken.None);
    
    string resumeReason = "Continue workflow";
    await client.ResumeAsync(instanceId, resumeReason);
}

Приостановленный экземпляр в конечном итоге перейдет в состояние Suspended. Однако этот переход не выполнится немедленно. Вместо этого операция приостановки поставится в очередь в центре задач наряду с другими операциями для этого экземпляра. Интерфейсы API запроса к экземпляру можно использовать для получения сведений о том, когда запущенный экземпляр фактически достиг состояния Suspended.

При возобновлении работы приостановленного оркестратора его состояние вернется на Running.

Azure Functions Core Tools

Кроме того, можно прекратить работу экземпляра оркестрации непосредственно с помощью func durable terminateкоманды в Core Tools.

Примечание.

В целях сохранения состояния среды выполнения команды Core Tools в настоящее время поддерживаются только при использовании поставщика службы хранилища Azure по умолчанию.

Команда durable terminate принимает следующие параметры.

  • id (обязательный): идентификатор завершаемого экземпляра оркестрации.
  • reason (необязательный): причина завершения.
  • connection-string-setting (необязательный): имя параметра приложения, содержащего нужную строку подключения к хранилищу. Значение по умолчанию — AzureWebJobsStorage.
  • task-hub-name (необязательный): имя используемого центра задач устойчивых функций. Значение по умолчанию — DurableFunctionsHub. Его также можно задать в файле host.json, используя durableTask:HubName.

Указанная ниже команда завершает работу экземпляра оркестрации с идентификатором 0ab8c55a66644d68a3a8b220b12d209c.

func durable terminate --id 0ab8c55a66644d68a3a8b220b12d209c --reason "Found a bug"

Отправка событий в экземпляры

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

Уведомления о событиях можно отправлять в выполняемые экземпляры с помощью API вызова событияклиента оркестрации. Оркестрации могут прослушивать эти события и реагировать на них с помощью API оркестратора ожидания внешних событий.

Ниже приведены параметры для вызова события.

  • Идентификатор экземпляра — уникальный идентификатор экземпляра.
  • Имя события — имя отправляемого события.
  • Данные события — полезные данные, сериализуемые в формате JSON, для отправки в экземпляр.
[FunctionName("RaiseEvent")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("event-queue")] string instanceId)
{
    int[] eventData = new int[] { 1, 2, 3 };
    return client.RaiseEventAsync(instanceId, "MyEvent", eventData);
}

Примечание.

Предыдущий пример на C# предназначен для Устойчивых функций версии 2.x. Для расширения "Устойчивые функции" версии 1.x необходимо использовать атрибут OrchestrationClient, а не DurableClient. Также следует использовать тип параметра DurableOrchestrationClient вместо IDurableOrchestrationClient. Дополнительные сведения о различиях между версиями см. в статье Версии устойчивых функций.

Примечание.

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

Azure Functions Core Tools

Кроме того, можно создать событие для экземпляра оркестрации непосредственно с помощью func durable raise-eventкоманды в Core Tools.

Примечание.

В целях сохранения состояния среды выполнения команды Core Tools в настоящее время поддерживаются только при использовании поставщика службы хранилища Azure по умолчанию.

Команда durable raise-event принимает следующие параметры.

  • id (обязательный): идентификатор экземпляра оркестрации.
  • event-name: имя вызываемого события.
  • event-data (необязательный): данные, отправляемые в экземпляр оркестрации. Можно указать путь к файлу JSON либо же указать данные прямо в командной строке.
  • connection-string-setting (необязательный): имя параметра приложения, содержащего нужную строку подключения к хранилищу. Значение по умолчанию — AzureWebJobsStorage.
  • task-hub-name (необязательный): имя используемого центра задач устойчивых функций. Значение по умолчанию — DurableFunctionsHub. Его также можно задать в файле host.json, используя durableTask:HubName.
func durable raise-event --id 0ab8c55a66644d68a3a8b220b12d209c --event-name MyEvent --event-data @eventdata.json
func durable raise-event --id 1234567 --event-name MyOtherEvent --event-data 3

Дождитесь, пока завершится оркестрация.

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

API ожидания завершения или создания ответа о состоянии проверки можно использовать для синхронного получения фактических выходных данных экземпляра оркестрации. По умолчанию этот метод имеет время ожидания 10 секунд и интервал опроса 1 секунду.

Ниже приведен пример функции HTTP-триггера, в котором показано, как использовать этот API:

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.

using System;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;

namespace VSSample
{
    public static class HttpSyncStart
    {
        private const string Timeout = "timeout";
        private const string RetryInterval = "retryInterval";

        [FunctionName("HttpSyncStart")]
        public static async Task<HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = "orchestrators/{functionName}/wait")]
            HttpRequestMessage req,
            [DurableClient] IDurableOrchestrationClient 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}'.");

            TimeSpan timeout = GetTimeSpan(req, Timeout) ?? TimeSpan.FromSeconds(30);
            TimeSpan retryInterval = GetTimeSpan(req, RetryInterval) ?? TimeSpan.FromSeconds(1);
            
            return await starter.WaitForCompletionOrCreateCheckStatusResponseAsync(
                req,
                instanceId,
                timeout,
                retryInterval);
        }

        private static TimeSpan? GetTimeSpan(HttpRequestMessage request, string queryParameterName)
        {
            string queryParameterStringValue = request.RequestUri.ParseQueryString()[queryParameterName];
            if (string.IsNullOrEmpty(queryParameterStringValue))
            {
                return null;
            }

            return TimeSpan.FromSeconds(double.Parse(queryParameterStringValue));
        }
    }
}

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

curl -X POST "http://localhost:7071/orchestrators/E1_HelloSequence/wait?timeout=2&retryInterval=0.5"

Примечание.

В приведенной выше команде cURL предполагается, что в проекте есть функция оркестратора с именем E1_HelloSequence. Из-за того, как написана функция для триггеров HTTP, ее можно заменить именем любой функции оркестратора в проекте.

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

  • Если экземпляр оркестрации завершит работу до истечения указанного времени ожидания (2 секунды в нашем примере), то фактический ответ от экземпляра оркестрации доставляется синхронно:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Thu, 14 Dec 2021 06:14:29 GMT
Transfer-Encoding: chunked

[
    "Hello Tokyo!",
    "Hello Seattle!",
    "Hello London!"
]
  • Если экземпляр оркестрации не успеет завершить работу до истечения указанного времени ожидания, возвращается ответ по умолчанию, как указано в статье Обнаружение URL-адреса API HTTP:
HTTP/1.1 202 Accepted
Content-Type: application/json; charset=utf-8
Date: Thu, 14 Dec 2021 06:13:51 GMT
Location: http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177?taskHub={taskHub}&connection={connection}&code={systemKey}
Retry-After: 10
Transfer-Encoding: chunked

{
    "id": "d3b72dddefce4e758d92f4d411567177",
    "sendEventPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/raiseEvent/{eventName}?taskHub={taskHub}&connection={connection}&code={systemKey}",
    "statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177?taskHub={taskHub}&connection={connection}&code={systemKey}",
    "terminatePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/terminate?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}",
    "suspendPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/suspend?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}",
    "resumePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/resume?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}"
}

Примечание.

Формат URL-адресов веб-перехватчиков может отличаться в зависимости от того, какая версия узла Функций Azure выполняется. Описанный выше пример предназначен для узла Функций Azure 3.0.

Получение URL-адресов веб-перехватчика для управления HTTP

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

API создания полезных данных управления HTTP имеет один указанный ниже параметр.

  • Идентификатор экземпляра — уникальный идентификатор экземпляра.

Эти методы возвращают объект со следующими строковыми свойствами:

  • Id — идентификатор экземпляра оркестрации (будет совпадать с переданным значением InstanceId).
  • StatusQueryGetUri — URL-адрес состояния экземпляра оркестрации.
  • SendEventPostUri — URL-адрес вызова события экземпляра оркестрации.
  • TerminatePostUri — URL-адрес завершения работы экземпляра оркестрации.
  • PurgeHistoryDeleteUri: URL-адрес "удаления из журнала" экземпляра оркестрации.
  • suspendPostUri — URL-адрес "приостановки" экземпляра оркестрации.
  • resumePostUri — URL-адрес "возобновления" экземпляра оркестрации.

Функции могут отсылать экземпляры этих объектов во внешние системы для мониторинга или вызова событий в соответствующих оркестрациях, как показано в следующих примерах:

[FunctionName("SendInstanceInfo")]
public static void SendInstanceInfo(
    [ActivityTrigger] IDurableActivityContext ctx,
    [DurableClient] IDurableOrchestrationClient client,
    [CosmosDB(
        databaseName: "MonitorDB",
        containerName: "HttpManagementPayloads",
        Connection = "CosmosDBConnectionSetting")]out dynamic document)
{
    HttpManagementPayload payload = client.CreateHttpManagementPayload(ctx.InstanceId);

    // send the payload to Azure Cosmos DB
    document = new { Payload = payload, id = ctx.InstanceId };
}

Примечание.

Предыдущий пример на C# предназначен для Устойчивых функций версии 2.x. Для Устойчивых функций версии 1.x необходимо использовать атрибут DurableActivityContext вместо IDurableActivityContext и OrchestrationClient вместо DurableClient. Также следует использовать тип параметра DurableOrchestrationClient вместо IDurableOrchestrationClient. Дополнительные сведения о различиях между версиями см. в статье Версии устойчивых функций.

Возврат экземпляров (предварительная версия)

При возникновении сбоя оркестрации в случае непредвиденной причины можно вернуть экземпляр в предыдущее работоспособное состояние, используя API, созданный для этой цели.

Примечание.

Этот API не является заменой правильной политики повторов и обработки ошибок. Вместо этого его следует применять исключительно в тех случаях, когда причини сбоя экземпляра оркестрации неизвестные. Оркестрации в состояниях, отличных Failed от (например, Running, , Pending, Terminated) Completedне могут быть "перевоожены". Дополнительные сведения о политике повторов и обработке ошибок см. в статье Обработка ошибок.

Используйте метод RewindAsync (.NET) или rewind (JavaScript) привязки клиента оркестрации, чтобы вернуть оркестрацию в состояние выполнения. Этот метод также приведет к повторному выполнению действий или ошибок выполнения суборкестрации, которые привели к сбою процесса оркестрации.

Например, предположим, у вас есть рабочий процесс, включающий ряд утверждений со стороны человека. Предположим, существует ряд функций действий, уведомляющих кого-то, что требуется утверждение и ожидающих ответа в режиме реального времени. Когда все действия по утверждению завершаются получением ответов или истекает время ожидания их выполнения, происходит сбой другого действия из-за ошибки настройки приложения (например, недопустимая строка подключения к базе данных). Как результат — сбой оркестрации в рабочем процессе. С помощью программного интерфейса RewindAsync (.NET) или rewind (JavaScript) администратор приложения может исправить ошибку конфигурации и вернуть к исходному состоянию сбойный экземпляр непосредственно перед сбоем. Ни одно из действий пользователя не нуждается в повторном утверждении, и оркестрацию теперь можно успешно завершить.

Примечание.

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

[FunctionName("RewindInstance")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("rewind-queue")] string instanceId)
{
    string reason = "Orchestrator failed and needs to be revived.";
    return client.RewindAsync(instanceId, reason);
}

Примечание.

Предыдущий пример на C# предназначен для Устойчивых функций версии 2.x. Для расширения "Устойчивые функции" версии 1.x необходимо использовать атрибут OrchestrationClient, а не DurableClient. Также следует использовать тип параметра DurableOrchestrationClient вместо IDurableOrchestrationClient. Дополнительные сведения о различиях между версиями см. в статье Версии устойчивых функций.

Azure Functions Core Tools

Кроме того, можно перемотать назад экземпляр оркестрации непосредственно с помощью func durable rewindкоманды в Core Tools.

Примечание.

В целях сохранения состояния среды выполнения команды Core Tools в настоящее время поддерживаются только при использовании поставщика службы хранилища Azure по умолчанию.

Команда durable rewind принимает следующие параметры.

  • id (обязательный): идентификатор экземпляра оркестрации.
  • reason (необязательный): причина возврата состояния экземпляра оркестрации.
  • connection-string-setting (необязательный): имя параметра приложения, содержащего нужную строку подключения к хранилищу. Значение по умолчанию — AzureWebJobsStorage.
  • task-hub-name (необязательный): имя используемого центра задач устойчивых функций. По умолчанию используется имя центра задач в файле host.json.
func durable rewind --id 0ab8c55a66644d68a3a8b220b12d209c --reason "Orchestrator failed and needs to be revived."

Удаление экземпляра из журнала

Чтобы удалить все данные, связанные с оркестрацией, можно удалить этот экземпляр из журнала. Например, может потребоваться удалить все ресурсы хранилища, связанные с завершенным экземпляром. Для этого используйте API удаления экземпляра, определенный клиентом оркестрации.

В первом примере показано, как удалить один экземпляр оркестрации.

[FunctionName("PurgeInstanceHistory")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("purge-queue")] string instanceId)
{
    return client.PurgeInstanceHistoryAsync(instanceId);
}

В следующем примере показана активируемая по таймеру функция, которая удаляет из журнала все экземпляры оркестрации, выполненные после указанного интервала времени. В этом случае удаляются данные обо всех экземплярах, выполненных более 30 дней назад. В этом примере запуск функции запланирован один раз в день в 12:00 в формате UTC.

[FunctionName("PurgeInstanceHistory")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [TimerTrigger("0 0 12 * * *")] TimerInfo myTimer)
{
    return client.PurgeInstanceHistoryAsync(
        DateTime.MinValue,
        DateTime.UtcNow.AddDays(-30),  
        new List<OrchestrationStatus>
        {
            OrchestrationStatus.Completed
        });
}

Примечание.

Предыдущий пример на C# предназначен для Устойчивых функций версии 2.x. Для расширения "Устойчивые функции" версии 1.x необходимо использовать атрибут OrchestrationClient, а не DurableClient. Также следует использовать тип параметра DurableOrchestrationClient вместо IDurableOrchestrationClient. Дополнительные сведения о различиях между версиями см. в статье Версии устойчивых функций.

Примечание.

Чтобы успешно выполнить операцию по удалению экземпляра из журнала, состояние этого экземпляра должно быть Выполнено, Завершено или Ошибка.

Azure Functions Core Tools

Очистить журнал экземпляра оркестрации можно с помощью func durable purge-historyкоманды в Core Tools. Как и во втором примере C# предыдущего раздела, из журнала удаляются все экземпляры оркестрации, созданные в течение указанного интервала времени. Удаленные экземпляры можно фильтровать по состоянию выполнения.

Примечание.

В целях сохранения состояния среды выполнения команды Core Tools в настоящее время поддерживаются только при использовании поставщика службы хранилища Azure по умолчанию.

Команда durable purge-history имеет несколько параметров.

  • created-after (необязательный): удаление из журнала экземпляров, созданных после этой даты и времени в формате UTC. Принимаются значения даты и времени в формате ISO 8601.
  • created-before (необязательный): удаление из журнала экземпляров, созданных до этой даты и времени в формате UTC. Принимаются значения даты и времени в формате ISO 8601.
  • runtime-status (необязательный): удаление из журнала экземпляров с определенным состоянием (например: "выполняется" или "завершено"). Можно указать несколько состояний (через пробел).
  • connection-string-setting (необязательный): имя параметра приложения, содержащего нужную строку подключения к хранилищу. Значение по умолчанию — AzureWebJobsStorage.
  • task-hub-name (необязательный): имя используемого центра задач устойчивых функций. По умолчанию используется имя центра задач в файле host.json.

Указанная ниже команда удаляет из журнала все невыполненные экземпляры, созданные до 14 ноября 2021 г., в 19:35 по времени в формате UTC.

func durable purge-history --created-before 2021-11-14T19:35:00.0000000Z --runtime-status failed

Удаление центра задач

С помощью func durable delete-task-hubкоманды в Core Tools можно удалить все артефакты хранилища, связанные с определенным центром задач, включая таблицы, запросы и большие двоичные объекты службы хранилища Azure.

Примечание.

В целях сохранения состояния среды выполнения команды Core Tools в настоящее время поддерживаются только при использовании поставщика службы хранилища Azure по умолчанию.

Команда durable delete-task-hub имеет два параметра.

  • connection-string-setting (необязательный): имя параметра приложения, содержащего нужную строку подключения к хранилищу. Значение по умолчанию — AzureWebJobsStorage.
  • task-hub-name (необязательный): имя используемого центра задач устойчивых функций. По умолчанию используется имя центра задач в файле host.json.

Следующая команда удаляет из службы хранилища Azure все данные, связанные с центром задач UserTest.

func durable delete-task-hub --task-hub-name UserTest

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