Reliable Services özelliğini kullanmaya başlayın

Azure Service Fabric uygulaması kodunuzu çalıştıran bir veya daha fazla hizmet içerir. Bu kılavuzda Reliable Services ile hem durum bilgisi olmayan hem de durum bilgisi olan Service Fabric uygulamalarının nasıl oluşturulacağı gösterilmektedir.

Durum bilgisi olmayan güvenilir hizmet oluşturmayı da gösteren bir eğitim videosu için bu sayfayı gözden geçirin.

Temel kavramlar

Reliable Services'ı kullanmaya başlamak için yalnızca birkaç temel kavramı anlamanız gerekir:

  • Hizmet türü: Bu, hizmet uygulamanızdır. Bir ad ve sürüm numarasıyla birlikte, genişleten StatelessService yazdığınız sınıf ve burada kullanılan diğer kod veya bağımlılıklar tarafından tanımlanır.
  • Adlandırılmış hizmet örneği: Hizmetinizi çalıştırmak için, bir sınıf türünün nesne örneklerini oluşturduğunuz gibi hizmet türünüzün adlandırılmış örneklerini oluşturursunuz. Bir hizmet örneğinin "fabric:/" kullanarak URI biçiminde bir adı vardır "fabric:/MyApp/MyService" gibi bir düzen.
  • Hizmet konağı: Oluşturduğunuz adlandırılmış hizmet örneklerinin bir konak işlemi içinde çalıştırılması gerekir. Hizmet ana bilgisayarı yalnızca hizmetinizin örneklerinin çalışabileceği bir işlemdir.
  • Hizmet kaydı: Kayıt her şeyi bir araya getirir. Service Fabric'in çalıştırılacak örneklerini oluşturmasına izin vermek için hizmet türünün bir hizmet konağındaki Service Fabric çalışma zamanına kaydedilmesi gerekir.

Durum bilgisi olmayan hizmet oluşturma

Durum bilgisi olmayan hizmet, şu anda bulut uygulamalarında norm olan bir hizmet türüdür. Hizmetin kendisi güvenilir bir şekilde depolanması veya yüksek oranda kullanılabilir hale getirilmesi gereken veriler içermediğinden durum bilgisi yok olarak kabul edilir. Durum bilgisi olmayan bir hizmetin örneği kapatılırsa, tüm iç durumu kaybolur. Bu hizmet türünde, durumu yüksek oranda kullanılabilir ve güvenilir hale getirmek için Azure Tabloları veya SQL Veritabanı gibi bir dış depoda kalıcı hale getirilmelidir.

Visual Studio 2017 veya Visual Studio 2019'u yönetici olarak başlatın ve HelloWorld adlı yeni bir Service Fabric uygulama projesi oluşturun:

Yeni bir Service Fabric uygulaması oluşturmak için Yeni Proje iletişim kutusunu kullanma

Ardından HelloWorldStateless adlı .NET Core 2.0 kullanarak durum bilgisi olmayan bir hizmet projesi oluşturun:

İkinci iletişim kutusunda durum bilgisi olmayan bir hizmet projesi oluşturun

Çözümünüz artık iki proje içeriyor:

  • Merhaba Dünya. Bu, hizmetlerinizi içeren uygulama projesidir. Ayrıca uygulamayı açıklayan uygulama bildirimini ve uygulamanızı dağıtmanıza yardımcı olan bir dizi PowerShell betikini içerir.
  • HelloWorldStateless. Bu hizmet projesidir. Durum bilgisi olmayan hizmet uygulamasını içerir.

Hizmeti uygulama

Hizmet projesinde HelloWorldStateless.cs dosyasını açın. Service Fabric'te bir hizmet herhangi bir iş mantığını çalıştırabilir. Hizmet API'si kodunuz için iki giriş noktası sağlar:

  • Uzun süre çalışan işlem iş yükleri de dahil olmak üzere tüm iş yüklerini yürütmeye başlayabileceğiniz RunAsync adlı açık uçlu bir giriş noktası yöntemi.
protected override async Task RunAsync(CancellationToken cancellationToken)
{
    ...
}
  • ASP.NET Core gibi tercih ettiğiniz iletişim yığınını takabileceğiniz bir iletişim giriş noktası. Burada kullanıcılardan ve diğer hizmetlerden istek almaya başlayabilirsiniz.
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
    ...
}

Bu öğreticide giriş noktası yöntemine RunAsync() odaklanacağız. Kodunuzu hemen çalıştırmaya buradan başlayabilirsiniz. Proje şablonu, sıralı sayıyı artıran örnek bir uygulama RunAsync() içerir.

Not

İletişim yığınıyla çalışma hakkında ayrıntılı bilgi için bkz. ASP.NET Core ile hizmet iletişimi

RunAsync

protected override async Task RunAsync(CancellationToken cancellationToken)
{
    // TODO: Replace the following sample code with your own logic
    //       or remove this RunAsync override if it's not needed in your service.

    long iterations = 0;

    while (true)
    {
        cancellationToken.ThrowIfCancellationRequested();

        ServiceEventSource.Current.ServiceMessage(this.Context, "Working-{0}", ++iterations);

        await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
    }
}

Bir hizmet örneği yerleştirildiğinde ve yürütülmeye hazır olduğunda platform bu yöntemi çağırır. Durum bilgisi olmayan bir hizmet için bu, hizmet örneğinin ne zaman açıldığı anlamına gelir. Hizmet örneğinizin kapatılması gerektiğinde koordine etmek için bir iptal belirteci sağlanır. Service Fabric'te, bir hizmet örneğinin bu açma/kapatma döngüsü, bir bütün olarak hizmetin ömrü boyunca birçok kez gerçekleşebilir. Bu, aşağıdakiler gibi çeşitli nedenlerle oluşabilir:

  • Sistem, kaynak dengeleme için hizmet örneklerinizi taşır.
  • Hata kodunuzda oluşur.
  • Uygulama veya sistem yükseltilir.
  • Temel alınan donanımda kesinti yaşanıyor.

Bu düzenleme, hizmetinizi yüksek oranda kullanılabilir ve dengeli tutmak için sistem tarafından yönetilir.

RunAsync() zaman uyumlu olarak engellememelidir. RunAsync uygulamanız, çalışma zamanının devam etmesi için uzun süre çalışan veya engelleyen işlemlerde bir Görev döndürmelidir veya beklemelidir. Önceki örnekteki while(true) döngüde bir Görev döndürme await Task.Delay() kullanıldığına dikkat edin. İş yükünüzün zaman uyumlu olarak engellenmesi gerekiyorsa, uygulamanızda ile Task.Run() yeni bir Görev zamanlamanız RunAsync gerekir.

İş yükünüzün iptali, sağlanan iptal belirteci tarafından düzenlenmiş işbirliğine dayalı bir çabadır. Sistem, devam etmeden önce görevinizin bitmesini bekler (başarıyla tamamlanarak, iptal ederek veya hatayla). sistem iptal isteğinde bulunurken iptal belirtecini yerine getirmek, tüm işleri bitirmek ve mümkün olan en kısa sürede çıkmak RunAsync() önemlidir.

Bu durum bilgisi olmayan hizmet örneğinde, sayı bir yerel değişkende depolanır. Ancak bu durum bilgisi olmayan bir hizmet olduğundan depolanan değer yalnızca hizmet örneğinin geçerli yaşam döngüsü için mevcuttur. Hizmet hareket ettiğinde veya yeniden başlatıldığında değer kaybolur.

Durum bilgisi olan bir hizmet oluşturma

Service Fabric durum bilgisi olan yeni bir hizmet türü getirir. Durum bilgisi olan bir hizmet, hizmeti kullanan kodla birlikte bulunan hizmetin içinde durumu güvenilir bir şekilde koruyabilir. Durum, durumu bir dış depoda kalıcı hale getirmek zorunda kalmadan Service Fabric tarafından yüksek oranda kullanılabilir hale getirilir.

Hizmet taşınsa veya yeniden başlatıldığında bile bir sayaç değerini durum bilgisi olmayandan yüksek oranda kullanılabilir ve kalıcı hale getirmek için durum bilgisi olan bir hizmete ihtiyacınız vardır.

Aynı HelloWorld uygulamasında, uygulama projesindeki Hizmetler başvurularına sağ tıklayıp Ekle -> Yeni Service Fabric Hizmeti'ni seçerek yeni bir hizmet ekleyebilirsiniz.

Service Fabric uygulamanıza hizmet ekleme

.NET Core 2.0 -> Durum Bilgisi Olan Hizmet'i seçin ve Buna HelloWorldStateful adını verin. Tamam'a tıklayın.

