Theory
인프라
Azure
Durable Functions Perf and Scale

Durable Functions 성능 및 확장성 가이드

Azure Functions의 Durable Functions에서 성능과 확장성을 최적화하기 위한 포괄적인 가이드입니다.

개요

성능과 확장성을 최적화하려면 Durable Functions의 고유한 확장 특성을 이해하는 것이 중요합니다. 이 문서에서는 부하에 따라 작업자가 어떻게 확장되는지, 그리고 다양한 매개변수를 조정하는 방법을 설명합니다.

작업자 확장

작업자 확장의 기본 개념

태스크 허브 개념의 기본적인 이점은 태스크 허브 작업 항목을 처리하는 작업자의 수를 지속적으로 조정할 수 있다는 것입니다. 특히 애플리케이션은 다음과 같은 방식으로 확장할 수 있습니다:

  • 확장(Scale Out): 작업을 더 빨리 처리해야 하는 경우 더 많은 작업자 추가
  • 축소(Scale In): 작업자를 바쁘게 유지할 만큼 충분한 작업이 없는 경우 작업자 제거
  • 제로 확장(Scale to Zero): 태스크 허브가 완전히 유휴 상태인 경우 가능

제로 확장 시에는 작업자가 전혀 없으며, 확장 컨트롤러와 스토리지만 활성 상태를 유지합니다.

자동 확장

Consumption 및 Elastic Premium 플랜에서 실행되는 모든 Azure Functions와 마찬가지로, Durable Functions는 Azure Functions 확장 컨트롤러를 통해 자동 확장을 지원합니다.

확장 컨트롤러는 메시지와 작업이 처리되기 전에 얼마나 오래 대기해야 하는지를 모니터링합니다. 이러한 지연 시간을 기반으로 작업자를 추가하거나 제거할지 결정할 수 있습니다.

참고: Durable Functions 2.0부터는 Elastic Premium 플랜의 VNET 보호 서비스 엔드포인트 내에서 실행되도록 함수 앱을 구성할 수 있습니다. 이 구성에서는 확장 컨트롤러 대신 Durable Functions 트리거가 확장 요청을 시작합니다.

프리미엄 플랜에서 자동 확장은 작업자 수(따라서 운영 비용)를 애플리케이션이 경험하는 부하에 대략 비례하도록 유지하는 데 도움이 될 수 있습니다.

CPU 사용량 고려사항

오케스트레이터 함수

오케스트레이터 함수는 재생 동작으로 인해 로직을 여러 번 실행합니다. 따라서 오케스트레이터 함수 스레드가 다음을 수행하지 않는 것이 중요합니다:

  • CPU 집약적 작업 수행
  • I/O 작업 수행
  • 어떤 이유로든 차단

I/O, 차단 또는 다중 스레드가 필요한 모든 작업은 액티비티 함수로 이동해야 합니다.

액티비티 함수

액티비티 함수는 일반 큐 트리거 함수와 동일한 동작을 가집니다. 안전하게 다음을 수행할 수 있습니다:

  • I/O 작업
  • CPU 집약적 작업 실행
  • 다중 스레드 사용

액티비티 트리거는 상태 비저장이므로 무제한 VM 수로 자유롭게 확장할 수 있습니다.

엔터티 함수

엔터티 함수도 단일 스레드에서 실행되며 작업이 한 번에 하나씩 처리됩니다. 그러나 엔터티 함수는 실행할 수 있는 코드 유형에 제한이 없습니다.

함수 타임아웃

액티비티, 오케스트레이터 및 엔터티 함수는 모든 Azure Functions와 동일한 함수 타임아웃의 적용을 받습니다. 일반적으로 Durable Functions는 함수 타임아웃을 애플리케이션 코드에서 발생하는 처리되지 않은 예외와 동일하게 처리합니다.

