Alıştırma - Yüksek oranda kullanılabilir bir uygulama dağıtma

Tamamlandı

Artık tasarımı uygulayıp yüksek oranda kullanılabilir bir uygulamayı dağıtmaya hazırsınız. Uygulamayı test etmek için Fiddler'ı indirip yükleyin.

Azure depolama alanında verilerinizin barındırıldığı birincil bölgeyle bağlantıda hata olduğunda uygulamanızın otomatik olarak yük devretmesi ve ikincil konumdaki depolama hesaplarını kullanması gerektiğini unutmayın. Devre kesici uygulamayı bu şekilde davranmaya zorlar. Birincil konum yeniden çevrimiçi olduğunda devre kesici uygulamayı birincil bölgeye geri yönlendirir.

Sağlık uygulamasını tam geliştirme işlemini yapmadan önce sahte verilerle örnek bir uygulama kullanarak bu yaklaşımı test etmek istiyorsunuz.

Bu alıştırmada, RA-GRS depolama hesabıyla Devre Kesici düzenini nasıl kullanabileceğinizi gösteren bir uygulama çalıştıracaksınız. Uygulama, sorun algılandığında ikincil depolama hesabına geçer ve yeniden kullanılabilir duruma geldiğinde birincil bölgeye geri döner. Uygulama, blob depolamaya bir dosya yükler ve ardından döngüye girerek aynı dosyayı tekrar tekrar indirir. Birincil konumdan depolama hesabı okunurken hata oluşursa, uygulama işlemi yeniden dener. Tekrarlanan denemelerden sonra yeniden deneme başarısız olursa, uygulama ikincil konumdaki depolama hesabına geçer. Uygulama verileri ikincil konumdan okuyor ve okuma sayısı belirlenen eşiği aşana kadar buna devam ediyor. Ardından, uygulama yeniden birincil konuma geçmeyi dener. Ancak, birincil konum hala kullanılamıyorsa ikincil konuma geri döner.

Diagram of a scenario for configuring failover.

Fiddler nedir?

Fiddler, başta web uygulamaları olmak üzere uygulamalarda hata ayıklamaya yardımcı olmak için kullanılan bir üçüncü taraf aracıdır. Fiddler, bilgisayarlar arasındaki ağ trafiğini yakalar ve sonuca bağlı olarak bağlantıları durdurmak için olay tabanlı betik alt sistemini kullanır.

Bu ünitede, sağlık uygulamasının depolama hesabına yönelik bağlantıyı izlemek için Fiddler Classic uygulamasını kullanacaksınız. Uygulama, uzman doktorların artık depolama alanından blob indiremediğini algıladığında, yükü ikincil depolama hesabına devretmeye başlar. Birincil bağlantının yeniden kullanılabilir olduğunu algılandığında, bağlantılar yeniden birincil konuma yönlendirilir. Fiddler'da trafiğin çeşitli depolama hesabı uç noktalarına yönlendirildiğini görebilirsiniz.

Fiddler Classic uygulamasını henüz yüklemediyseniz, Telerik Fiddler giriş sayfasından indirip yükleyin.

Dekont

Fiddler, uygulamanın yeni bir sürümünü yayımladı. Bu alıştırmada şu an için yalnızca Windows sürümü bulunan Fiddler Classic kullanılmıştır.

Visual Studio’yu yükleme ve örnek kodu indirme

Uygulama kodu masaüstünüzde yerel olarak çalıştırılır. Uygulamayı derlemek için Visual Studio'ya ihtiyacınız vardır.

  1. Henüz Visual Studio 2019’u yüklemediyseniz Visual Studio 2019 giriş sayfasından ücretsiz sürümü indirebilirsiniz.

  2. Örnek kodu indirmek için Git kullanın. Git komut istemi penceresi açın ve aşağıdaki komutu çalıştırarak devre kesici örnek uygulamasını bilgisayarınıza indirin. Klasörü> sabit sürücünüzde uygun bir konumla değiştirin<:

    git clone https://github.com/MicrosoftDocs/mslearn-ha-application-storage-with-grs <folder>
    

    Dekont

    Bu örnek depo .NET 3.1 kullanır. .NET 6.0 gibi daha yeni bir çerçeve sürümü kullanmanız gerekiyorsa circuitbreaker.csproj dosyasını açın. altındaki <PropertyGroup> hedef çerçeve çizgisini olarak <TargetFramework>netcoreapp6.0</TargetFramework>değiştirin.

