Durable Functions 모범 사례 및 진단 도구

이 문서에서는 Durable Functions를 사용할 때의 몇 가지 모범 사례를 자세히 설명합니다. 또한 개발, 테스트 및 프로덕션 사용 중에 문제를 진단하는 데 도움이 되는 다양한 도구에 대해 설명합니다.

모범 사례

최신 버전의 Durable Functions 확장 및 SDK 사용

함수 앱에서 Durable Functions를 실행하는 데 사용하는 두 가지 구성 요소가 있습니다. 하나는 대상 프로그래밍 언어를 사용하여 오케스트레이터, 작업 및 엔터티 함수를 작성할 수 있는 Durable Functions SDK입니다. 다른 하나는 실제로 코드를 실행하는 런타임 구성 요소인 지속성 확장입니다. .NET In-Process 앱을 제외하고 SDK 및 확장은 독립적으로 버전이 지정됩니다.

최신 확장 및 SDK를 최신 상태로 유지하면 애플리케이션이 최신 성능 향상, 기능 및 버그 수정의 이점을 얻을 수 있습니다. 최신 버전으로 업그레이드하면 Microsoft에서 최신 진단 원격 분석을 수집하여 Azure에서 지원 사례를 열 때 조사 프로세스를 가속화할 수 있습니다.

  • 최신 확장 버전을 가져오는 방법에 대한 지침은 지속성 함수 확장 버전 업그레이드를 참조하세요.
  • 최신 버전의 SDK를 사용하고 있는지 확인하려면 사용 중인 언어의 패키지 관리자를 확인합니다.

Durable Functions 코드 제약 조건 준수

오케스트레이터 코드의 재생 동작은 오케스트레이터 함수에 작성될 수 있는 코드 형식에 대한 제약 조건을 만듭니다. 제약 조건의 예는 오케스트레이터 함수가 재생될 때마다’동일한 결과를 생성할 수 있도록 결정적 API를 사용해야 한다는 것입니다.

참고 항목

Durable Functions Roslyn Analyzer는 C# 사용자가 Durable Functions 특정 코드 제약 조건을 준수하도록 안내하는 라이브 코드 분석기입니다. Visual Studio 및 Visual Studio Code에서 사용하도록 설정하는 방법에 대한 지침은 Durable Functions Roslyn Analyzer를 참조하세요.

프로그래밍 언어의 Azure Functions 성능 설정 숙지

기본 설정을 사용하면 선택한 언어 런타임이 함수에 엄격한 동시성 제한을 적용할 수 있습니다. 예를 들어 지정된 VM에서 한 번에 하나의 함수만 실행할 수 있습니다. 이러한 제한은 일반적으로 언어의 동시성 및 성능 설정을 미세 조정하여 완화할 수 있습니다. Durable Functions 애플리케이션의 성능을 최적화하려면 이러한 설정을 숙지해야 합니다.

다음은 성능 및 동시성 설정을 미세 조정함으로써 종종 이점을 얻을 수 있는 일부 언어의 대략적인 목록과 이를 위한 지침입니다.

앱당 고유한 작업 허브 이름 보장

여러 Durable Function 앱은 동일한 스토리지 계정을 공유할 수 있습니다. 기본적으로 앱 이름은 작업 허브 이름으로 사용되므로 실수로 작업 허브를 공유하지 않습니다. host.json에서 앱에 대한 작업 허브 이름을 명시적으로 구성해야 하는 경우 이름이 고유한지 확인해야 합니다. 그렇지 않으면 여러 앱이 메시지를 놓고 경쟁하게 되므로 오케스트레이션이 보류 중 또는 실행 중 상태에서 예기치 않게 "중단"되는 등 정의되지 않은 동작이 발생할 수 있습니다.

유일한 예외는 여러 지역에 동일한 앱의 복사본을 배포하는 경우입니다. 이 경우 복사본에 동일한 작업 허브를 사용할 수 있습니다.

실행 중인 오케스트레이터에 코드 변경 내용을 배포할 때 지침을 따릅니다.