예를 들어, 액티비티가 타임아웃되면 함수 실행이 실패로 기록되고 오케스트레이터에 알림이 전송되어 다른 예외와 마찬가지로 타임아웃을 처리합니다.

엔터티 작업 배치 처리

성능을 개선하고 비용을 줄이기 위해 단일 작업 항목이 전체 엔터티 작업 배치를 실행할 수 있습니다. Consumption 플랜에서는 각 배치가 단일 함수 실행으로 청구됩니다.

기본적으로 최대 배치 크기는 다음과 같습니다:

  • Consumption 플랜: 50
  • 기타 모든 플랜: 5000

최대 배치 크기는 host.json 파일에서도 구성할 수 있습니다. 최대 배치 크기가 1이면 배치 처리가 효과적으로 비활성화됩니다.

참고: 개별 엔터티 작업이 실행하는 데 오랜 시간이 걸리는 경우, 특히 Consumption 플랜에서 함수 타임아웃의 위험을 줄이기 위해 최대 배치 크기를 제한하는 것이 유용할 수 있습니다.

인스턴스 캐싱

일반적으로 오케스트레이션 작업 항목을 처리하려면 작업자는 다음 두 가지를 모두 수행해야 합니다:

  1. 오케스트레이션 기록 가져오기
  2. 기록을 사용하여 오케스트레이터 코드 재생

동일한 작업자가 동일한 오케스트레이션에 대한 여러 작업 항목을 처리하는 경우, 스토리지 공급자는 작업자의 메모리에 기록을 캐싱하여 이 프로세스를 최적화할 수 있습니다. 이렇게 하면 첫 번째 단계가 제거됩니다. 또한 중간 실행 오케스트레이터를 캐싱하여 두 번째 단계인 기록 재생도 제거할 수 있습니다.

캐싱의 일반적인 효과

캐싱의 일반적인 효과는 다음과 같습니다:

  • 기본 스토리지 서비스에 대한 I/O 감소
  • 전반적인 처리량 및 지연 시간 개선
  • 작업자의 메모리 소비 증가

지원되는 스토리지 공급자별 캐싱

스토리지 공급자인스턴스 캐싱 지원기본 설정메커니즘
Azure Storage지원 (.NET in-process worker만)비활성화Extended Sessions
Netherite지원활성화Instance Cache
MSSQL미지원n/an/a

캐싱 메커니즘 비교

Extended Sessions (Azure Storage 공급자)

  • .NET in-process worker에서만 지원
  • 중간 실행 오케스트레이터를 일정 시간 동안 유휴 상태까지 메모리에 유지
  • 제어 매개변수: extendedSessionsEnabled, extendedSessionIdleTimeoutInSeconds

Instance Cache (Netherite 스토리지 공급자)

  • 모든 언어 SDK에서 작동
  • 기록을 포함한 모든 인스턴스의 상태를 작업자의 메모리에 유지
  • 사용된 총 메모리를 추적하고 InstanceCacheSizeMB로 구성된 제한을 초과하면 가장 적게 사용된 인스턴스 데이터를 제거
  • CacheOrchestrationCursors가 true로 설정되면 인스턴스 상태와 함께 중간 실행 오케스트레이터도 저장

: 캐싱은 기록이 재생되는 빈도를 줄일 수 있지만 재생을 완전히 제거할 수는 없습니다. 오케스트레이터를 개발할 때 캐싱을 비활성화하는 구성에서 테스트하는 것을 강력히 권장합니다. 이러한 강제 재생 동작은 개발 시점에 오케스트레이터 함수 코드 제약 조건 위반을 감지하는 데 유용할 수 있습니다.

동시성 스로틀

단일 작업자 인스턴스는 여러 작업 항목을 동시에 실행할 수 있습니다. 이는 병렬성을 높이고 작업자를 더 효율적으로 활용하는 데 도움이 됩니다. 그러나 작업자가 동시에 너무 많은 작업 항목을 처리하려고 하면 다음과 같은 가용 리소스가 고갈될 수 있습니다:

  • CPU 부하
  • 네트워크 연결 수
  • 사용 가능한 메모리