Fiddler'ı yapılandırma

  1. Fiddler'ı Başlatın.

  2. Araçlar menüsünde Seçenekler’i belirleyin.

  3. Seçenekler bölmesinde HTTPS sekmesini belirleyin.

  4. HTTPS sekmesinde Decrypt HTTPS traffic’i (HTTPS trafiğinin şifresini çöz) seçin. Fiddler'dan daha fazla sertifika yüklemeniz istenirse, bunları kabul edin ve fiddler'ı kapatıp yeniden başlatın.

    Screenshot of the Fiddler HTTPS configuration tab in the Options dialog box.

Örnek uygulamayı inceleme

  1. Tarayıcıda Cloud Shell penceresine geçin.

  2. Aşağıdaki komutu çalıştırarak önceki alıştırmada oluşturduğunuz depolama hesabının bağlantı dizesini alın:

        az storage account show-connection-string \
            --name $STORAGEACCT \
            --resource-group <rgn>[Sandbox resource group]</rgn>
    
  3. Çıkış bağlantı dizesini panoya kopyalayın.

  4. Visual Studio’yu başlatın ve GitHub’dan indirdiğiniz CircuitBreaker.sln çözümünü açın. Bu uygulama çoğaltılmış Azure depolama hesabına yönelik bağlantıları yönetmek için Devre Kesici düzenini kullanır. Devre kesici, birincil konum bağlantısının kullanılabilir olup olmadığını algılar. Kullanılabilir değilse, devre kesici birincil konumu yeniden denemeden önce kısa bir süre için ikincil hesaba geçer.

  5. Çözüm Gezgini penceresinde Program.cs dosyasına çift tıklayın. Bu dosya uygulamanın C# kaynak kodunu içerir.

  6. Program sınıfında aşağıdaki deyimi bulun:

        static string storageConnectionString = "<Add your storage connection string here>";
    

    Depolama bağlantı dizesi buraya> ekleyin öğesini panodaki bağlantı dizesi değiştirin<.

  7. Ekranı aşağı kaydırıp RunCircuitBreakerAsync yönteminin başlangıcına gelin:

        /// <summary>
        /// Main method. Sets up the objects needed, then performs a loop
        ///   to perform a blob operation repeatedly, responding to the Retry and Response Received events.
        /// </summary>
        private static async Task RunCircuitBreakerAsync()
    
  8. Bu yöntemde aşağıdaki kod bloğunu bulun:

        // Define a reference to the actual blob.
        CloudBlockBlob blockBlob = null;
    
        // Upload a BlockBlob to the newly created container.
        blockBlob = container.GetBlockBlobReference(ImageToUpload);
        await blockBlob.UploadFromFileAsync(ImageToUpload);
    

    Bu kod örnek verileri (bir görüntü dosyası) depolama hesabınızdaki bloba yükler.

  9. Şu deyimleri izleyen kod bloğunu inceleyin:

        // Set the location mode to secondary so you can check just the secondary data center.
        BlobRequestOptions options = new BlobRequestOptions();
        options.LocationMode = LocationMode.SecondaryOnly;
    
        // Before proceeding, wait until the blob has been replicated to the secondary data center.
        // Loop and check for the presence of the blob once per second
        //   until it hits 60 seconds or it finds it.
        int counter = 0;
        while (counter < 60)
        {
            counter++;
    
            Console.WriteLine("Attempt {0} to see if the blob has replicated to secondary yet.", counter);
    
            if (await blockBlob.ExistsAsync(options, null))
            {
                    break;
            }
    
            // Wait a second, then loop around and try again.
            // When it's finished replicating to the secondary, continue on.
            await Task.Delay(1000);
        }
        if (counter >= 60)
        {
            throw new Exception("Unable to find the image on the secondary endpoint.");
        }
    

    Bu kod verilerin ikincil konuma çoğaltıldığını doğrulamayı dener. Blob 60 saniye sonra bu konumda gösterilmezse, kod bir özel durumla zaman aşımına uğrar.

  10. Aşağıdaki deyimi inceleyin:

        // Set the starting LocationMode to PrimaryThenSecondary. 
        // Note that the default is PrimaryOnly. 
        // You must have RA-GRS enabled to use this.
        blobClient.DefaultRequestOptions.LocationMode = LocationMode.PrimaryThenSecondary;
    

    Bu deyim uygulamanın önce birincil depolama konumundan okumayı deneyeceğini ve birincil konum kullanılamıyorsa ikincil konumdan okuyacağını belirtir.

  11. Ekranı aşağı kaydırarak aşağıdaki kod bloğuna gelin:

    for (int i = 0; i < 1000; i++)
    {
            if (blobClient.DefaultRequestOptions.LocationMode == LocationMode.SecondaryOnly)
            {
                    Console.Write("S{0} ", i.ToString());
            } else
            {
                    Console.Write("P{0} ", i.ToString());
            }
            ...
    }
    

    Bu kod 1000 kez yinelenir ve verileri Blob depolamadan indirir. İlk if.else ifadesi, indirme denemesinin yineleme sayısını (0’dan başlayarak) bir ön ekle ("P" veya "S") birlikte görüntüler. Bu, ön ek blobun birincil (P) veya ikincil (S) depolama konumu kullanılarak indirildiğini gösterir.

  12. Aşağıdaki bloğu inceleyin. Bu kodun mantığına odaklanmak için bazı deyimler atlandı:

        // Set up an operation context for the downloading the blob.
        OperationContext operationContext = new OperationContext();
    
        try
        {
            // Hook up the event handlers for the Retry event and the Request Completed event.
            // These events are used to trigger the change from primary to secondary and back.
            operationContext.Retrying += OperationContextRetrying;
            operationContext.RequestCompleted += OperationContextRequestCompleted;
    
            // Download the file.
            Task task = blockBlob.DownloadToFileAsync(string.Format("./CopyOf{0}", ImageToUpload), FileMode.Create, null, null, operationContext);
            ...
            await task;
            ...
        }
        catch (Exception ex)
        {
            // If you get a gateway error here, check to ensure that your storage account redundancy is set to RA-GRS.
            Console.WriteLine(ex.ToString());
        }
        finally
        {
            // Unhook the event handlers so everything can be garbage collected properly.
            operationContext.Retrying -= OperationContextRetrying;
            operationContext.RequestCompleted -= OperationContextRequestCompleted;
        }
    }
    

    Bu blok Devre Kesici düzeninin bir bölümünü uygular. OperationContext nesnesi, başarısız bir isteği yeniden denemek için kullanabileceğiniz olayları sağlar. Yeniden Deneme olayı, istek başarısız olduğunda ve yeniden denendiğinde gerçekleşir. İstek başarıyla veya bir hatayla tamamlandığında RequestCompleted olayı oluşturulur. DownloadToFileAsync yöntemi depolama alanından blob verilerini indirir ve parametre olarak OperationContext nesnesini alır. İndirme başarısız olursa, işlem OperationContextRetrying yöntemini çalıştırır. İndirme tamamlandığında OperationContextRequestCompleted yöntemini çalıştırır.

  13. Ekranı aşağı kaydırarak OperationContextRetrying yöntemine gelin:

    /// Retry Event handler 
    /// If it has retried more times than allowed, and it's not already pointed to the secondary location,
    ///   flip it to the secondary location and reset the retry count.
    /// If it has retried more times than allowed, and it's already pointed to the secondary location, throw an exception. 
    private static void OperationContextRetrying(object sender, RequestEventArgs e)
    {
        retryCount++;
        Console.WriteLine("Retrying event because of failure reading the primary. RetryCount = " + retryCount);
    
        // Check to see whether we've had more than n retries. In which case, switch to the secondary location.
        if (retryCount >= retryThreshold)
        {
    
            // Check to see whether we can fail over to the secondary location.
            if (blobClient.DefaultRequestOptions.LocationMode != LocationMode.SecondaryOnly)
            {
                blobClient.DefaultRequestOptions.LocationMode = LocationMode.SecondaryOnly;
                retryCount = 0;
            }
            else
            {
                throw new ApplicationException("Both primary and secondary are unreachable. Check your application's network connection. ");
            }
        }
    }
    

    Bu yöntem isteğin arka arkaya kaç kez başarısız olduğunu izler. Bu sayı belirtilen eşiği aşarsa yöntem blob istemcisinin LocationMode özelliğini değiştirerek istemciyi verileri ikincil konumdan indirmeye zorlar.

  14. OperationContextRequestCompleted yöntemini bulun:

    /// RequestCompleted Event handler 
    /// If it's not pointing at the secondary location, let it go through. It either was successful 
    ///   or it failed with a nonretryable event (which we hope is temporary).
    /// If it's pointing at the secondary location, increment the read count. 
    /// If the number of reads has hit the threshold of the number of reads you want to do against the secondary location
    ///   before you switch back to primary location, switch back and reset the secondaryReadCount. 
    private static void OperationContextRequestCompleted(object sender, RequestEventArgs e)
    {
        if (blobClient.DefaultRequestOptions.LocationMode == LocationMode.SecondaryOnly)
        {
            // You're reading the secondary location. Let it read the secondary location [secondaryThreshold] times, 
            //    then switch back to the primary and see whether it's available now.
            secondaryReadCount++;
            if (secondaryReadCount >= secondaryThreshold)
            {
                blobClient.DefaultRequestOptions.LocationMode = LocationMode.PrimaryThenSecondary;
                secondaryReadCount = 0;
            }
        }
    }
    

    İndirme işlemi başarılı olursa bu yöntem hangi konumun (birincil veya ikincil) kullanıldığını denetler. Yöntem, ikincil konum kullanılarak arka arkaya kaç indirme işleminin yapıldığını izler. Bu sayı eşik değerini aştığında kod yeniden birincil konuma geçişe zorlar. Birincil konum kullanılabilir hale geldiyse, kalan indirme işlemlerinde bu konum kullanılır. Birincil konum hala kullanılamıyorsa, indirme işlemi yeniden ikincil konuma geri dönen olan OperationContext nesnesinin Retrying olayını tetikler.

