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ılavuz, Reliable Services ile hem durum bilgisi olmayan hem de durum bilgisi olan Service Fabric uygulamalarını nasıl oluşturabileceğinizi gösterir.

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. Yazdığınız sınıf ve burada kullanılan diğer kod veya bağımlılıkların StatelessService yanı sıra bir ad ve sürüm numarası ile 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. Hizmet örneğinin "fabric:/" şemasını kullanan bir URI biçiminde adı vardır( örneğin, "fabric:/MyApp/MyService".
  • Hizmet konağı: Oluşturduğunuz adlandırılmış hizmet örneklerinin bir konak işlemi içinde çalıştırılması gerekir. Hizmet konağı yalnızca hizmetinizin örneklerinin çalıştırıldığı bir işlemdir.
  • Hizmet kaydı: Kayıt her şeyi bir araya getirir. Service Fabric'in çalıştırmak üzere örnekleri oluşturmasına izin vermek için hizmet türü bir hizmet konağındaki Service Fabric çalışma zamanına kaydedilmelidir.

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:

  • MerhabaDünya. Bu, hizmetlerinizi içeren uygulama projesidir. Ayrıca, uygulamayı açıklayan uygulama bildiriminin yanı sıra uygulamanızı dağıtmanıza yardımcı olan bir dizi PowerShell betik 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. Burada kodunuzu hemen çalıştırmaya başlayabilirsiniz. Proje şablonu, sıralı sayıyı artıran örnek bir uygulaması 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ü, hizmetin bir bütün olarak kullanım ömrü boyunca birçok kez gerçekleşebilir. Bu, aşağıdakiler gibi çeşitli nedenlerle gerçekleşebilir:

  • Sistem, kaynak dengeleme için hizmet örneklerinizi taşır.
  • Hata kodunuzda oluşur.
  • Uygulama veya sistem yükseltilir.
  • Temel alınan donanımda bir 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 bir Görev döndürmelidir veya çalışma zamanının devam etmesi için uzun süre çalışan veya engelleyen işlemleri beklemelidir. Önceki örnekteki while(true) döngüde, geri dönen await Task.Delay() bir Görev 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 sona ermesini (başarıyla tamamlanarak, iptal veya hatayla) bekler. 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ı 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 HelloWorldStateful olarak adlandırabilirsiniz. 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 HelloWorldStateless hizmeti 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.

Aşağıdaki RunAsync yöntemini içeren HelloWorldStateful'da HelloWorldStateful.cs 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, yürütmeden önce RunAsync()platform sizin yerinize ek işler gerçekleştirir. Bu çalışma, Reliable State Manager ve Reliable Collections'ın kullanıma hazır olmasını sağlamayı 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 Reliable Collections 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, hizmetinizin birden çok çoğaltmasını sizin için oluşturup yöneterek bunu gerçekleştirir. Ayrıca, bu çoğaltmaları yönetmenin karmaşıklıklarını ve durum geçişlerini soyutlayan bir API sağlar.

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

  • Service Fabric, durumunuzu düğümler arasında çoğaltarak 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 serileştirilebilir 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.

  • Güvenilir Koleksiyonlar üzerinde işlem yaptığınızda 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 aldığınızdan emin olur. 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 işler ve tekrarlanan ziyaretler için en iyi duruma getirilmiş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 kendi ve System.Collections.Concurrent karşılıklarının System.Collections.Generic yaptığı işlemlerin birçoğuna sahiptir. Güvenilir Koleksiyonlar üzerindeki işlemler zaman uyumsuz. 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 durumu tutarlı tutabilirsiniz. Örneğin, bir iş öğesini Güvenilir Kuyruktan sorgudan alabilir, üzerinde bir işlem gerçekleştirebilir ve sonucu tek bir işlem içinde Güvenilir Sözlük'e kaydedebilirsiniz. Bu bir atomik işlem olarak kabul edilir ve işlemin tamamının başarılı olacağını veya işlemin tamamının geri almayı garanti eder. Öğeyi sıraladıktan sonra ancak sonucu kaydetmeden önce bir hata oluşursa, işlemin tamamı 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 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. Ardından, 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