Share via


Durable Functions의 데이터 지속성 및 serialization (Azure Functions)

Durable Functions 런타임은 안정적인 실행을 제공하기 위해 함수 매개 변수, 반환 값 및 기타 상태를 작업 허브에 자동으로 유지합니다. 그러나 지속성 스토리지에 유지되는 데이터의 양과 빈도는 애플리케이션 성능 및 스토리지 트랜잭션 비용에 영향을 줄 수 있습니다. 애플리케이션에 저장되는 데이터 형식에 따라, 데이터 보존 및 개인 정보 정책을 고려해야 할 수도 있습니다.

작업 허브 콘텐츠

작업 허브는 인스턴스의 현재 상태와 보류 중인 메시지를 저장합니다.

  • 인스턴스 상태는 인스턴스의 현재 상태와 기록을 저장합니다. 오케스트레이션 인스턴스의 경우 이 상태에는 런타임 상태, 오케스트레이션 기록, 입력, 출력 및 사용자 지정 상태가 포함됩니다. 엔터티 인스턴스의 경우 엔터티 상태를 포함합니다.
  • 메시지는 라우팅 및 엔드투엔드 상관 관계 등의 내부 용도로 사용하는 함수 입력 또는 출력, 이벤트 페이로드 및 메타데이터를 저장합니다.

메시지는 처리된 후 삭제되지만 애플리케이션 또는 운영자가 명시적으로 삭제하지 않는 한 인스턴스 상태는 유지됩니다. 특히 오케스트레이션 기록은 오케스트레이션이 완료된 후에도 스토리지에 유지됩니다.

상태 및 메시지가 오케스트레이션의 진행률을 나타내는 방법에 대한 예제는 작업 허브 실행 예제를 참조하세요.

스토리지에서 상태 및 메시지가 표시되는 위치와 방법은 스토리지 공급자에 따라 달라집니다. Durable Functions 기본 공급자는 사용자가 지정하는 Azure Storage 계정에서 큐, 테이블 및 BLOB에 데이터를 유지하는 Azure Storage 공급자를 사용합니다.

Serialize되고 유지되는 데이터 형식

다음 목록은 Durable Functions 기능을 사용할 때 직렬화되고 유지되는 다양한 유형의 데이터를 보여줍니다.

  • 모든 ID 및 처리되지 않은 예외를 포함하여 오케스트레이터, 활동 및 엔터티 함수의 모든 입력 및 출력
  • 오케스트레이터, 활동 및 엔터티 함수 이름
  • 외부 이벤트 이름 및 페이로드
  • 사용자 지정 오케스트레이션 상태 페이로드
  • 오케스트레이션 종료 메시지
  • 지속성 타이머 페이로드
  • 지속성 HTTP 요청 및 응답 URL, 헤더 및 페이로드
  • 엔터티 호출 및 신호 페이로드
  • 엔터티 상태 페이로드

중요한 데이터 사용 작업

Azure Storage 공급자를 사용하는 경우, 모든 데이터가 미사용 시 자동으로 암호화됩니다. 그러나 스토리지 계정에 대한 액세스 권한이 있는 사용자는 암호화되지 않은 형식으로 데이터를 읽을 수 있습니다. 중요한 데이터를 더 강력하게 보호해야 하는 경우, 데이터가 미리 암호화된 형식으로 유지되도록 사용자 고유의 암호화 키를 사용하여 데이터를 암호화하는 것을 먼저 고려합니다.

또는 .NET 사용자에게 자동 암호화를 제공하는 사용자 지정 serialization 공급자를 구현할 수 있는 옵션이 있습니다. 암호화를 사용한 사용자 지정 serialization 예제는 이 GitHub 샘플에서 찾을 수 있습니다.

참고 항목

애플리케이션 수준 암호화를 구현하기로 결정한 경우에는 오케스트레이션과 엔터티가 무한한 시간 동안 존재할 수 있다는 것을 명심하십시오. 이는 암호화 키를 회전해야 하는 경우에 중요합니다. 오케스트레이션 또는 엔터티가 키 회전 정책보다 오래 실행 될 수 있기 때문입니다. 키 회전이 발생하는 경우, 데이터를 암호화하는 데 사용되는 키를 다음 번 오케스트레이션 또는 엔터티 실행 시 데이터의 암호를 해독하는 데 더 이상 사용할 수 없습니다. 따라서 고객 암호화는 오케스트레이션과 엔터티가 비교적 짧은 시간 동안 실행될 것으로 예상되는 경우에만 권장됩니다.

serialization 및 deserialization의 사용자 지정

기본 Serialization 논리

.NET In Process용 Durable Functions는 내부적으로 Json.NET을 사용하여 오케스트레이션 및 엔터티 데이터를 JSON으로 직렬화합니다. 사용되는 기본 Json.NET 설정은 다음과 같습니다.

입력, 출력 및 상태:

JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.None,
    DateParseHandling = DateParseHandling.None,
}

예외:

JsonSerializerSettings
{
    ContractResolver = new ExceptionResolver(),
    TypeNameHandling = TypeNameHandling.Objects,
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
}

자세한 내용은 JsonSerializerSettings여기를 참조하세요.

.NET 특성을 사용하여 serialization 사용자 지정

데이터를 직렬화할 때, Json.NET는 JSON에서 데이터를 serialize 및 deserialize하는 방법을 제어하는 클래스 및 속성에 대한 다양한 특성을 찾습니다. Durable Functions API에 전달되는 데이터 형식에 대한 소스 코드를 소유하는 경우, 이러한 특성을 형식에 추가하여 serialization 및 deserialization을 사용자 지정하는 것이 좋습니다.

종속성 주입을 사용하여 serialization 사용자 지정

.NET을 대상으로 하고 함수 V3 런타임에서 실행되는 함수 앱은 DI(종속성 주입)를 사용하여 데이터 및 예외를 serialize하는 방법을 사용자 지정할 수 있습니다. 다음 샘플 코드에서는 DI를 사용하여 IMessageSerializerSettingsFactoryIErrorSerializerSettingsFactory 서비스 인터페이스의 사용자 지정 구현을 사용하여 기본 Json.NET serialization 설정을 재정의하는 방법을 보여 줍니다.

using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using System.Collections.Generic;

[assembly: FunctionsStartup(typeof(MyApplication.Startup))]
namespace MyApplication
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddSingleton<IMessageSerializerSettingsFactory, CustomMessageSerializerSettingsFactory>();
            builder.Services.AddSingleton<IErrorSerializerSettingsFactory, CustomErrorSerializerSettingsFactory>();
        }

        /// <summary>
        /// A factory that provides the serialization for all inputs and outputs for activities and
        /// orchestrations, as well as entity state.
        /// </summary>
        internal class CustomMessageSerializerSettingsFactory : IMessageSerializerSettingsFactory
        {
            public JsonSerializerSettings CreateJsonSerializerSettings()
            {
                // Return your custom JsonSerializerSettings here
            }
        }

        /// <summary>
        /// A factory that provides the serialization for all exceptions thrown by activities
        /// and orchestrations
        /// </summary>
        internal class CustomErrorSerializerSettingsFactory : IErrorSerializerSettingsFactory
        {
            public JsonSerializerSettings CreateJsonSerializerSettings()
            {
                // Return your custom JsonSerializerSettings here
            }
        }
    }
}