함수는 애플리케이션의 수명 주기 동안 반드시 추가, 제거 및 변경됩니다. 일반적인 호환성이 손상되는 변경의 예로는 작업 또는 엔터티 함수 서명 변경 및 오케스트레이터 논리 변경이 있습니다. 이러한 변경 내용은 여전히 실행 중인 오케스트레이션에 영향을 줄 때 문제가 됩니다. 잘못 배포된 경우 코드 변경으로 인한 비결정적 오류로 인해 오케스트레이션이 실패하고, 무기한 중단되고, 성능이 저하될 수 있습니다. 실행 중인 오케스트레이션에 영향을 미칠 수 있는 코드를 변경할 때 권장되는 완화 전략을 참조하세요.

함수 입력 및 출력을 최대한 작게 유지합니다.

Durable Functions API 간에 대용량 입력 및 출력을 제공하는 경우 메모리 문제가 발생할 수 있습니다.

Durable Functions API에 대한 입력 및 출력은 오케스트레이션 기록으로 직렬화됩니다. 즉, 시간이 지남에 따라 대규모 입력 및 출력이 오케스트레이터 기록이 무제한으로 증가하는 데 크게 기여할 수 있으며, 이로 인해 재생 중에 메모리 예외가 발생할 위험이 있습니다.

API에 대한 대규모 입력 및 출력의 영향을 완화하기 위해 일부 작업을 하위 오케스트레이터에 위임하도록 선택할 수 있습니다. 이렇게 하면 단일 오케스트레이터에서 여러 오케스트레이터로 기록 메모리 부담을 분산하여 개별 기록의 메모리 공간을 작게 유지할 수 있습니다.

즉, 대용량 데이터를 처리하는 모범 사례는 외부 스토리지에 보관하고 필요한 경우 활동 내에서만 해당 데이터를 구체화하는 것입니다. 이 방법을 사용할 때 Durable Functions API의 입력 및/또는 출력으로 데이터 자체를 전달하는 대신 활동에 필요할 때 외부 스토리지에서 해당 데이터를 검색할 수 있는 간단한 식별자를 전달할 수 있습니다.

엔터티 데이터를 작게 유지

Durable Functions API에 대한 입력 및 출력과 마찬가지로 엔터티의 명시적 상태가 너무 크면 메모리 문제가 발생할 수 있습니다. 특히 엔터티 상태는 모든 요청에 대해 스토리지에서 직렬화 및 역직렬화되어야 하므로 큰 상태는 각 호출에 serialization 대기 시간을 추가합니다. 따라서 엔터티가 대규모 데이터를 추적해야 하는 경우 데이터를 외부 스토리지로 오프로드하고 필요할 때 스토리지에서 데이터를 구체화할 수 있도록 엔터티에서 일부 경량 식별자를 추적하는 것이 좋습니다.

Durable Functions 동시성 설정 미세 조정

단일 작업자 인스턴스는 여러 작업 항목을 동시에 실행하여 효율성을 높일 수 있습니다. 그러나 너무 많은 작업 항목을 동시에 처리하면 CPU 용량, 네트워크 연결 등과 같은 리소스가 소모될 위험이 있습니다. 대부분의 경우 작업 항목 크기 조정 및 제한은 자동으로 처리되므로 문제가 되지 않습니다’. 즉, 성능 문제(예: 오케스트레이터가 완료하는 데 너무 오래 걸리거나 보류 중인 경우)가 발생하거나 성능 테스트를 수행하는 경우’host.json 파일에서 동시성 제한을 구성할 있습니다.

참고 항목

이는 Azure Functions에서 언어 런타임의 성능 및 동시성 설정을 미세 조정하는 것을 대체하는 것이 아닙니다. Durable Functions 동시성 설정은 지정된 VM에 한 번에 할당할 수 있는 작업의 양만 결정하지만 VM 내에서 작동하는 처리의 병렬 처리 정도는 결정되지 않습니다. 후자는 언어 런타임 성능 설정을 미세 조정해야 합니다.

스트레스 테스트에 투자

성능과 관련된 모든 것과 마찬가지로 앱의 이상적인 동시성 설정 및 아키텍처는 궁극적으로 애플리케이션의 워크로드에 따라 달라집니다. 따라서 사용자는 예상 워크로드를 시뮬레이션하는 성능 테스트 도구에 투자하고 이를 사용하여 앱에 대한 성능 및 안정성 실험을 실행하는 것이 좋습니다.

입력, 출력, 예외에서 중요한 데이터 방지