개별 작업자가 과도하게 커밋되지 않도록 하려면 인스턴스별 동시성을 스로틀해야 할 수 있습니다. 각 작업자에서 동시에 실행되는 함수 수를 제한하여 해당 작업자의 리소스 한계를 소진하는 것을 방지할 수 있습니다.

참고: 동시성 스로틀은 로컬에서만 적용되어 작업자별로 현재 처리 중인 것을 제한합니다. 따라서 이러한 스로틀은 시스템의 총 처리량을 제한하지 않습니다.

: 경우에 따라 작업자별 동시성을 스로틀하면 실제로 시스템의 총 처리량을 _증가_시킬 수 있습니다. 이는 각 작업자가 더 적은 작업을 수행하여 확장 컨트롤러가 큐를 따라잡기 위해 더 많은 작업자를 추가하게 되고, 이로 인해 총 처리량이 증가할 때 발생할 수 있습니다.

스로틀 구성

액티비티, 오케스트레이터 및 엔터티 함수 동시성 제한은 host.json 파일에서 구성할 수 있습니다.

관련 설정

  • durableTask/maxConcurrentActivityFunctions: 액티비티 함수용
  • durableTask/maxConcurrentOrchestratorFunctions: 오케스트레이터 및 엔터티 함수용

이 설정들은 단일 작업자에서 메모리에 로드되는 오케스트레이터, 엔터티 또는 액티비티 함수의 최대 수를 제어합니다.

maxConcurrentActivityFunctions 기본값

웹 검색 결과에 따르면 maxConcurrentActivityFunctions의 기본값은 다음과 같습니다:

  • Consumption 플랜: 10
  • Dedicated/Premium 플랜: 10 × 현재 머신의 프로세서 수

중요한 점

