변경 피드 추정기 사용

적용 대상: NoSQL

이 문서에서는 변경 피드를 읽을 때 변경 피드 프로세서 인스턴스의 진행률을 모니터링하는 방법을 설명합니다.

모니터링 진행률이 중요한 이유는 무엇인가요?

변경 피드 프로세서는 변경 피드 전체에서 앞으로 이동하고 변경 내용을 대리자 구현에 전달하는 포인터 역할을 합니다.

변경 피드 프로세서 배포는 CPU, 메모리, 네트워크 등과 같은 사용 가능한 리소스에 따라 특정 속도로 변경 내용을 처리할 수 있습니다.

이 속도가 Azure Cosmos DB 컨테이너에서 변경이 발생하는 속도보다 느리면 프로세서가 지연되기 시작합니다.

이 시나리오를 식별하면 변경 피드 프로세서 배포의 크기를 조정해야 하는지 이해하는 데 도움이 됩니다.

변경 피드 추정기 구현

자동 알림에 대한 푸시 모델

변경 피드 프로세서와 마찬가지로, 변경 피드 추정기는 푸시 모델로 작동할 수 있습니다. 추정기는 마지막으로 처리된 항목(임대 컨테이너의 상태를 기준으로 정의)과 컨테이너의 마지막 변경 내용의 차이를 측정하고, 이 값을 대리자에게 푸시합니다. 측정 간격을 사용자 지정할 수 있으며, 기본값은 5초입니다.

예를 들어 변경 피드 프로세서가 다음과 같이 정의된 경우:

Container leaseContainer = client.GetContainer(databaseId, Program.leasesContainer);
Container monitoredContainer = client.GetContainer(databaseId, Program.monitoredContainer);
ChangeFeedProcessor changeFeedProcessor = monitoredContainer
    .GetChangeFeedProcessorBuilder<ToDoItem>("changeFeedEstimator", Program.HandleChangesAsync)
        .WithInstanceName("consoleHost")
        .WithLeaseContainer(leaseContainer)
        .Build();

예측기를 초기화하여 프로세서 GetChangeFeedEstimatorBuilder 를 측정하는 올바른 방법은 다음과 같습니다.

ChangeFeedProcessor changeFeedEstimator = monitoredContainer
    .GetChangeFeedEstimatorBuilder("changeFeedEstimator", Program.HandleEstimationAsync, TimeSpan.FromMilliseconds(1000))
    .WithLeaseContainer(leaseContainer)
    .Build();

프로세서와 추정기는 동일한 leaseContainer 및 동일한 이름을 공유합니다.

다른 두 매개 변수는 프로세서에서 읽을 보류 중인 변경 내용 수와 이 측정을 수행할 시간 간격을 나타내는 숫자를 받는 대리자입니다.

추정을 받는 대리자의 예는 다음과 같습니다.

static async Task HandleEstimationAsync(long estimation, CancellationToken cancellationToken)
{
    if (estimation > 0)
    {
        Console.WriteLine($"\tEstimator detected {estimation} items pending to be read by the Processor.");
    }

    await Task.Delay(0);
}

이 추정을 모니터링 솔루션에 보내고 이를 사용하여 시간이 지남에 따라 진행률이 어떻게 작동하는지 이해할 수 있습니다.

주문형 상세 예측으로

푸시 모델과 달리 수요에 따라 예측을 얻을 수 있는 대안이 있습니다. 이 모델은 더 자세한 정보도 제공합니다.

  • 임대당 예상 지연 시간입니다.
  • 인스턴스에서 각 임대를 소유하고 처리하므로 인스턴스에 문제가 있는지 확인할 수 있습니다.

변경 피드 프로세서가 다음과 같이 정의된 경우:

Container leaseContainer = client.GetContainer(databaseId, Program.leasesContainer);
Container monitoredContainer = client.GetContainer(databaseId, Program.monitoredContainer);
ChangeFeedProcessor changeFeedProcessor = monitoredContainer
    .GetChangeFeedProcessorBuilder<ToDoItem>("changeFeedEstimator", Program.HandleChangesAsync)
        .WithInstanceName("consoleHost")
        .WithLeaseContainer(leaseContainer)
        .Build();

동일한 임대 구성으로 추정기를 만들 수 있습니다.

ChangeFeedEstimator changeFeedEstimator = monitoredContainer
    .GetChangeFeedEstimator("changeFeedEstimator", leaseContainer);

필요할 때마다 필요한 빈도를 사용하여 자세한 추정을 얻을 수 있습니다.

Console.WriteLine("Checking estimation...");
using FeedIterator<ChangeFeedProcessorState> estimatorIterator = changeFeedEstimator.GetCurrentStateIterator();
while (estimatorIterator.HasMoreResults)
{
    FeedResponse<ChangeFeedProcessorState> states = await estimatorIterator.ReadNextAsync();
    foreach (ChangeFeedProcessorState leaseState in states)
    {
        string host = leaseState.InstanceName == null ? $"not owned by any host currently" : $"owned by host {leaseState.InstanceName}";
        Console.WriteLine($"Lease [{leaseState.LeaseToken}] {host} reports {leaseState.EstimatedLag} as estimated lag.");
    }
}

각각 ChangeFeedProcessorState 에는 임대 및 지연 정보가 포함되며, 임대 및 지연 정보를 소유하고 있는 현재 인스턴스도 포함됩니다.

예측 도구 배포

변경 피드 예측 도구는 변경 피드 프로세서의 일부로 배포하거나 동일한 프로젝트에 속할 필요가 없습니다. 프로세서와 완전히 다른 독립적인 인스턴스에 예측 도구를 배포하는 것이 좋습니다. 단일 예측 도구 인스턴스는 변경 피드 프로세서 배포의 모든 임대 및 인스턴스에 대한 진행률을 추적할 수 있습니다.

각 예측에는 모니터링된 컨테이너 및 임대 컨테이너요청 단위가 사용됩니다. 1분 사이의 빈도는 좋은 시작점이며, 빈도가 낮을수록 소비된 요청 단위가 높습니다.

추가 리소스

다음 단계

이제 다음 문서에서 변경 피드 프로세서에 대해 자세히 알아볼 수 있습니다.