programing

Azure Function App에서 Azure 스토리지 큐 조절 처리

jooyons 2023. 5. 25. 21:59
반응형

Azure Function App에서 Azure 스토리지 큐 조절 처리

각 큐 항목이 URL인 큐를 처리하는 Azure Storage Queue 트리거가 있는 Azure Function 앱을 만들었습니다.기능은 URL의 내용만 다운로드합니다.사이트의 XML 사이트 맵을 로드하고 구문 분석하여 모든 페이지 URL을 큐에 추가하는 다른 기능이 있습니다.제가 가지고 있는 문제는 함수 앱이 너무 빨리 실행되고 웹사이트를 망치로 쳐서 서버 오류가 반환되기 시작한다는 것입니다.기능 앱이 실행되는 속도를 제한/스로틀하는 방법이 있습니까?

물론 직렬로 처리하는 간단한 웹 작업을 작성할 수도 있지만(또는 비동기식을 사용하여 동시 요청 수를 제한할 수도 있습니다), 저는 Azure 함수의 단순성이 정말 마음에 들고 "서버리스" 컴퓨팅을 사용해 보고 싶었습니다.

고려할 수 있는 몇 가지 옵션이 있습니다.

먼저, 에서 구성할 수 있는 몇 가지 노브가 있습니다.host.json제어 대기열 처리(여기에 설명됨).queues.batchSize노브는 한 번에 가져오는 대기열 메시지 수를 나타냅니다.1로 설정하면 런타임은 한 번에 하나의 메시지를 가져오고 해당 메시지에 대한 처리가 완료될 때만 다음 메시지를 가져옵니다.이렇게 하면 단일 인스턴스에 대해 일정 수준의 직렬화를 수행할 수 있습니다.

다른 옵션은 NextVisible을 설정하는 것입니다.띄어쓰기 방식으로 큐에 넣을 수 있는 메시지의 시간 - 기본적으로 큐에 있는 메시지는 즉시 표시되고 처리할 수 있습니다.

마지막 옵션은 한 번에 하나씩이 아니라 사이트에 대한 모든 URL 모음으로 메시지를 큐에 넣을 수 있으므로 메시지가 처리될 때 URL을 함수에서 연속적으로 처리하고 병렬 처리를 제한할 수 있습니다.

다음 표시대기열에 여러 개의 병렬 함수가 추가되면 시간이 복잡해질 수 있습니다.이 문제가 있는 모든 사용자를 위한 또 다른 간단한 옵션:다른 대기열인 "스로틀링된 항목"을 만들고 원래 기능이 대기열 트리거에 대해 이를 따르도록 합니다.그런 다음, NextVisible 간격을 두고 1분마다 원래 큐에서 메시지를 이동하는 간단한 타이머 기능을 추가합니다.에 따른 시간.

    [FunctionName("ThrottleQueueItems")]
    public static async Task Run([TimerTrigger("0 * * * * *")] TimerInfo timer, ILogger logger)
    {
        var originalQueue = // get original queue here;
        var throttledQueue = // get throttled queue here;
        var itemsPerMinute = 60; // get from app settings
        var individualDelay = 60.0 / itemsPerMinute;
        var totalRetrieved = 0;
        var maxItemsInBatch = 32; // change if you modify the default queue config
        do
        {
            var pending = (await originalQueue.GetMessagesAsync(Math.Min(maxItemsInBatch, itemsPerMinute - totalRetrieved))).ToArray();
            if (!pending.Any())
                break;
            foreach (var message in pending)
            {
                await throttledQueue.AddMessageAsync(new CloudQueueMessage(message.AsString), null,
                                                                                        TimeSpan.FromSeconds(individualDelay * ++totalRetrieved), null, null);
                await originalQueue.DeleteMessageAsync(message);
            }
        } while (itemsPerMinute > totalRetrieved);
    }

저는 비슷한 문제를 해결하려다가 이 게시물을 발견했습니다.이것은 이곳에 도착하는 모든 사람에게 유용할 수 있습니다.이제 WEBITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT 앱 설정을 사용하여 함수의 동시 인스턴스 수를 제한할 수 있습니다.이 값을 배치 제한 1과 결합하여 1로 설정하면 대기열의 직렬 처리를 수행할 수 있습니다.

웹사이트_MAX_DYNAMIC_APPLIC_스케일_아웃

함수 앱이 확장할 수 있는 최대 인스턴스 수입니다.기본값은 제한 없음입니다.

https://learn.microsoft.com/en-gb/azure/azure-functions/functions-app-settings#website_max_dynamic_application_scale_out

언급URL : https://stackoverflow.com/questions/40094041/throttling-azure-storage-queue-processing-in-azure-function-app

반응형