참고: 오케스트레이션과 엔터티는 이벤트나 작업을 적극적으로 처리하거나 인스턴스 캐싱이 활성화된 경우에만 메모리에 로드됩니다. 로직을 실행하고 대기한 후(즉, 오케스트레이터 함수 코드에서 await (C#) 또는 yield (JavaScript, Python) 문을 만난 후) 메모리에서 언로드될 수 있습니다.

수백만 개의 오케스트레이션이나 엔터티가 "실행 중" 상태에 있더라도, 활성 메모리에 로드될 때만 스로틀 제한에 포함됩니다.

Functions 2.0 구성 예시

{
  "extensions": {
    "durableTask": {
      "maxConcurrentActivityFunctions": 10,
      "maxConcurrentOrchestratorFunctions": 10
    }
  }
}

Functions 1.x 구성 예시

{
  "durableTask": {
    "maxConcurrentActivityFunctions": 10,
    "maxConcurrentOrchestratorFunctions": 10
  }
}

언어 런타임 고려사항

선택한 언어 런타임은 함수에 엄격한 동시성 제한을 가할 수 있습니다. 예를 들어, Python이나 PowerShell로 작성된 Durable Functions 앱은 단일 VM에서 한 번에 하나의 함수만 실행하도록 지원할 수 있습니다.

언어 런타임이 동시성에 제한을 두는 경우, 언어 런타임의 동시성 설정과 일치하도록 Durable Functions 동시성 설정을 업데이트해야 합니다.

Python 예시

Python 앱이 동시성을 4개 함수로 제한하는 경우(예: 단일 언어 작업자 프로세스에서 4개 스레드 또는 4개 언어 작업자 프로세스에서 1개 스레드), maxConcurrentOrchestratorFunctionsmaxConcurrentActivityFunctions을 모두 4로 구성해야 합니다.

파티션 수

일부 스토리지 공급자는 파티셔닝 메커니즘을 사용하며 partitionCount 매개변수를 지정할 수 있습니다.

파티셔닝을 사용할 때 작업자는 개별 작업 항목에 대해 직접 경쟁하지 않습니다. 대신 작업 항목이 먼저 partitionCount 파티션으로 그룹화됩니다. 그런 다음 이러한 파티션이 작업자에게 할당됩니다.

파티셔닝의 이점

이러한 파티션된 부하 분산 접근 방식은 다음과 같은 도움을 줄 수 있습니다:

  • 필요한 총 스토리지 액세스 수 감소
  • 인스턴스 캐싱 활성화 및 지역성 개선
  • 어피니티 생성: 동일한 인스턴스의 모든 작업 항목이 동일한 작업자에 의해 처리됨

참고: 파티셔닝은 최대 partitionCount 작업자만 파티션된 큐에서 작업 항목을 처리할 수 있기 때문에 확장을 제한합니다.

스토리지 공급자별 파티셔닝

스토리지 공급자인스턴스 메시지액티비티 메시지기본 partitionCount최대 partitionCount
Azure Storage파티션됨파티션되지 않음416
Netherite파티션됨파티션됨1232
MSSQL파티션되지 않음파티션되지 않음n/an/a

경고: 파티션 수는 태스크 허브가 생성된 후에는 더 이상 변경할 수 없습니다. 따라서 태스크 허브 인스턴스의 향후 확장 요구 사항을 수용할 수 있을 만큼 충분히 큰 값으로 설정하는 것이 좋습니다.

파티션 수 구성

partitionCount 매개변수는 host.json 파일에서 지정할 수 있습니다.

Durable Functions 2.x

{
  "extensions": {
    "durableTask": {
      "storageProvider": {
        "partitionCount": 3
      }
    }
  }
}

Durable Functions 1.x

{
  "extensions": {
    "durableTask": {
      "partitionCount": 3
    }
  }
}

호출 지연 시간 최소화 고려사항

정상적인 상황에서 호출 요청(액티비티, 오케스트레이터, 엔터티 등)은 상당히 빠르게 처리되어야 합니다. 그러나 다음과 같은 요인에 따라 달라지므로 호출 요청의 최대 지연 시간에 대한 보장은 없습니다:

  • App Service 플랜의 확장 동작 유형
  • 동시성 설정
  • 애플리케이션의 백로그 크기

따라서 애플리케이션의 테일 지연 시간을 측정하고 최적화하기 위한 스트레스 테스트에 투자하는 것을 권장합니다.

성능 대상

프로덕션 애플리케이션에 Durable Functions를 사용할 계획이라면 계획 프로세스 초기에 성능 요구 사항을 고려하는 것이 중요합니다.

기본 사용 시나리오

  • 순차적 액티비티 실행: 일련의 액티비티 함수를 차례로 실행하는 오케스트레이터 함수
  • 병렬 액티비티 실행: Fan-out, Fan-in 패턴을 사용하여 많은 액티비티 함수를 병렬로 실행하는 오케스트레이터 함수
  • 병렬 응답 처리: Fan-out, Fan-in 패턴의 두 번째 절반으로, fan-in의 성능에 중점
  • 외부 이벤트 처리: 외부 이벤트를 한 번에 하나씩 기다리는 단일 오케스트레이터 함수 인스턴스
  • 엔터티 작업 처리: 단일 Counter 엔터티가 지속적인 작업 스트림을 얼마나 빠르게 처리할 수 있는지 테스트

성능 수치

각 스토리지 공급자의 해당 문서에서 이러한 시나리오에 대한 처리량 수치를 제공합니다:

: fan-out과 달리 fan-in 작업은 단일 VM으로 제한됩니다. 애플리케이션이 fan-out, fan-in 패턴을 사용하고 fan-in 성능이 우려되는 경우, 여러 하위 오케스트레이션에서 액티비티 함수 fan-out을 세분화하는 것을 고려하세요.

모범 사례

성능 최적화

  1. 적절한 동시성 설정: 워크로드와 리소스에 맞는 동시성 수준 설정
  2. 캐싱 활용: 가능한 경우 인스턴스 캐싱 활성화
  3. 파티션 수 조정: 확장 요구사항에 맞는 파티션 수 설정
  4. 언어별 고려사항: 사용하는 언어의 동시성 특성 이해

모니터링 및 측정

  1. 스트레스 테스트: 프로덕션 배포 전 철저한 성능 테스트 실시
  2. 메트릭 수집: Application Insights를 통한 성능 메트릭 모니터링
  3. 지연 시간 분석: 테일 지연 시간에 특별히 주의

확장성 고려사항

  1. 제로 확장: 유휴 시간 동안 비용 절약을 위한 제로 확장 활용
  2. 프리미엄 플랜: 예측 가능한 성능이 필요한 경우 프리미엄 플랜 고려
  3. 리소스 계획: 예상 부하에 따른 적절한 리소스 계획

관련 리소스

출처

이 문서는 다음 Microsoft Learn 문서들을 기반으로 작성되었습니다:

주요 참조 문서

  1. Performance and scale in Durable Functions (opens in a new tab)

    • Durable Functions의 성능 및 확장성 최적화
    • 작업자 확장, 동시성 스로틀, 파티션 수 등 핵심 개념
  2. host.json reference for Azure Functions (opens in a new tab)

    • Azure Functions host.json 파일 구성 참조
    • durableTask, concurrency, logging 등 상세 설정

추가 참조 문서

  1. Durable Functions best practice reference (opens in a new tab)

    • Durable Functions 모범 사례 가이드
    • 성능 최적화 및 실무 권장사항
  2. Azure Functions scale and hosting (opens in a new tab)

    • Azure Functions 확장 및 호스팅 옵션
    • Consumption, Premium, Dedicated 플랜 비교
  3. Event streaming architecture (opens in a new tab)

    • Azure 이벤트 스트리밍 아키텍처
    • 고성능 이벤트 처리 패턴
  4. Python scale and performance reference (opens in a new tab)

    • Python Azure Functions 확장 및 성능
    • 언어별 성능 최적화 가이드

관련 깃허브 저장소


번역 및 편집: 이 문서는 위의 Microsoft Learn 문서들을 한국어로 번역하고 이해하기 쉽게 재구성한 것입니다.

host.json 구성 참조

Azure Functions에서 성능과 확장성을 최적화하려면 host.json 파일의 구성을 이해하는 것이 중요합니다. 이 섹션에서는 Durable Functions와 관련된 주요 설정들을 설명합니다.

host.json 개요

host.json 메타데이터 파일에는 함수 앱 인스턴스의 모든 함수에 영향을 주는 구성 옵션이 포함되어 있습니다. 이 파일은 Azure Functions 런타임 버전 2.x부터 사용할 수 있는 설정들을 나열합니다.

참고: 이 문서는 Azure Functions 2.x 이상 버전을 위한 것입니다. Functions 1.x의 host.json 참조는 별도 문서를 참조하세요.

다른 함수 앱 구성 옵션은 함수 앱이 실행되는 위치에 따라 관리됩니다:

  • Azure에 배포된 경우: 애플리케이션 설정에서
  • 로컬 컴퓨터: local.settings.json 파일에서

바인딩과 관련된 host.json의 구성은 함수 앱의 각 함수에 동일하게 적용됩니다.

샘플 host.json 파일

다음은 가능한 모든 옵션이 지정된 버전 2.x+용 샘플 host.json 파일입니다:

{
    "version": "2.0",
    "aggregator": {
        "batchSize": 1000,
        "flushTimeout": "00:00:30"
    },
    "concurrency": { 
        "dynamicConcurrencyEnabled": true, 
        "snapshotPersistenceEnabled": true 
    },
    "extensions": {
        "blobs": {},
        "cosmosDb": {},
        "durableTask": {
            "maxConcurrentActivityFunctions": 10,
            "maxConcurrentOrchestratorFunctions": 10,
            "storageProvider": {
                "partitionCount": 4
            }
        },
        "eventHubs": {},
        "http": {},
        "queues": {},
        "sendGrid": {},
        "serviceBus": {}
    },
    "extensionBundle": {
        "id": "Microsoft.Azure.Functions.ExtensionBundle",
        "version": "[4.0.0, 5.0.0)"
    },
    "functions": [ "QueueProcessor", "GitHubWebHook" ],
    "functionTimeout": "00:05:00",
    "healthMonitor": {
        "enabled": true,
        "healthCheckInterval": "00:00:10",
        "healthCheckWindow": "00:02:00",
        "healthCheckThreshold": 6,
        "counterThreshold": 0.80
    },
    "logging": {
        "fileLoggingMode": "debugOnly",
        "logLevel": {
          "Function.MyFunction": "Information",
          "default": "None"
        },
        "applicationInsights": {
            "samplingSettings": {
              "isEnabled": true,
              "maxTelemetryItemsPerSecond" : 20
            }
        }
    },
    "managedDependency": {
        "enabled": true
    },
    "singleton": {
      "lockPeriod": "00:00:15",
      "listenerLockPeriod": "00:01:00",
      "listenerLockRecoveryPollingInterval": "00:01:00",
      "lockAcquisitionTimeout": "00:01:00",
      "lockAcquisitionPollingInterval": "00:00:03"
    },
    "watchDirectories": [ "Shared", "Test" ],
    "watchFiles": [ "myFile.txt" ]
}

주요 구성 속성

aggregator

Application Insights에 대한 메트릭을 계산할 때 집계되는 함수 호출 수를 지정합니다.

{
    "aggregator": {
        "batchSize": 1000,
        "flushTimeout": "00:00:30"
    }
}
속성기본값설명
batchSize1000집계할 최대 요청 수
flushTimeout00:00:30집계할 최대 시간 간격

concurrency

동적 동시성 기능을 제어합니다.

{
    "concurrency": { 
        "dynamicConcurrencyEnabled": true, 
        "snapshotPersistenceEnabled": true 
    }
}
속성기본값설명
dynamicConcurrencyEnabledfalse동적 동시성 활성화 여부
snapshotPersistenceEnabledfalse동시성 스냅샷 지속성 활성화 여부

durableTask (Durable Functions)

Durable Functions와 관련된 핵심 설정들입니다.

{
    "extensions": {
        "durableTask": {
            "maxConcurrentActivityFunctions": 10,
            "maxConcurrentOrchestratorFunctions": 10,
            "storageProvider": {
                "partitionCount": 4,
                "controlQueueBatchSize": 32,
                "controlQueueBufferThreshold": 256,
                "controlQueueVisibilityTimeout": "00:05:00",
                "maxQueuePollingInterval": "00:00:30",
                "extendedSessionsEnabled": false,
                "extendedSessionIdleTimeoutInSeconds": 30
            },
            "hubName": "DurableFunctionsHub",
            "taskEventLockTimeout": "00:05:00",
            "taskOrchestrationDispatcherSettings": {
                "dispatcherCount": 1
            },
            "taskActivityDispatcherSettings": {
                "dispatcherCount": 1
            }
        }
    }
}
주요 durableTask 설정
속성기본값설명
maxConcurrentActivityFunctionsConsumption: 10, Dedicated/Premium: 10 × CPU 수단일 작업자에서 동시에 처리할 수 있는 액티비티 함수의 최대 수
maxConcurrentOrchestratorFunctionsConsumption: 5, Dedicated/Premium: 10 × CPU 수단일 작업자에서 동시에 처리할 수 있는 오케스트레이터 함수의 최대 수
hubNameDurableFunctionsHub태스크 허브 이름
taskEventLockTimeout00:05:00작업 이벤트 락 타임아웃
스토리지 공급자 설정 (Azure Storage)
속성기본값설명
partitionCount4컨트롤 큐의 파티션 수 (1-16)
controlQueueBatchSize32컨트롤 큐에서 한 번에 디큐할 메시지 수
controlQueueBufferThreshold256메모리에 버퍼링할 수 있는 컨트롤 큐 메시지 수
extendedSessionsEnabledfalse확장된 세션 활성화 여부
extendedSessionIdleTimeoutInSeconds30확장된 세션 유휴 타임아웃 (초)

extensionBundle

확장 번들 구성을 제어합니다.

{
    "extensionBundle": {
        "id": "Microsoft.Azure.Functions.ExtensionBundle",
        "version": "[4.0.0, 5.0.0)"
    }
}
속성설명
idMicrosoft Azure Functions 확장 번들의 네임스페이스
version설치할 번들의 버전 범위

functionTimeout

모든 함수 실행에 대한 타임아웃 기간을 나타냅니다. -1 값은 무제한 실행을 의미하지만 고정된 상한선을 유지하는 것이 권장됩니다.

{
    "functionTimeout": "00:05:00"
}

특정 플랜의 기본값 및 최대값에 대한 자세한 내용은 함수 앱 타임아웃 기간 (opens in a new tab) 문서를 참조하세요.

healthMonitor

호스트 상태 모니터에 대한 구성 설정입니다.

{
    "healthMonitor": {
        "enabled": true,
        "healthCheckInterval": "00:00:10",
        "healthCheckWindow": "00:02:00",
        "healthCheckThreshold": 6,
        "counterThreshold": 0.80
    }
}
속성기본값설명
enabledtrue기능 활성화 여부
healthCheckInterval10초주기적인 백그라운드 상태 확인 간격
healthCheckWindow2분healthCheckThreshold 설정과 함께 사용되는 슬라이딩 시간 창
healthCheckThreshold6호스트 재활용이 시작되기 전 상태 확인 실패 최대 횟수
counterThreshold0.80성능 카운터가 비정상으로 간주되는 임계값

logging

Application Insights를 포함한 함수 앱의 로깅 동작을 제어합니다.

{
    "logging": {
        "fileLoggingMode": "debugOnly",
        "logLevel": {
          "Function.MyFunction": "Information",
          "default": "None"
        },
        "applicationInsights": {
            "samplingSettings": {
                "isEnabled": true,
                "maxTelemetryItemsPerSecond": 20,
                "evaluationInterval": "01:00:00",
                "initialSamplingPercentage": 100.0
            },
            "enableLiveMetrics": true,
            "enableDependencyTracking": true,
            "enablePerformanceCountersCollection": true
        }
    }
}
주요 logging 설정
속성기본값설명
fileLoggingModedebugOnlyAzure에서 실행할 때 파일 로깅 동작 결정 (never, always, debugOnly)
logLeveln/a앱의 함수에 대한 로그 카테고리 필터링을 정의하는 객체
Application Insights 설정
속성기본값설명
enableLiveMetricstrue라이브 메트릭 수집 활성화
enableDependencyTrackingtrue종속성 추적 활성화
enablePerformanceCountersCollectiontrueKudu 성능 카운터 수집 활성화

singleton

Singleton 잠금 동작에 대한 구성 설정입니다.

{
    "singleton": {
      "lockPeriod": "00:00:15",
      "listenerLockPeriod": "00:01:00",
      "listenerLockRecoveryPollingInterval": "00:01:00",
      "lockAcquisitionTimeout": "00:01:00",
      "lockAcquisitionPollingInterval": "00:00:03"
    }
}
속성기본값설명
lockPeriod00:00:15함수 수준 잠금이 적용되는 기간
listenerLockPeriod00:01:00리스너 잠금이 적용되는 기간
listenerLockRecoveryPollingInterval00:01:00시작 시 리스너 잠금을 획득할 수 없는 경우 리스너 잠금 복구에 사용되는 시간 간격
lockAcquisitionTimeout00:01:00런타임이 잠금 획득을 시도하는 최대 시간
lockAcquisitionPollingIntervaln/a잠금 획득 시도 간격

host.json 값 재정의

특정 환경에 대해 host.json 파일의 특정 설정을 구성하거나 수정하고 싶지만 host.json 파일 자체를 변경하고 싶지 않은 경우가 있을 수 있습니다. 애플리케이션 설정으로 동등한 값을 생성하여 특정 host.json 값을 재정의할 수 있습니다.

런타임이 AzureFunctionsJobHost__path__to__setting 형식의 애플리케이션 설정을 찾으면 JSON의 path.to.setting에 있는 동등한 host.json 설정을 재정의합니다. 애플리케이션 설정으로 표현될 때 JSON 계층 구조를 나타내는 데 사용되는 점(.)은 이중 밑줄(__)로 대체됩니다.

예시: Application Insights 샘플링 비활성화

로컬에서 실행할 때 Application Insight 샘플링을 비활성화하려는 경우, 로컬 host.json 파일을 변경하면 배포 중에 이 변경 사항이 프로덕션 앱으로 푸시될 수 있습니다. 더 안전한 방법은 local.settings.json 파일에서 "AzureFunctionsJobHost__logging__applicationInsights__samplingSettings__isEnabled":"false"로 애플리케이션 설정을 만드는 것입니다.

{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "{storage-account-connection-string}",
        "FUNCTIONS_WORKER_RUNTIME": "{language-runtime}",
        "AzureFunctionsJobHost__logging__applicationInsights__samplingSettings__isEnabled":"false"
    }
}

환경별 구성 모범 사례

개발 환경

{
    "version": "2.0",
    "extensions": {
        "durableTask": {
            "maxConcurrentActivityFunctions": 5,
            "maxConcurrentOrchestratorFunctions": 5,
            "storageProvider": {
                "extendedSessionsEnabled": false,
                "partitionCount": 2
            }
        }
    },
    "logging": {
        "logLevel": {
            "default": "Information"
        }
    }
}

프로덕션 환경

{
    "version": "2.0",
    "extensions": {
        "durableTask": {
            "maxConcurrentActivityFunctions": 50,
            "maxConcurrentOrchestratorFunctions": 20,
            "storageProvider": {
                "extendedSessionsEnabled": true,
                "extendedSessionIdleTimeoutInSeconds": 60,
                "partitionCount": 16
            }
        }
    },
    "logging": {
        "logLevel": {
            "default": "Warning"
        },
        "applicationInsights": {
            "samplingSettings": {
                "isEnabled": true,
                "maxTelemetryItemsPerSecond": 100
            }
        }
    },
    "healthMonitor": {
        "enabled": true,
        "healthCheckInterval": "00:00:05",
        "healthCheckThreshold": 3
    }
}

성능 최적화를 위한 host.json 설정 가이드

1. Durable Functions 동시성 최적화

{
    "extensions": {
        "durableTask": {
            "maxConcurrentActivityFunctions": 50,
            "maxConcurrentOrchestratorFunctions": 20,
            "storageProvider": {
                "partitionCount": 16,
                "controlQueueBatchSize": 64,
                "extendedSessionsEnabled": true,
                "extendedSessionIdleTimeoutInSeconds": 300
            }
        }
    }
}

2. 동적 동시성 활성화

{
    "concurrency": {
        "dynamicConcurrencyEnabled": true,
        "snapshotPersistenceEnabled": true
    }
}

3. Application Insights 최적화

{
    "logging": {
        "applicationInsights": {
            "samplingSettings": {
                "isEnabled": true,
                "maxTelemetryItemsPerSecond": 50,
                "excludedTypes": "Request;Dependency"
            },
            "enableLiveMetrics": false,
            "enableDependencyTracking": false
        }
    }
}