Reliable Services bildirimleri

Bildirimler, istemcilerin ilgilendikleri bir nesnede yapılan değişiklikleri izlemesine olanak tanır. İki tür nesne bildirimleri destekler: Reliable State Manager ve Reliable Dictionary.

Bildirimleri kullanmanın yaygın nedenleri şunlardır:

  • İkincil dizinler veya çoğaltma durumunun toplu filtrelenmiş görünümleri gibi gerçekleştirilmiş görünümler oluşturma. Reliable Dictionary'deki tüm anahtarların sıralanmış dizini buna örnek olarak verilmiştir.
  • Son bir saat içinde eklenen kullanıcı sayısı gibi izleme verileri gönderme.

Bildirimler, işlemleri uygulamanın bir parçası olarak tetiklenir. Birincil çoğaltmada, işlemler veya this.StateManager.GetOrAddAsync()öğesinin bir parçası olarak çekirdek bildiriminden transaction.CommitAsync() sonra uygulanır. İkincil çoğaltmalarda işlemler çoğaltma kuyruğu veri işleme sırasında uygulanır. Bu nedenle bildirimler mümkün olan en hızlı şekilde işlenmelidir ve zaman uyumlu olaylar pahalı işlemler içermemelidir. Aksi takdirde, işlem işleme süresini ve çoğaltma derlemelerini olumsuz etkileyebilir.

Reliable State Manager bildirimleri

Reliable State Manager aşağıdaki olaylar için bildirimler sağlar:

  • İşlem
    • İşleme
  • Durum yöneticisi
    • Yeniden derleme
    • Güvenilir durum ekleme
    • Güvenilir bir durumun kaldırılması

Reliable State Manager geçerli uçak içi işlemleri izler. İşlem durumunda bir bildirimin tetiklenmesini sağlayan tek değişiklik, işlenen bir işlemdir.

Reliable State Manager, Reliable Dictionary ve Reliable Queue gibi güvenilir durumlardan oluşan bir koleksiyon tutar. Reliable State Manager, bu koleksiyon değiştiğinde bildirimleri tetikler: güvenilir bir durum eklenir veya kaldırılır ya da koleksiyonun tamamı yeniden oluşturulur. Reliable State Manager koleksiyonu üç durumda yeniden oluşturulur:

  • Kurtarma: Bir çoğaltma başlatıldığında, önceki durumunu diskten kurtarır. Kurtarmanın sonunda, kurtarılan güvenilir durumlar kümesini içeren bir olayı tetiklemesi için NotifyStateManagerChangedEventArgs kullanır.
  • Tam kopya: Bir çoğaltmanın yapılandırma kümesine katılabilmesi için önce derlenmiş olması gerekir. Bazen bunun için, güvenilir durum yöneticisinin birincil çoğaltmadaki durumunun tam bir kopyasının boşta kalan ikincil çoğaltmaya uygulanması gerekir. İkincil çoğaltmadaki Reliable State Manager, birincil çoğaltmadan aldığı güvenilir durum kümesini içeren bir olayı tetikleyen NotifyStateManagerChangedEventArgs kullanır.
  • Geri yükleme: Olağanüstü durum kurtarma senaryolarında çoğaltmanın durumu RestoreAsync aracılığıyla bir yedekten geri yüklenebilir. Böyle durumlarda, birincil çoğaltmadaki Reliable State Manager, yedekten geri yüklediği güvenilir durum kümesini içeren bir olayı tetiklemesi için NotifyStateManagerChangedEventArgs kullanır.

İşlem bildirimlerine ve/veya durum yöneticisi bildirimlerine kaydolmak için Reliable State Manager'da TransactionChanged veya StateManagerChanged olaylarına kaydolmanız gerekir. Bu olay işleyicilerine kaydolmak için ortak bir yer, durum bilgisi olan hizmetinizin oluşturucusdur. Oluşturucuya kaydolduğunda, IReliableStateManager'ın kullanım ömrü boyunca bir değişikliğin neden olduğu hiçbir bildirimi kaçırmayacaksınız.

public MyService(StatefulServiceContext context)
    : base(MyService.EndpointName, context, CreateReliableStateManager(context))
{
    this.StateManager.TransactionChanged += this.OnTransactionChangedHandler;
    this.StateManager.StateManagerChanged += this.OnStateManagerChangedHandler;
}

TransactionChanged olay işleyicisi, olayla ilgili ayrıntıları sağlamak için NotifyTransactionChangedEventArgs kullanır. Değişiklik türünü belirten eylem özelliğini (örneğin NotifyTransactionChangedAction.Commit) içerir. Ayrıca, değiştirilen işleme başvuru sağlayan işlem özelliğini içerir.

Not

Bugün TransactionChanged olayları yalnızca işlem işlendiğinde oluşturulur. Eylem daha sonra NotifyTransactionChangedAction.Commit'e eşittir. Ancak gelecekte, diğer işlem durumu değişiklikleri türleri için olaylar tetiklenebilir. Eylemi denetlemenizi ve olayı yalnızca beklediğiniz bir olaysa işlemenizi öneririz.

Aşağıda örnek bir TransactionChanged olay işleyicisi verilmiştir.

private void OnTransactionChangedHandler(object sender, NotifyTransactionChangedEventArgs e)
{
    if (e.Action == NotifyTransactionChangedAction.Commit)
    {
        this.lastCommitLsn = e.Transaction.CommitSequenceNumber;
        this.lastTransactionId = e.Transaction.TransactionId;

        this.lastCommittedTransactionList.Add(e.Transaction.TransactionId);
    }
}

StateManagerChanged olay işleyicisi, olayla ilgili ayrıntıları sağlamak için NotifyStateManagerChangedEventArgs kullanır. NotifyStateManagerChangedEventArgs iki alt sınıfa sahiptir: NotifyStateManagerRebuildEventArgs ve NotifyStateManagerSingleEntityChangedEventArgs. NotifyStateManagerChangedEventArgs öğesini doğru alt sınıfa değiştirmek için NotifyStateManagerChangedEventArgs içindeki eylem özelliğini kullanırsınız:

  • NotifyStateManagerChangedAction.Rebuild: NotifyStateManagerRebuildEventArgs
  • NotifyStateManagerChangedAction.Add ve NotifyStateManagerChangedAction.Remove: NotifyStateManagerSingleEntityChangedEventArgs

Aşağıda örnek bir StateManagerChanged bildirim işleyicisi verilmiştir.

public void OnStateManagerChangedHandler(object sender, NotifyStateManagerChangedEventArgs e)
{
    if (e.Action == NotifyStateManagerChangedAction.Rebuild)
    {
        this.ProcessStateManagerRebuildNotification(e);

        return;
    }

    this.ProcessStateManagerSingleEntityNotification(e);
}

Güvenilir Sözlük bildirimleri

Reliable Dictionary aşağıdaki olaylar için bildirimler sağlar:

  • Yeniden derleme: ReliableDictionary kurtarılan veya kopyalanan bir yerel durumdan veya yedekten durumunu kurtardığında çağrılır.
  • Clear: ReliableDictionary durumu ClearAsync yöntemiyle temizlendiğinde çağrılır.
  • Ekle: ReliableDictionary'e bir öğe eklendiğinde çağrılır.
  • Güncelleştirme: IReliableDictionary'deki bir öğe güncelleştirildiğinde çağrılır.
  • Kaldır: IReliableDictionary içindeki bir öğe silindiğinde çağrılır.

Reliable Dictionary bildirimlerini almak için IReliableDictionary'deDictionaryChanged olay işleyicisine kaydolmanız gerekir. Bu olay işleyicilerine kaydolmak için sık kullanılan bir yer ReliableStateManager.StateManagerChanged ekleme bildirimidir. IReliableDictionaryIReliableStateManager'a eklendiğinde kaydolmak hiçbir bildirimi kaçırmamanızı sağlar.

private void ProcessStateManagerSingleEntityNotification(NotifyStateManagerChangedEventArgs e)
{
    var operation = e as NotifyStateManagerSingleEntityChangedEventArgs;

    if (operation.Action == NotifyStateManagerChangedAction.Add)
    {
        if (operation.ReliableState is IReliableDictionary<TKey, TValue>)
        {
            var dictionary = (IReliableDictionary<TKey, TValue>)operation.ReliableState;
            dictionary.RebuildNotificationAsyncCallback = this.OnDictionaryRebuildNotificationHandlerAsync;
            dictionary.DictionaryChanged += this.OnDictionaryChangedHandler;
        }
    }
}

Not

ProcessStateManagerSingleEntityNotification , önceki OnStateManagerChangedHandler örneğinin çağırıldığı örnek yöntemdir.

Yukarıdaki kod, DictionaryChanged ile birlikte IReliableNotificationAsyncCallback arabirimini ayarlar. NotifyDictionaryRebuildEventArgs zaman uyumsuz olarak numaralandırılması gereken bir IAsyncEnumerable arabirimi içerdiğinden, yeniden derleme bildirimleri OnDictionaryChangedHandler yerine RebuildNotificationAsyncCallback aracılığıyla tetiklenir.

public async Task OnDictionaryRebuildNotificationHandlerAsync(
    IReliableDictionary<TKey, TValue> origin,
    NotifyDictionaryRebuildEventArgs<TKey, TValue> rebuildNotification)
{
    this.secondaryIndex.Clear();

    var enumerator = e.State.GetAsyncEnumerator();
    while (await enumerator.MoveNextAsync(CancellationToken.None))
    {
        this.secondaryIndex.Add(enumerator.Current.Key, enumerator.Current.Value);
    }
}

Not

Önceki kodda, yeniden derleme bildirimini işlemenin bir parçası olarak, önce korunan toplu durum temizlenir. Güvenilir koleksiyon yeni bir durumla yeniden derlendiğinden, önceki tüm bildirimler ilgisizdir.

DictionaryChanged olay işleyicisi, olayla ilgili ayrıntıları sağlamak için NotifyDictionaryChangedEventArgs kullanır. NotifyDictionaryChangedEventArgs'in beş alt sınıfı vardır. NotifyDictionaryChangedEventArgs öğesini doğru alt sınıfa değiştirmek için NotifyDictionaryChangedEventArgs içindeki eylem özelliğini kullanın:

  • NotifyDictionaryChangedAction.Rebuild: NotifyDictionaryRebuildEventArgs
  • NotifyDictionaryChangedAction.Clear: NotifyDictionaryClearEventArgs
  • NotifyDictionaryChangedAction.Add: NotifyDictionaryItemAddedEventArgs
  • NotifyDictionaryChangedAction.Update: NotifyDictionaryItemUpdatedEventArgs
  • NotifyDictionaryChangedAction.Remove: NotifyDictionaryItemRemovedEventArgs
public void OnDictionaryChangedHandler(object sender, NotifyDictionaryChangedEventArgs<TKey, TValue> e)
{
    switch (e.Action)
    {
        case NotifyDictionaryChangedAction.Clear:
            var clearEvent = e as NotifyDictionaryClearEventArgs<TKey, TValue>;
            this.ProcessClearNotification(clearEvent);
            return;

        case NotifyDictionaryChangedAction.Add:
            var addEvent = e as NotifyDictionaryItemAddedEventArgs<TKey, TValue>;
            this.ProcessAddNotification(addEvent);
            return;

        case NotifyDictionaryChangedAction.Update:
            var updateEvent = e as NotifyDictionaryItemUpdatedEventArgs<TKey, TValue>;
            this.ProcessUpdateNotification(updateEvent);
            return;

        case NotifyDictionaryChangedAction.Remove:
            var deleteEvent = e as NotifyDictionaryItemRemovedEventArgs<TKey, TValue>;
            this.ProcessRemoveNotification(deleteEvent);
            return;

        default:
            break;
    }
}

Öneriler

  • Bildirim olaylarını mümkün olan en hızlı şekilde tamamlayın.
  • Zaman uyumlu olayların bir parçası olarak pahalı işlemler (örneğin G/Ç işlemleri) yürütmeyin.
  • Olayı işlemeden önce eylem türünü denetleyin. Gelecekte yeni eylem türleri eklenebilir.

Aklınızda bulundurması gereken bazı şeyler şunlardır:

  • Bildirimler, bir işlemin yürütülmesinin bir parçası olarak tetiklenir. Örneğin, geri yükleme işleminin son adımı olarak geri yükleme bildirimi tetiklenir. Bildirim olayı işlenene kadar geri yükleme tamamlanmaz.
  • Bildirimler uygulama işlemlerinin bir parçası olarak tetiklendiğinden istemciler yalnızca yerel olarak işlenen işlemler için bildirimleri görür. İşlemlerin yalnızca yerel olarak işlenmesi garanti edildiğinden (başka bir deyişle günlüğe kaydedilen), gelecekte geri alınıp alınamayabilir.
  • Yineleme yolunda, uygulanan her işlem için tek bir bildirim tetiklenir. Başka bir deyişle, T1 işlemi Create(X), Delete(X) ve Create(X) içeriyorsa, X'in oluşturulması için bir bildirim, silme işlemi için bir bildirim ve oluşturma işlemi için bu sırayla bir bildirim alırsınız.
  • Birden çok işlem içeren işlemler için, işlemler kullanıcıdan birincil çoğaltmada alınma sırasına göre uygulanır.
  • Hatalı ilerlemeyi işlemenin bir parçası olarak, ikincil çoğaltmalarda bazı işlemler geri alınabilir. Bu tür geri alma işlemleri için bildirimler oluşturulur ve çoğaltmanın durumu kararlı bir noktaya geri döner. Geri alma bildirimlerinin önemli bir farkı, yinelenen anahtarlara sahip olayların toplanmış olmasıdır. Örneğin, T1 işlemi geri alınıyorsa Delete(X) için tek bir bildirim görürsünüz.

Sonraki adımlar