Durable Functions API와의 입력 및 출력(예외 포함)은 선택한 스토리지 공급자에서 지속적으로 유지됩니다. 해당 입력, 출력 또는 예외에 중요한 데이터(예: 비밀, 연결 문자열, 개인 식별 정보 등)가 포함되어 있는 경우 스토리지 공급자의 리소스에 대한 읽기 권한이 있는 사람은 누구나 해당 데이터를 가져올 수 있습니다. 중요한 데이터를 안전하게 처리하려면 사용자가 Azure Key Vault 또는 환경 변수에서 작업 함수 내 해당 데이터를 가져오고 해당 데이터를 오케스트레이터 또는 엔터티에 직접 전달하지 않는 것이 좋습니다. 이는 중요한 데이터가 스토리지 리소스로 유출되는 것을 방지하는 데 도움이 됩니다.

참고 항목

이 지침은 요청 및 응답 페이로드를 스토리지에 유지하는 CallHttp Orchestrator API에도 적용됩니다. 대상 HTTP 엔드포인트에 인증이 필요한 경우(중요할 수 있음), 사용자는 작업 내에서 HTTP 호출을 직접 구현하거나 스토리지에 자격 증명을 유지하지 않는 CallHttp에서 제공하는 기본 제공 관리 ID 지원을 사용하는 것이 좋습니다.

마찬가지로 로그에 대한 읽기 권한(예: Application Insights)이 있는 사람은 누구나 해당 비밀을 가져올 수 있으므로 비밀이 포함된 데이터를 로깅하지 마세요.

진단 도구

문제를 진단하는 데 도움이 되는 몇 가지 도구가 있습니다.

Durable Functions 및 Durable Task Framework 로그

Durable Functions 확장

지속성 확장은 오케스트레이션의 엔드투엔드 실행을 추적할 수 있는 추적 이벤트를 내보냅니다. 이러한 추적 이벤트는 Azure Portal에서 Application Insights 분석 도구를 사용하여 검색하고 쿼리할 수 있습니다. 내보낸 추적 데이터에 대한 자세한 정보는 host.json 파일의 logger(Functions 1.x) 또는 logging(Functions 2.0) 섹션에서 구성할 수 있습니다. 구성 세부 정보를 참조하세요.

지속성 작업 프레임워크

지속성 확장 v2.3.0에서 시작하여 기본 지속성 작업 프레임워크(DTFx)에서 내보낸 로그를 컬렉션에도 사용할 수 있습니다. 이러한 로그를 사용하도록 설정하는 방법에 대한 세부 정보를 참조하세요.

Azure Portal

문제 진단 및 해결

Azure Function App Diagnostics는 애플리케이션의 잠재적인 문제를 모니터링하고 진단하기 위한 Azure Portal의 유용한 리소스입니다. 또한 진단에 따라 문제를 해결하는 데 도움이 되는 제안도 제공합니다. Azure Function App Diagnostics를 참조하세요.

Durable Functions 오케스트레이션 추적

Azure Portal은 각 오케스트레이션 인스턴스의 상태를 이해하고 엔드투엔드 실행을 추적하는 데 도움이 되는 오케스트레이션 추적 세부 정보를 제공합니다. Azure Functions 앱 내의 함수 목록을 보면 추적에 대한 링크가 포함된 Monitor 열이 표시됩니다. 이 정보를 얻으려면 앱에 Applications Insights를 사용하도록 설정해야 합니다.

Durable Functions 모니터 확장

이는 오케스트레이션 인스턴스를 모니터링, 관리 및 디버깅하기 위한 UI를 제공하는 Visual Studio Code 확장입니다.

Roslyn 분석기

Durable Functions Roslyn Analyzer는 C# 사용자가 Durable Functions 특정 코드 제약 조건을 준수하도록 안내하는 라이브 코드 분석기입니다. Visual Studio 및 Visual Studio Code에서 사용하도록 설정하는 방법에 대한 지침은 Durable Functions Roslyn Analyzer를 참조하세요.

지원

질문 및 지원의 경우 아래 GitHub 리포지토리 중 하나에서 문제를 열 수 있습니다. 영향을 받는 인스턴스 ID, 문제를 표시하는 UTC의 시간 범위, 애플리케이션 이름(가능한 경우) 및 배포 지역과 같은 정보를 포함하여 Azure에서 버그를 보고하면 조사 속도가 매우 빨라집니다.