.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) // activities 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 . 생성자 매개 변수가 제거되었습니다. |
IDurableOrchestrationClient.GetStatusAsync |
DurableTaskClient.GetInstanceAsync |
동작 변경 내용
- Serialization 기본 동작이
Newtonsoft.Json
에서System.Text.Json
으로 변경되었습니다. 자세한 내용은 여기를 참조하세요.