Değişiklik akışı tahmin aracını kullanın

Bu makalede değişiklik akışı işlemcisi örneklerinizin değişiklik akışını okurken ilerlemesini nasıl izleyebileceğiniz açıklanmaktadır.

İzleme ilerlemesi neden önemlidir?

Değişiklik akışı işlemcisi, değişiklik akışınızda ileriye doğru hareket eden ve değişiklikleri temsilci uygulamasına teslim eden bir işaretçi işlevi görür.

Değişiklik akışı işlemcisi dağıtımınız CPU, bellek, ağ gibi kullanılabilir kaynaklarına göre değişiklikleri belirli bir hızda işleyebilir.

Bu hız, Değişikliklerinizin Azure Cosmos DB kapsayıcınızda gerçekleşme hızından daha yavaşsa işlemciniz gecikmeye başlar.

Bu senaryoyı tanımlamak, değişiklik akışı işlemci dağıtımımızı ölçeklendirmemiz gerekip gerekmediğini anlamanıza yardımcı olur.

Değişiklik akışı tahmin aracını uygulama

Otomatik bildirimler için push modeli olarak

Değişiklik akışı işlemcisi gibi, değişiklik akışı tahmin aracı da itme modeli olarak çalışabilir. Tahmin aracı, son işlenen öğe (kira kapsayıcısının durumuyla tanımlanır) ile kapsayıcıdaki en son değişiklik arasındaki farkı ölçer ve bu değeri bir temsilciye iletir. Ölçümün alındığı aralık, varsayılan 5 saniyelik bir değerle de özelleştirilebilir.

Örneğin, değişiklik akışı işlemciniz en son sürüm modunu kullanıyorsa ve şöyle tanımlanmışsa:

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();

İşlemciyi ölçmek için bir tahminci başlatmanın doğru yolu, şu şekilde GetChangeFeedEstimatorBuilder kullanmaktır:

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

Burada hem işlemci hem de tahmin aracı aynı leaseContainer ve aynı adı paylaşır.

İşlemci tarafından okunmayı bekleyen kaç değişiklik olduğunu belirten sayı alan bir delege ve bu ölçümün alınmasını istediğiniz zaman aralığı, diğer iki parametredir.

Bir tahmini alan temsilciye örnek:

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);
}

Bu tahmini izleme çözümünüze gönderebilir ve ilerleme durumunuzun zaman içinde nasıl çalıştığını anlamak için kullanabilirsiniz.

İsteğe bağlı ayrıntılı tahmin olarak

İtme modelinin aksine, tahmini talep üzerine elde etmenizi sağlayan bir alternatif vardır. Bu model ayrıca daha ayrıntılı bilgiler sağlar:

  • Kira başına tahmini gecikme.
  • Her kirayı sahiplenen ve işleyen örneği, bir örnekte sorun olup olmadığını belirleyebilmeniz için tanımlayabilirsiniz.

Değişiklik akışı işlemciniz şu şekilde tanımlanmışsa:

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();

Tahminciyi aynı kira yapılandırmasıyla oluşturabilirsiniz.

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

İstediğiniz zaman, ihtiyacınız olan sıklıkta ayrıntılı tahmin elde edebilirsiniz:

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.");
    }
}

Her ChangeFeedProcessorState biri kiralama ve gecikme bilgilerini ve ayrıca bu bilgilere sahip olan geçerli örneğin kim olduğunu içerir.

Estimatör dağıtımı

Değişiklik akışı tahmin aracının, değişiklik akışı işlemcinizin bir parçası olarak dağıtılması veya aynı projenin parçası olması gerekmez. Tahmin aracını işlemcilerinizden bağımsız bir örneğe dağıtmanızı öneririz. Tek bir tahminleyici örneği, değişim akışı işlemcisi dağıtımınızdaki tüm kiralamalar ve örneklerin ilerleme durumunu izleyebilir.

Her tahmin, izlenen ve kira kapsayıcılarınızdakiistek birimlerini kullanır. Aralarında 1 dakikalık bir sıklık iyi bir başlangıç noktasıdır, sıklık ne kadar düşük olursa, kullanılan istek birimleri o kadar yüksek olur.

Desteklenen değişiklik akışı modları

Değişiklik akışı tahmin aracı hem en son sürüm modu hem de tüm sürümler ve silmeler modu için kullanılabilir. Her iki modda da sağlanan tahminin, işlenmesi gereken bekleyen değişikliklerin tam sayısı olduğu garanti değildir.

Ek kaynaklar

Sonraki Adımlar

Şimdi aşağıdaki makalede değişiklik akışı işlemcisi hakkında daha fazla bilgi edinebilirsiniz: