Azure 함수에서 우아하게 꺼지는 최고의 실천

Azure Functions 등 서버가 없는 응용 프로그램의 경우 정상적으로 꺼지는 것은 응용 프로그램의 완전성을 유지하는 중요한 과정이다.
서버가 없는 프로그램이 자주 재부팅되기 때문이다.이것은 주로 플랫폼 업데이트와 응용 프로그램의 새로운 버전의 배치 때문이다.
함수가 실행될 때 다시 시작할 생각을 하셨습니까?우아하게 끄는 최선의 실천을 배워 후회를 피하자.

취소 토큰 전달

CancellationToken는 에서 일반적인 비동기 처리를 취소하는 방법을 제공했다.그물Azure 함수에는 CancellationToken 바인딩에 대한 지원이 내장되어 있습니다.
  • Task cancellation | Microsoft Docs
  • Cancellation tokens - Azure Functions C# developer reference | Microsoft Docs
  • CancellationToken, 귀속을 통해 얻을 수 있으며 응용 프로그램의 생명 주기에 삽입되어 닫기를 쉽게 감지할 수 있습니다.
    예시 코드는 매우 간단한 용법을 설명했다.
    public class Function1
    {
        [FunctionName("Function1")]
        public async Task Run([TimerTrigger("0 */5 * * * *")] TimerInfo timer, ILogger log, CancellationToken cancellationToken)
        {
            try
            {
                log.LogInformation("Function executing");
    
                // Simulate time-consuming processes
                await Task.Delay(TimeSpan.FromSeconds(30), cancellationToken);
    
                log.LogInformation("Function executed");
            }
            catch (OperationCanceledException)
            {
                log.LogWarning("Function cancelled");
            }
        }
    }
    
    Task.Delay를 사용하여 비교적 긴 과정을 시뮬레이션하다.주의, Task.Delay 전달CancellationToken.
    함수가 실행될 때 Ctrl+C 종료 신호를 보내면 시간 소모 과정을 취소하고 OperationCanceledException 이상을 포착하여 로그를 출력합니다.

    Azure 함수를 다시 시작하거나 배치할 때 발송Ctrl+C과 같은 과정을 수행하기 때문에 정확한 처리CancellationToken를 통해 프로그램의 완전성을 훼손하지 않고 종료 과정을 실현할 수 있습니다.

    재시도 정책 사용

    CosmosDBTriggerEventHubTrigger는 기능이 실패하면 미리 체크포인트를 확인하기 때문에 재시도 정책과 함께 사용하는 것을 권장합니다.


    이 트리거에서 꺼진 것이 검출되면 이 기능은 고의로 실패하여 다시 시도할 수 없습니다.
    public class Function2
    {
        [FixedDelayRetry(-1, "00:00:10")]
        [FunctionName("Function2")]
        public async Task Run([CosmosDBTrigger(
                                  databaseName: "HackAzure",
                                  collectionName: "TodoItem",
                                  ConnectionStringSetting = "CosmosConnection",
                                  LeaseCollectionName = "Lease")]
                              IReadOnlyList<Document> input, ILogger log, CancellationToken cancellationToken)
        {
            if (input == null || input.Count <= 0)
            {
                return;
            }
    
            try
            {
                // Process change feed
                log.LogInformation("Function executing");
    
                foreach (var document in input)
                {
                    log.LogInformation($"Id = {document.Id}");
                }
    
                // Simulate time-consuming process
                await Task.Delay(TimeSpan.FromSeconds(30), cancellationToken);
    
                log.LogInformation("Function executed");
            }
            catch (OperationCanceledException)
            {
                // Process for shutdown
                log.LogWarning("Function cancelled");
    
                // Rethrow exception (Keep current checkpoint)
                throw;
            }
        }
    }
    
    이 예시 코드 포획OperationCanceledException 및 최소한의 필요 닫기 처리를 실행한 후 다시 이상을 일으킵니다.
    예외가 재시도되면 해당 예외는 닫히므로 재시도되지 않지만 현재 체크포인트를 유지하는 데 사용됩니다.

    첫 번째 실행(Ctrl+C 전송)


    첫 번째 운행 중 꺼진 신호는 CosmosDBTrigger 처리 과정에서 발송되기 때문에 이상을 일으키고 취소 과정을 실행한다.

    두 번째 실행(정책 재시도)


    검사점은 재시도 정책에 의해 유지보수되기 때문에, 두 번째 실행은 중단된 변경 요약의 계속에서 시작됩니다.

    재시도 전략과 결합하면 프로세스가 중단되는 것에 대한 용인도를 높일 수 있다.
    재시도 정책은 Azure 함수의 내결함성을 높일 수 있지만 함수의 幂등성을 실현해야 하는 매우 유용한 기능이다.

    폐쇄 과정은 신속하게 완성해야 한다


    Azure 기능 중 우아한 종료는 CancellationToken과 재시도 전략의 정확한 조합을 통해 이뤄졌다.
    마지막으로 주의해야 할 것은 꺼지기 전에 대기 시간이 존재한다는 것이다.불행히도, 그것은 현재 10초로 고정되어 있다.(ASP의 기본값은 shutdownTimeLimit입니다.NET 코어 모듈)
  • Configuration with web.config - ASP.NET Core Module | Microsoft Docs
  • 이 시간 초과를 초과하면 시스템이 종료되어 시간이 걸리는 종료 과정을 진행할 수 없습니다.
    일부 응용 프로그램의 경우, 10초의 고정 시간 초과는 충분하지 않기 때문에, 아래의 GitHub 문제에서 변경하는 것을 권장합니다.

    시스템 종료 제한 시간을 설정 가능하거나 기본값 증가 #7103



    shibayan
    출시 날짜

    요청한 기능은 어떤 문제를 해결합니까?묘사해 주세요.


    배치된 지 오래된 함수로 인한 중단을 준비하기 위해서, 우리는 CancellationToken 을 사용하여 그것들을 검사하고, 정상적인 닫기를 위해 필요한 처리를 실행합니다.
    그러나 기능이 성공적으로 완성되기 전에 강제로 닫히는 경우도 있는 것 같다.
    로그를 보십시오. 로그는 약 10초 후에 닫히기 때문에 AspNetCoreModule shutdownTimeLimit 값에 달려 있는 것 같습니다.
    https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/web-config?view=aspnetcore-5.0#attributes-of-the-aspnetcore-element

    당신이 원하는 해결 방안을 설명하다

  • 값 구성 가능shutdownTimeLimit
  • 또는 기본값을 10초 단위로 늘립니다.
  • View on GitHub
    현재 幂 등 함수에서 이 함수를 실현하고 재시도 정책을 사용하여 다시 실행하는 것이 안전합니다.
    서버 없는 생활을 즐겨라!

    좋은 웹페이지 즐겨찾기