Yeni bir Service Fabric durum bilgisi olan hizmet oluşturmak için Yeni Proje iletişim kutusunu kullanma

Uygulamanızın artık iki hizmeti olmalıdır: durum bilgisi olmayan Hizmet HelloWorldStateless ve durum bilgisi olan HelloWorldStateful hizmeti.

Durum bilgisi olan bir hizmet, durum bilgisi olmayan bir hizmetle aynı giriş noktalarına sahiptir. Temel fark, durumu güvenilir bir şekilde depolayan bir durum sağlayıcısının kullanılabilirliğidir. Service Fabric, Reliable State Manager aracılığıyla çoğaltılmış veri yapıları oluşturmanıza olanak tanıyan Reliable Collections adlı bir durum sağlayıcısı uygulamasıyla birlikte gelir. Durum bilgisi olan bir Güvenilir Hizmet bu durum sağlayıcısını varsayılan olarak kullanır.

HelloWorldStateful.cs dosyasını, aşağıdaki RunAsync yöntemini içeren HelloWorldStateful'da açın:

protected override async Task RunAsync(CancellationToken cancellationToken)
{
    // TODO: Replace the following sample code with your own logic
    //       or remove this RunAsync override if it's not needed in your service.

    var myDictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<string, long>>("myDictionary");

    while (true)
    {
        cancellationToken.ThrowIfCancellationRequested();

        using (var tx = this.StateManager.CreateTransaction())
        {
            var result = await myDictionary.TryGetValueAsync(tx, "Counter");

            ServiceEventSource.Current.ServiceMessage(this.Context, "Current Counter Value: {0}",
                result.HasValue ? result.Value.ToString() : "Value does not exist.");

            await myDictionary.AddOrUpdateAsync(tx, "Counter", 0, (key, value) => ++value);

            // If an exception is thrown before calling CommitAsync, the transaction aborts, all changes are
            // discarded, and nothing is saved to the secondary replicas.
            await tx.CommitAsync();
        }

        await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
    }

RunAsync

RunAsync() durum bilgisi olan ve durum bilgisi olmayan hizmetlerde benzer şekilde çalışır. Ancak durum bilgisi olan bir hizmette, platform yürütülmeden RunAsync()önce sizin yerinize ek işler gerçekleştirir. Bu çalışma, Reliable State Manager ve Reliable Collections'ın kullanıma hazır olduğundan emin olunmasını içerebilir.

Reliable Collections ve Reliable State Manager

var myDictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<string, long>>("myDictionary");

IReliableDictionary , hizmette durumu güvenilir bir şekilde depolamak için kullanabileceğiniz bir sözlük uygulamasıdır. Service Fabric ve Güvenilir Koleksiyonlar ile dış kalıcı depoya gerek kalmadan verileri doğrudan hizmetinizde depolayabilirsiniz. Güvenilir Koleksiyonlar verilerinizi yüksek oranda kullanılabilir hale getirir. Service Fabric bunu sizin için hizmetinizin birden çok çoğaltmasını oluşturup yöneterek gerçekleştirir. Ayrıca, bu çoğaltmaları ve durum geçişlerini yönetmenin karmaşıklıklarını soyutlayan bir API sağlar.

Güvenilir Koleksiyonlar, özel türleriniz de dahil olmak üzere herhangi bir .NET türünü birkaç uyarıyla depolayabilir:

  • Service Fabric, durumu düğümler arasında çoğaltarak durumunuzu yüksek oranda kullanılabilir hale getirir ve Reliable Collections verilerinizi her çoğaltmadaki yerel diske depolar. Bu, Güvenilir Koleksiyonlar'da depolanan her şeyin seri hale getirilebilir olması gerektiği anlamına gelir. Varsayılan olarak, Güvenilir Koleksiyonlar serileştirme için DataContract kullanır, bu nedenle varsayılan seri hale getiriciyi kullandığınızda türlerinizin Veri Sözleşmesi Seri Hale Getiricisi tarafından desteklendiğinden emin olmanız önemlidir.

  • Reliable Collections üzerinde işlem gerçekleştirdiğinizde nesneler yüksek kullanılabilirlik için çoğaltılır. Reliable Collections'da depolanan nesneler hizmetinizdeki yerel bellekte tutulur. Bu, nesneye yerel bir başvurunuz olduğu anlamına gelir.

    Bir işlemdeki güvenilir koleksiyonda bir güncelleştirme işlemi gerçekleştirmeden bu nesnelerin yerel örneklerini sessize almamanız önemlidir. Bunun nedeni, nesnelerin yerel örneklerinde yapılan değişikliklerin otomatik olarak çoğaltılmamasıdır. Nesneyi sözlüğe yeniden eklemeniz veya sözlükte güncelleştirme yöntemlerinden birini kullanmanız gerekir.

Reliable State Manager, Güvenilir Koleksiyonları sizin için yönetir. Reliable State Manager'dan istediğiniz zaman ve hizmetinizdeki herhangi bir yerde ada göre güvenilir bir koleksiyon isteyebilirsiniz. Reliable State Manager, bir başvuruyu geri almanızı sağlar. Sınıf üyesi değişkenlerinde veya özelliklerinde güvenilir koleksiyon örneklerine başvuruları kaydetmenizi önermeyiz. Başvurunun hizmet yaşam döngüsünde her zaman bir örneğe ayarlandığından emin olmak için özel özen gösterilmelidir. Reliable State Manager bu işi sizin için halleder ve tekrar ziyaretler için iyileştirilmiştir.

İşlemsel ve zaman uyumsuz işlemler

using (ITransaction tx = this.StateManager.CreateTransaction())
{
    var result = await myDictionary.TryGetValueAsync(tx, "Counter-1");

    await myDictionary.AddOrUpdateAsync(tx, "Counter-1", 0, (k, v) => ++v);

    await tx.CommitAsync();
}

Güvenilir Koleksiyonlar, Dil Tümleşik Sorgusu (LINQ) dışında ve System.Collections.Concurrent karşılıklarıyla System.Collections.Generic aynı işlemlerin birçoğuna sahiptir. Güvenilir Koleksiyonlar üzerindeki işlemler zaman uyumsuzdur. Bunun nedeni, Reliable Collections ile yazma işlemlerinin verileri diske çoğaltmak ve kalıcı hale getirmek için G/Ç işlemleri gerçekleştirmesidir.

Reliable Collection işlemleri işlemseldir, böylece birden çok Güvenilir Koleksiyon ve işlemde durum tutarlılığı sağlayabilirsiniz. Örneğin, bir iş öğesini Güvenilir Kuyruktan açabilir, üzerinde bir işlem gerçekleştirebilir ve sonucu tek bir işlem içinde Güvenilir Sözlük'e kaydedebilirsiniz. Bu, atomik bir işlem olarak kabul edilir ve işlemin tamamının başarılı olacağını veya işlemin tamamının geri döndürüleceğini garanti eder. Öğenin sırasını kaldırdıktan sonra ancak sonucu kaydetmeden önce bir hata oluşursa, tüm işlem geri alınır ve öğe işlenmek üzere kuyrukta kalır.

Uygulamayı çalıştırma

Şimdi HelloWorld uygulamasına geri dönüyoruz. Artık hizmetlerinizi derleyebilir ve dağıtabilirsiniz. F5 tuşuna bastığınızda uygulamanız derlenir ve yerel kümenize dağıtılır.

Hizmetler çalışmaya başladıktan sonra, windows için oluşturulan Olay İzleme (ETW) olaylarını bir Tanılama Olayları penceresinde görüntüleyebilirsiniz. Görüntülenen olayların hem durum bilgisi olmayan hizmetten hem de uygulamadaki durum bilgisi olan hizmetten geldiğini unutmayın. Duraklat düğmesine tıklayarak akışı duraklatabilirsiniz. Daha sonra bu iletiyi genişleterek iletinin ayrıntılarını inceleyebilirsiniz.

Not

Uygulamayı çalıştırmadan önce, yerel bir geliştirme kümesinin çalıştığından emin olun. Yerel ortamınızı ayarlama hakkında bilgi için başlangıç kılavuzuna göz atın.

Visual Studio'da Tanılama Olaylarını Görüntüleme

Sonraki adımlar

Visual Studio'da Service Fabric uygulamanızda hata ayıklama

Başlarken: OWIN kendi kendine barındırma ile Service Fabric Web API hizmetleri

Reliable Collections hakkında daha fazla bilgi edinin

Uygulama dağıtma

Uygulama yükseltme

Reliable Services için geliştirici başvurusu