Uygulamayı test etme ve yük devretmeyi tetikleme

  1. Uygulamayı çalıştırmak için Hata Ayıklama menüsünde Hata Ayıklamayı Başlat’ı seçin.

    Uygulama, Azure depolama hesabınıza bir dosya yükleyerek başlar. Uygulama dosyanın ikincil depolama hesabı konumuna çoğaltılmasını bekler ve ardından döngüye girerek dosyayı tekrar tekrar indirir. Uygulama, yineleme sayısını ve dosyanın birincil konumdan indirildiğine işaret eden ön eki içeren bir ileti görüntüler. Örneğin, ilk yineleme için P0, ikinci yineleme için P1 vb. görüntülenir.

    Screenshot of the output from the sample application, showing the messages displayed as the data is repeatedly downloaded.

  2. Uygulama çalışırken Fiddler’a geçin. Fiddler dosyayı depolama hesabınıza yükleyen ve sonra verileri yeniden indiren HTTP trafiğini gösterir. Sol bölmede, depolama hesabınıza gönderilen isteklerin listesi aşağıdaki resimde gösterilen listeye benzer biçimde görüntülenir:

    Screenshot of the Fiddler application, showing the traffic sent to your Azure storage account by the sample application.

  3. Uygulama penceresine dönün ve bunu duraklatmak için herhangi bir tuşa basın.

  4. Fiddler’daki Kurallar menüsünde Kuralları Özelleştir seçeneğini belirleyin.

  5. OnBeforeResponse işlevini arayın. Bu işlevdeki mevcut deyimlerden sonra aşağıdaki kodu ekleyin. <storage account name> öğesini önceki alıştırmada oluşturduğunuz depolama hesabının adıyla değiştirin:

    if (oSession.hostname == "<storage account name>.blob.core.windows.net") {
        oSession.responseCode = 503;
    }
    

    Fiddler OnBeforeResponse işlevine eklediğiniz JavaScript kodu, birincil depolama hesabı konumuna yönelik isteklerde HTTP 503 (Hizmet Kullanılamıyor) hatasını döndürür. Bu hata, depolama uç noktasının erişilemez olduğu bir durumun benzetimini gerçekleştirir. Örnek uygulamadaki Devre Kesici kodunun bu hatayı algılaması ve yükü ikincil depolama konumuna devretmesi gerekir. Veriler daha önce Azure tarafından birincil depolama konumundan ikincisine çoğaltıldığından, bunlar erişilebilir olmalıdır.

  6. Dosya menüsünde Kaydet’i seçin.

  7. Uygulamanıza dönün ve uygulamayı çalıştırmaya devam etmek için herhangi bir tuşa basın.

    Fiddler, birincil konum için oluşturulan HTTP 503 hatalarını görüntüler. Uygulama penceresinde, Birinciden okuma hatası oluştuğu için olay yeniden deneniyor iletisi görüntülenir. Beş kez yeniden deneme yapıldıktan sonra, uygulamadaki devre kesici ikincil konuma geçip buradan okumaya başlar. birincil için P yerine ikincil için S ön ekini içeren iletiler görürsünüz. Devre kesici, kısa bir süre ikincil hesaptan okuduktan sonra yeniden birincil konuma geçmeyi dener. Bu girişim başarısız olur, bu nedenle devre kesici başka bir süre için ikincil konuma geri döner. Aşağıdaki görüntüde gösterildiği gibi, bu işlem birincil konum kullanılabilir hale gelene kadar devam eder:

    Screenshot of the output from the sample application, showing the switch from the primary account to the secondary account.

  8. Uygulamayı bir kez daha duraklatmak için bir tuşa basın.

  9. Fiddler’da daha önce OnBeforeResponse işlevine eklediğiniz kodu kaldırın ve betiği kaydedin.

  10. Uygulamanıza dönün ve uygulamayı çalıştırmaya devam etmek için herhangi bir tuşa basın. Uygulama, başarılı bir şekilde birincil depolama hesabı konumuna döner.

  11. Uygulamayı ve sonra da Visual Studio’yu kapatın.

  12. Fiddler’ın Araçlar menüsünde Seçenekler’i belirleyin.

  13. Seçenekler bölmesinde HTTPS sekmesini belirleyin.

  14. HTTPS sekmesinde Eylemler'i ve ardından Tüm Sertifikaları Sıfırla'yı seçin. Fiddler’ın Güvenilen Kök Listesinden ve Kök Deposundan sertifikalarını kaldırmasına izin verin. Bu eylem, Fiddler'ın daha önce yüklemiş olduğu HTTPS inceleme sertifikasını kaldırır.

  15. Tamam'ı seçin ve Fiddler'ı kapatın.

Azure depolama hesabına yüklenen verilerin farklı bölgelerde çoğaltıldığını doğruladınız. Uygulamanın, bağlantı hatalarını işlemek için Devre Kesici düzenini nasıl kullandığını ve birincil depolama hesabı konumundan ikincil depolama hesabı konumuna nasıl geçtiğini öğrendiniz. Bağlantı yeniden kullanılabilir duruma geldiğinde uygulama birincil konuma geri dönebilir.