Обзор Устойчивые функции в изолированной рабочей роли .NET

В этой статье представлен обзор Устойчивые функции в изолированной рабочей роли .NET. Изолированная рабочая роль позволяет приложению Устойчивые функции работать в версии .NET, отличной от версии Функции Azure узла.

Зачем использовать Устойчивые функции в изолированной рабочей роли .NET?

Использование этой модели позволяет получить все большие преимущества, которые поставляются с Функции Azure изолированным рабочим процессом .NET. Дополнительные сведения см. в разделе "Преимущества изолированной рабочей модели". Кроме того, этот новый пакет SDK включает некоторые новые функции.

Улучшения функций по сравнению с Устойчивые функции процесса

  • Входные данные оркестрации можно внедрить напрямую: MyOrchestration([OrchestrationTrigger] TaskOrchestrationContext context, T input)
  • Поддержка строго типизированных вызовов и действий на основе классов и оркестрации (ПРИМЕЧАНИЕ: в предварительной версии. Дополнительные сведения см . здесь.)
  • Плюс все преимущества изолированной рабочей роли .NET Функции Azure.

Исходный генератор и действия на основе классов и оркестрации

Требование: добавление <PackageReference Include="Microsoft.DurableTask.Generators" Version="1.0.0-preview.1" /> в проект.

Добавив пакет генератора источника, вы получите доступ к двум новым функциям:

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

Пример на основе функций

public static class MyFunctions
{
    [Function(nameof(MyActivity))] 
    public static async Task<string> MyActivity([ActivityTrigger] string input)
    {
        // implementation
    }

    [Function(nameof(MyOrchestration))] 
    public static async Task<string> MyOrchestration([OrchestrationTrigger] TaskOrchestrationContext context, string input)
    {
        // implementation
        return await context.CallActivityAsync(nameof(MyActivity), input);
    }
}

Пример на основе классов

[DurableTask(nameof(MyActivity))]
public class MyActivity : TaskActivity<string, string>
{
    private readonly ILogger logger;

    public MyActivity(ILogger<MyActivity> logger) // activites have access to DI.
    {
        this.logger = logger;
    }

    public async override Task<string> RunAsync(TaskActivityContext context, string input)
    {
        // implementation
    }
}

[DurableTask(nameof(MyOrchestration))]
public class MyOrchestration : TaskOrchestrator<string, string>
{
    public async override Task<string> RunAsync(TaskOrchestrationContext context, string input)
    {
        ILogger logger = context.CreateReplaySafeLogger<MyOrchestration>(); // orchestrations do NOT have access to DI.

        // An extension method was generated for directly invoking "MyActivity".
        return await context.CallMyActivityAsync(input);
    }
}

Устойчивые сущности

Устойчивые сущности поддерживаются в изолированной рабочей роли .NET. Ознакомьтесь с руководством разработчика.

Руководство по миграции

В этом руководстве предполагается, что вы начинаете с проекта .NET Устойчивые функции 2.x.

Обновление проекта

Первым шагом является обновление проекта до Функции Azure изолированной .NET. Затем обновите ссылки на пакет NuGet Устойчивые функции.

Старый:

<ItemGroup>
  <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.DurableTask" Version="2.9.0" />
</ItemGroup>

Новая.

<ItemGroup>
  <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.DurableTask" Version="1.1.0" />
</ItemGroup>

Обновление кода

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

Схема Host.json

Схема изолированной рабочей роли .NET Устойчивые функции и Устойчивые функции 2.x не изменилась, изменения не должны быть необходимы.

Изменения общедоступного API

Эта таблица не является исчерпывающим списком изменений.

2.x Изоляция
IDurableOrchestrationClient DurableTaskClient
IDurableOrchestrationClient.StartNewAsync DurableTaskClient.ScheduleNewOrchestrationInstanceAsync
IDurableEntityClient.SignalEntityAsync DurableTaskClient.Entities.SignalEntityAsync
IDurableEntityClient.ReadEntityStateAsync DurableTaskClient.Entities.GetEntityAsync
IDurableEntityClient.ListEntitiesAsync DurableTaskClient.Entities.GetAllEntitiesAsync
IDurableEntityClient.CleanEntityStorageAsync DurableTaskClient.Entities.CleanEntityStorageAsync
IDurableOrchestrationContext TaskOrchestrationContext
IDurableOrchestrationContext.GetInput<T>() TaskOrchestrationContext.GetInput<T>() или ввести входные данные в качестве параметра: MyOrchestration([OrchestrationTrigger] TaskOrchestrationContext context, T input)
DurableActivityContext Нет эквивалента
DurableActivityContext.GetInput<T>() Внедрение входных данных в качестве параметра MyActivity([ActivityTrigger] T input)
IDurableOrchestrationContext.CallActivityWithRetryAsync TaskOrchestrationContext.CallActivityAsync, включите TaskOptions параметр с подробными сведениями о повторных попытках.
IDurableOrchestrationContext.CallSubOrchestratorWithRetryAsync TaskOrchestrationContext.CallSubOrchestratorAsync, включите TaskOptions параметр с подробными сведениями о повторных попытках.
IDurableOrchestrationContext.CallHttpAsync TaskOrchestrationContext.CallHttpAsync
IDurableOrchestrationContext.CreateReplaySafeLogger(ILogger) TaskOrchestrationContext.CreateReplaySafeLogger<T>() или TaskOrchestrationContext.CreateReplaySafeLogger(string)
IDurableOrchestrationContext.CallEntityAsync TaskOrchestrationContext.Entities.CallEntityAsync
IDurableOrchestrationContext.SignalEntity TaskOrchestrationContext.Entities.SignalEntityAsync
IDurableOrchestrationContext.LockAsync TaskOrchestrationContext.Entities.LockEntitiesAsync
IDurableOrchestrationContext.IsLocked TaskOrchestrationContext.Entities.InCriticalSection
IDurableEntityContext TaskEntityContext.
IDurableEntityContext.EntityName TaskEntityContext.Id.Name
IDurableEntityContext.EntityKey TaskEntityContext.Id.Key
IDurableEntityContext.OperationName TaskEntityOperation.Name
IDurableEntityContext.FunctionBindingContext Удалено, добавьте FunctionContext в качестве входного параметра
IDurableEntityContext.HasState TaskEntityOperation.State.HasState
IDurableEntityContext.BatchSize Удаленные
IDurableEntityContext.BatchPosition Удаленные
IDurableEntityContext.GetState TaskEntityOperation.State.GetState
IDurableEntityContext.SetState TaskEntityOperation.State.SetState
IDurableEntityContext.DeleteState TaskEntityOperation.State.SetState(null)
IDurableEntityContext.GetInput TaskEntityOperation.GetInput
IDurableEntityContext.Return Удалено. Вместо этого используется возвращаемое значение метода.
IDurableEntityContext.SignalEntity TaskEntityContext.SignalEntity
IDurableEntityContext.StartNewOrchestration TaskEntityContext.ScheduleNewOrchestration
IDurableEntityContext.DispatchAsync TaskEntityDispatcher.DispatchAsync. Удалены параметры конструктора.

Изменение поведения

  • Поведение сериализации по умолчанию изменилось с Newtonsoft.JsonSystem.Text.Json. Для получения дополнительных сведений см. здесь.