Share via


.NET 격리 작업자의 Durable Functions 개요

이 문서는 .NET 격리 작업자의 Durable Functions에 대한 개요입니다. 격리 작업자를 사용하면 Durable Functions 앱이 Azure Functions 호스트와 다른 .NET 버전에서 실행될 수 있습니다.

.NET 격리 작업자에서 Durable Functions를 사용하는 이유는 무엇인가요?

이 모델을 사용하면 Azure Functions .NET 격리 작업자 프로세스와 함께 제공되는 모든 유용한 이점을 얻을 수 있습니다. 자세한 내용은 격리 작업자 모델의 이점을 참조하세요. 또한 이 새로운 SDK에는 몇 가지 새로운 기능이 포함되어 있습니다.

In-process Durable Functions에 대한 기능 향상

  • 오케스트레이션 입력을 직접 삽입할 수 있습니다. MyOrchestration([OrchestrationTrigger] TaskOrchestrationContext context, T input)
  • 강력한 형식의 호출 및 클래스 기반 활동 및 오케스트레이션 지원(참고: 미리 보기로 제공됨. 자세한 내용은 여기 참조)
  • 또한 Azure Functions .NET 격리 작업자의 모든 이점 제공

원본 생성기, 클래스 기반 활동 및 오케스트레이션

요구 사항: 프로젝트에 <PackageReference Include="Microsoft.DurableTask.Generators" Version="1.0.0-preview.1" />을 추가합니다.

원본 생성기 패키지를 추가하면 다음 두 가지 새로운 기능에 액세스할 수 있습니다.

  • 클래스 기반 활동 및 오케스트레이션: Durable Functions를 작성하는 다른 방법입니다. "함수 기반" 대신 지속성 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);
    }
}

Durable 엔터티

지속성 엔터티는 .NET 격리 작업자에서 지원됩니다. 개발자 가이드를 참조하세요.

마이그레이션 가이드

이 가이드에서는 .NET Durable Functions 2.x 프로젝트로 시작하는 것으로 가정합니다.

프로젝트 업데이트

첫 번째 단계는 프로젝트를 Azure Functions .NET 격리로 업데이트하는 것입니다. 그런 다음, Durable Functions 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 격리 작업자용 Durable Functions는 다양한 형식과 네임스페이스를 사용하는 완전히 새로운 패키지입니다. 따라서 코드를 변경해야 하지만 많은 API는 변경할 필요 없이 표시됩니다.

Host.json 스키마

Durable Functions .NET 격리 작업자 및 Durable Functions 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. 생성자 매개 변수가 제거되었습니다.

동작 변경 내용

  • Serialization 기본 동작이 Newtonsoft.Json에서 System.Text.Json으로 변경되었습니다. 자세한 내용은 여기를 참조하세요.