Durable Functions 스토리지 공급자
Durable Functions는 내부적으로 Durable Task Framework(DTFx)로 구동하는 Azure Functions 트리거 및 바인딩 세트입니다. DTFx는 Durable Functions에서 사용하는 Azure Storage 공급자를 포함하여 다양한 백 엔드 스토리지 공급자를 지원합니다. Durable Functions v2.5.0부터 사용자는 Azure Storage 공급자 대신 DTFx 스토리지 공급자를 사용하도록 함수 앱을 구성할 수 있습니다.
참고 항목
많은 함수 앱의 경우 Durable Functions 대한 기본 Azure Storage 공급자로 충분할 수 있고 추가 구성이 필요하지 않으므로 사용하기가 가장 쉽습니다. 그러나 비용, 확장성 및 데이터 관리의 절충을 위해 대체 스토리지 공급자의 사용을 선호하기도 합니다.
두 가지 대체 스토리지 공급자는 Durable Functions 및 Durable Task Framework(즉, Netherite) 스토리지 공급자와, MSSQL(Microsoft SQL Server) 스토리지 공급자와 함께 사용하도록 개발되었습니다. 이 문서에서는 지원되는 세 가지 공급자를 모두 설명하고, 서로 비교하고, 시작하는 방법에 대한 기본 정보를 제공합니다.
참고 항목
현재 한 스토리지 공급자에서 다른 스토리지 공급자로 데이터를 마이그레이션할 수 없습니다. 새 스토리지 공급자를 사용하려면 새 스토리지 공급자로 구성된 새 앱을 만들어야 합니다.
Azure Storage
Azure Storage는 Durable Functions의 기본 스토리지 공급자입니다. 큐, 테이블 및 Blob을 사용하여 오케스트레이션 및 엔터티 상태를 유지합니다. 또한 Blob 및 Blob 임대를 사용하여 파티션을 관리합니다. 대부분의 경우 Durable Functions 런타임 상태를 저장하는 데 사용되는 스토리지 계정은 Azure Functions에서 사용하는 기본 스토리지 계정(AzureWebJobsStorage
)과 동일합니다. 그러나 별도의 스토리지 계정으로 Durable Functions를 구성할 수도 있습니다. Azure Storage 공급자는 Durable Functions 확장에 기본 제공되며 다른 종속성이 없습니다.
Azure Storage 공급자의 주요 이점은 다음과 같습니다.
- 설정이 필요 없음 - 함수 앱 설정 환경에서 자동으로 생성하는 스토리지 계정을 사용할 수 있습니다.
- 저렴한 서버리스 청구 모델 - Azure Storage는 전적으로 사용량을 기반으로 하는 사용량 기반 가격 책정 모델입니다(자세한 정보).
- 최고의 도구 지원 - Azure Storage는 플랫폼 간 로컬 에뮬레이션을 제공하며 Visual Studio, Visual Studio Code 및 Azure Functions Core Tools와 통합됩니다.
- 높은 완성도 - Azure Storage는 최초로 개발되어 가장 많은 실전 테스트를 거친 Durable Functions용 스토리지 백엔드입니다.
- 스토리지 공급자에 연결하기 위해 비밀 대신 ID를 사용하도록 지원합니다.
Azure Storage 스토리지 공급자의 DTFx 구성 요소에 대한 소스 코드는 Azure/durabletask GitHub 리포지토리에서 찾을 수 있습니다.
참고 항목
Azure Storage 공급자를 사용하는 경우 표준 범용 Azure Storage 계정이 필요합니다. 그 외의 스토리지 계정 유형은 지원되지 않습니다. 최신 v2 스토리지 계정은 Durable Functions 워크로드 비용이 훨씬 많이 발생할 수 있으므로 레거시 v1 범용 스토리지 계정을 사용하는 것이 좋습니다. Azure Storage 계정 유형에 대한 자세한 내용은 Storage 계정 개요 설명서를 참조하세요.
Netherite
Netherite 스토리지 백 엔드는 Microsoft Research에서 설계하고 개발했습니다. Azure 페이지 Blob을 바탕으로 Azure Event Hubs 및 더 빠른 데이터베이스 기술을 사용합니다. Netherite 디자인은 다른 공급자에 비해 오케스트레이션 및 엔터티 처리량이 훨씬 높습니다. 일부 벤치마크 시나리오에서는 기본 Azure Storage 공급자에 비해 처리량이 수십 배 증가하는 것으로 나타났습니다.
Netherite 스토리지 공급자의 주요 이점은 다음과 같습니다.
- 다른 스토리지 공급자에 비해 저렴한 비용으로 처리량이 크게 향상됩니다.
- 가격 대비 성능 최적화를 지원하므로 필요에 따라 성능을 스케일 업할 수 있습니다.
- Event Hubs Basic 및 Standard SKU에서 최대 32개의 데이터 파티션을 지원합니다.
- 처리량이 높은 워크로드에서 다른 공급자보다 비용 효율성이 높습니다.
시작하는 방법을 포함하여 Netherite 스토리지 공급자의 기술 세부 정보는 Netherite 설명서에서 확인할 수 있습니다. Netherite 스토리지 공급자의 소스 코드는 microsoft/durabletask-netherite GitHub 리포지토리에서 찾을 수 있습니다. Netherite 스토리지 공급자에 대한 자세한 평가는 다음 연구 논문 Serverless Workflows with Durable Functions and Netherite에서도 확인할 수 있습니다.
참고 항목
Netherite라는 이름의 기원은 Minecraft입니다.
MSSQL(Microsoft SQL Server)
MSSQL(Microsoft SQL Server) 스토리지 공급자는 모든 상태를 Microsoft SQL Server 데이터베이스에 유지합니다. Azure SQL Database를 포함하여 SQL Server의 온-프레미스 및 클라우드 호스팅 배포와 호환됩니다.
MSSQL 스토리지 공급자의 주요 이점은 다음과 같습니다.
- 연결이 끊긴 환경 지원 - SQL Server 설치를 사용하는 경우 Azure 연결이 필요하지 않습니다.
- Azure 호스팅 및 온-프레미스를 포함하여 여러 환경과 클라우드 간에 이식 가능합니다.
- 데이터 일관성이 강력하기 때문에 데이터 손실 없이 백업/복원 및 장애 조치(failover)가 가능합니다.
- 사용자 지정 데이터 암호화를 기본 지원합니다(SQL Server의 기능).
- 기본 제공 저장 프로시저를 통해 기존 데이터베이스 애플리케이션과 통합됩니다.
시작하는 방법을 포함하여 MSSQL 스토리지 공급자의 기술 세부 정보는 Microsoft SQL 공급자 설명서에서 확인할 수 있습니다. MSSQL 스토리지 공급자의 소스 코드는 microsoft/durabletask-mssql GitHub 리포지토리에서 찾을 수 있습니다.
대체 스토리지 공급자 구성
대체 스토리지 공급자 구성은 일반적으로 다음과 같은 2단계 프로세스입니다.
- 함수 앱에 적절한 NuGet 패키지를 추가합니다(확장 번들을 사용하는 앱의 경우 이 요구 사항은 일시적).
- 사용하려는 스토리지 공급자를 지정하도록 host.json 파일을 업데이트합니다.
host.json 파일에서 스토리지 공급자를 명시적으로 구성하지 않으면 Azure Storage 공급자가 기본적으로 사용됩니다.
Azure 스토리지 공급자 구성
Azure Storage 공급자는 기본 스토리지 공급자이며 명시적 구성, NuGet 패키지 참조 또는 확장 번들 참조가 필요하지 않습니다. host.json 구성 옵션의 전체 세트는 여기의 extensions/durableTask/storageProvider
경로 아래에서 찾을 수 있습니다.
연결
connectionName
속성은 앱이 Azure Storage에 연결해야 하는 방법을 지정하는 환경 구성에 대한 참조입니다. 다음을 지정할 수 있습니다.
- 연결 문자열이 포함된 애플리케이션 설정의 이름. 연결 문자열을 가져오려면 스토리지 계정 액세스 키 관리에 표시된 단계를 따릅니다.
- 함께 ID 기반 연결을 정의하는 여러 애플리케이션 설정에 대한 공유 접두사의 이름입니다.
구성된 값이 단일 설정에 대해 정확히 일치하고 다른 설정에 대해 접두사가 일치하는 경우 정확한 일치가 사용됩니다. host.json에 값이 지정되지 않은 경우 기본값은 "AzureWebJobsStorage"입니다.
ID 기반 연결
버전 2.7.0 이상의 확장 및 Azure 스토리지 공급자를 사용하는 경우 비밀이 있는 연결 문자열을 사용하는 대신 앱에서 Microsoft Entra ID를 사용하도록 할 수 있습니다. 이렇게 하려면 트리거 및 바인딩 구성의 connectionName
속성에 매핑되는 공통 접두사 아래에 설정을 정의합니다.
"Durable Functions"에 대한 ID 기반 연결을 사용하려면 다음 앱 설정을 구성합니다.
속성 | 환경 변수 템플릿 | 설명 | 예제 값 |
---|---|---|---|
Blob service URI | <CONNECTION_NAME_PREFIX>__blobServiceUri |
HTTPS 체계를 사용하는 스토리지 계정의 Blob service에 대한 데이터 평면 URI입니다. | https://<storage_account_name>.blob.core.windows.net |
큐 서비스 URI | <CONNECTION_NAME_PREFIX>__queueServiceUri |
HTTPS 체계를 사용하는 스토리지 계정의 큐 서비스에 대한 데이터 평면 URI입니다. | https://<storage_account_name>.queue.core.windows.net |
Table service URI | <CONNECTION_NAME_PREFIX>__tableServiceUri |
HTTPS 체계를 사용하는 스토리지 계정의 테이블 서비스에 대한 데이터 평면 URI입니다. | https://<storage_account_name>.table.core.windows.net |
연결을 사용자 지정하기 위해 추가 속성을 설정할 수 있습니다. ID 기반 연결의 공통 속성을 참조하세요.
Azure Functions 서비스에서 호스트되는 경우 ID 기반 연결에 관리 ID가 사용됩니다. 사용자가 할당한 ID는 credential
및 clientID
속성을 사용하여 지정할 수 있지만 기본적으로 시스템 할당 ID가 사용됩니다. 리소스 ID를 사용하여 사용자가 할당한 ID를 구성하는 것은 지원되지 않습니다. 로컬 개발과 같은 다른 컨텍스트에서 실행할 때 사용자 지정할 수 있지만 대신 개발자 ID가 사용됩니다. ID 기반 연결을 사용하여 로컬 개발을 참조하세요.
ID에 권한 부여
사용되는 모든 ID에는 의도한 작업을 수행할 수 있는 권한이 있어야 합니다. 대부분 Azure 서비스의 경우 이는 해당 권한을 제공하는 기본 제공 또는 사용자 지정 역할을 사용하여 Azure RBAC에서 역할을 할당해야 함을 의미합니다.
Important
일부 사용 권한은 모든 컨텍스트에 필요하지 않은 대상 서비스에 의해 노출될 수 있습니다. 가능한 경우 최소 권한 원칙을 준수하여 ID에 필요한 권한만 부여하세요. 예를 들어 앱이 데이터 원본에서 읽을 수만 있으면 되는 경우 읽기 권한만 있는 역할을 사용합니다. 읽기 작업에 대한 과도한 권한이 될 수 있으므로 해당 서비스에 쓰기도 허용하는 역할을 할당하는 것은 부적절합니다. 마찬가지로 역할 할당이 읽어야 하는 리소스에 대해서만 범위가 할당되도록 할 수 있습니다.
런타임에 Azure Storage에 대한 액세스를 제공하는 역할 할당을 만들어야 합니다. 소유자와 같은 관리 역할로는 충분하지 않습니다. 다음 기본 제공 역할은 정상 작동에서 Durable Functions 확장을 사용할 때 권장됩니다.
작성하는 코드에 따라 애플리케이션에 추가 권한이 필요할 수 있습니다. 기본 동작을 사용하거나 connectionName
을 "AzureWebJobsStorage"로 명시적으로 설정하는 경우 다른 권한 고려 사항은 ID로 호스트 스토리지에 연결을 참조하세요.
Netherite 스토리지 공급자 구성
Netherite 저장소 공급자를 사용하도록 설정하려면 host.json
에서 구성을 변경해야 합니다. C# 사용자의 경우 추가 설치 단계도 필요합니다.
host.json
Configuration
다음 host.json 예제에서는 Netherite 스토리지 공급자를 사용하는 데 필요한 최소 구성을 보여줍니다.
{
"version": "2.0",
"extensions": {
"durableTask": {
"storageProvider": {
"type": "Netherite",
"storageConnectionName": "AzureWebJobsStorage",
"eventHubsConnectionName": "EventHubsConnection"
}
}
}
}
자세한 설치 지침은 Netherite 시작 설명서를 참조하세요.
Netherite 확장 프로그램 설치(.NET만 해당)
참고 항목
앱에서 확장 번들을 사용하는 경우, 확장 번들은 확장 프로그램을 수동으로 관리할 필요가 없으므로 이 섹션을 무시해야 합니다.
NuGet에 최신 버전의 Netherite 확장 프로그램을 설치해야 합니다. 이는 일반적으로 .csproj
파일에 관련 참조를 포함하고 프로젝트를 빌드하는 것을 의미합니다.
설치할 확장 패키지는 사용 중인 .NET 작업자에 따라 달라집니다.
- In-process .NET 작업자의 경우
Microsoft.Azure.DurableTask.Netherite.AzureFunctions
를 설치합니다. - 격리 .NET 작업자의 경우
Microsoft.Azure.Functions.Worker.Extensions.DurableTask.Netherite
를 설치합니다.
MSSQL 스토리지 공급자 구성
MSSQL 저장소 공급자를 사용하도록 설정하려면 host.json
에서 구성을 변경해야 합니다. C# 사용자의 경우 추가 설치 단계도 필요합니다.
host.json
Configuration
다음 예제에서는 MSSQL 스토리지 공급자를 사용하는 데 필요한 최소 구성을 보여줍니다.
{
"version": "2.0",
"extensions": {
"durableTask": {
"storageProvider": {
"type": "mssql",
"connectionStringName": "SQLDB_Connection"
}
}
}
}
자세한 설치 지침은 MSSQL 공급자 시작 설명서를 참조하세요.
지속형 작업 MSSQL 확장 프로그램 설치(.NET만 해당)
참고 항목
앱에서 확장 번들을 사용하는 경우, 확장 번들은 확장 프로그램을 수동으로 관리할 필요가 없으므로 이 섹션을 무시해야 합니다.
NuGet에 최신 버전의 MSSQL 저장소 공급자 확장 프로그램을 설치해야 합니다. 이는 일반적으로 .csproj
파일에 관련 참조를 포함하고 프로젝트를 빌드하는 것을 의미합니다.
설치할 확장 패키지는 사용 중인 .NET 작업자에 따라 달라집니다.
- In-process .NET 작업자의 경우
Microsoft.DurableTask.SqlServer.AzureFunctions
를 설치합니다. - 격리 .NET 작업자의 경우
Microsoft.Azure.Functions.Worker.Extensions.DurableTask.SqlServer
를 설치합니다.
스토리지 공급자 비교
지원되는 다양한 스토리지 공급자마다 득과 실이 있습니다. 다음 표를 참조하여 이러한 득실을 이해하고 요구 사항에 가장 적합한 스토리지 공급자를 결정할 수 있습니다.
스토리지 공급자 | Azure Storage | Netherite | MSSQL |
---|---|---|---|
공식 지원 상태 | ✅ GA(일반 공급) | ✅ GA(일반 공급) | ✅ GA(일반 공급) |
외부 종속성 | Azure Storage 계정(범용 v1) | Azure Event Hubs Azure Storage 계정(범용) |
SQL Server 2019 또는 Azure SQL Database |
로컬 개발 및 에뮬레이션 옵션 | Azurite v3.12 이상(플랫폼 간) | 작업 허브의 메모리 내 에뮬레이션 지원(자세한 정보) | SQL Server Developer 버전(Windows, Linux 및 Docker 컨테이너 지원) |
작업 허브 구성 | 명시적 | 명시적 | 기본적으로 암시적(자세한 정보) |
최대 처리량 | 일반형 | 매우 높음 | 일반형 |
최대 오케스트레이션/엔터티 스케일 아웃(노드 수) | 16 | 32 | 해당 없음 |
최대 작업 스케일 아웃(노드 수) | 해당 없음 | 32 | 해당 없음 |
지속성 엔터티 지원 | ✅ 완벽하게 지원 | ✅ 완벽하게 지원 | ⚠️ .NET 격리를 사용하는 경우를 제외하고 지원됨 |
KEDA 2.0 스케일링 지원 (자세한 정보) |
❌ 지원 안 됨 | ❌ 지원 안 됨 | ✅ MSSQL 스케일러 사용 지원(자세한 정보) |
확장 번들 지원(비 .NET 앱에 권장) | ✅ 완벽하게 지원 | ✅ 완벽하게 지원 | ✅ 완벽하게 지원 |
가격-성능 구성 가능 여부 | ❌ 아니요 | ✅ 예(Event Hubs TU 및 CU) | ✅ 예(SQL vCPU) |
연결되지 않은 환경 지원 | ❌ Azure 연결 필요 | ❌ Azure 연결 필요 | ✅ 완벽하게 지원 |
ID 기반 연결 | ✅ 완벽하게 지원 | ❌ 지원 안 됨 | ⚠️ 런타임 기반 크기 조정 필요 |
Flex 사용량 계획 | ✅ 완전히 지원됨(참고 참조) | ❌ 지원 안 됨 | ❌ 지원 안 됨 |