Aracılığıyla paylaş


Python sürüm 2.1 istemci kitaplıklarını kullanarak kod örnekleri Azure Blob Depolama

Bu makalede, Python için Azure Blob Depolama istemci kitaplığının 2.1 sürümünü kullanan kod örnekleri gösterilmektedir.

31 Mart 2023'te , geçerli Azure SDK yönergelerine uymayan Azure SDK kitaplıkları desteğini kullanımdan kaldırdık. Yeni Azure SDK kitaplıkları, tutarlı deneyimler sağlamak ve güvenlik duruşunuzu güçlendirmek için düzenli olarak güncelleştirilir. Yeni özelliklerden ve kritik güvenlik güncelleştirmelerinden yararlanmak için yeni Azure SDK kitaplıklarına geçmeniz önerilir.

Eski kitaplıklar 31 Mart 2023'ten sonra da kullanılabilse de artık Microsoft'tan resmi destek ve güncelleştirme almayacaktır. Daha fazla bilgi için bkz. destek kullanımdan kaldırma duyurusu.

Blob Depolama ile yüksek oranda kullanılabilir bir uygulama oluşturma

Örnek projeyi indirin ve storage-python-circuit-breaker-pattern-ha-apps-using-ra-grs.zip dosyasını ayıklayın (sıkıştırmasını açın). Geliştirme ortamına uygulamanın bir kopyasını indirmek için git de kullanılabilir. Örnek proje temel bir Python uygulaması içerir.

git clone https://github.com/Azure-Samples/storage-python-circuit-breaker-pattern-ha-apps-using-ra-grs.git

Örneği yapılandırma

Uygulamada depolama hesabı kimlik bilgilerinizi sağlamanız gerekir. Bu bilgileri uygulamayı çalıştıran yerel makinedeki ortam değişkenlerinde depolayabilirsiniz. Ortam değişkenlerini oluşturmak için İşletim Sisteminize bağlı olarak aşağıdaki örneklerden birini izleyin.

Azure portalında depolama hesabınıza gidin. Depolama hesabınızdaki Ayarlar bölümünde Erişim anahtarları’nı seçin. Depolama hesabı adını ve Anahtar değerlerini aşağıdaki komutlara yapıştırın ve youraccountname> ve <youraccountkey> yer tutucularını değiştirin<. Bu komut ortam değişkenlerini yerel makineye kaydeder. Windows'da ortam değişkeni, kullandığınız Komut İstemi'ni veya kabuğu yeniden yükleyene kadar kullanılamaz.

Linux

export accountname=<youraccountname>
export accountkey=<youraccountkey>

Windows

setx accountname "<youraccountname>"
setx accountkey "<youraccountkey>"

Konsol uygulamasını çalıştırma

Uygulamayı bir terminalde veya komut isteminde çalıştırmak için circuitbreaker.py dizinine gidip python circuitbreaker.py komutunu girin. Uygulama, çözümdeki HelloWorld.png resmini depolama hesabına yükler. Uygulama, görüntünün ikincil RA-GZRS uç noktasına çoğaltılmış olduğundan emin olmak için denetler. Ardından, resmi 999 kereye kadar indirmeye başlar. Her okuma bir P veya S ile temsil edilir. Burada P birincil uç noktayı, S de ikincil uç noktayı temsil eder.

Örnek kodda, get_blob_to_path yöntemini kullanarak depolama hesabından bir resim indirmek için circuitbreaker.py dosyasındaki run_circuit_breaker yöntemi kullanılmaktadır.

Depolama nesnesi yeniden deneme işlevi, doğrusal bir yeniden deneme ilkesine ayarlıdır. Yeniden deneme işlevi, isteklerin yeniden denenip denenmeyeceğini belirler ve isteği yeniden denemeden önce kaç saniye bekleneceğini belirtir. birincile yapılan ilk isteğin başarısız olması durumunda isteğin ikincil olarak yeniden denenmesi gerekiyorsa, retry_to_secondary değerini true olarak ayarlayın. Örnek uygulamada depolama nesnesinin retry_callback işlevinde özel bir yeniden deneme ilkesi tanımlanmıştır.

İndirmeden önce Service nesnesi retry_callback ve response_callback işlevi tanımlanır. Bu işlevler, indirme işlemi başarıyla tamamlandığında veya indirme işlemi başarısız olup yeniden denendiğinde başlatılan olay işleyicilerini tanımlar.

Kod örneğini anlama

Yeniden deneme olay işleyicisi

retry_callback olay işleyicisi, resmin indirilmesi işlemi başarısız olmuşsa ve yeniden denenecek şekilde ayarlanmışsa çağrılır. Uygulamada tanımlı yeniden deneme sayısı üst sınırına ulaşılmışsa isteğin LocationMode değeri SECONDARY olarak değiştirilir. Bu ayar, uygulamayı resmi ikincil uç noktadan indirmeyi denemeye zorlar. Bu yapılandırma, birincil uç nokta süresiz olarak yeniden denenmediğinden görüntüyü istemek için geçen süreyi azaltır.

def retry_callback(retry_context):
    global retry_count
    retry_count = retry_context.count
    sys.stdout.write(
        "\nRetrying event because of failure reading the primary. RetryCount= {0}".format(retry_count))
    sys.stdout.flush()

    # Check if we have more than n-retries in which case switch to secondary
    if retry_count >= retry_threshold:

        # Check to see if we can fail over to secondary.
        if blob_client.location_mode != LocationMode.SECONDARY:
            blob_client.location_mode = LocationMode.SECONDARY
            retry_count = 0
        else:
            raise Exception("Both primary and secondary are unreachable. "
                            "Check your application's network connection.")

İstek tamamlandı olay işleyicisi

response_callback olay işleyicisi, resmin indirilmesi işlemi başarılı olduğunda çağrılır. Uygulama ikincil uç noktayı kullanıyorsa bu uç noktayı 20 kereye kadar daha kullanmaya devam eder. 20 kereden sonra uygulama LocationMode değerini yeniden PRIMARY olarak ayarlar ve birincil uç noktayı tekrar dener. Bir istek başarılı olursa uygulama birincil uç noktadan okumaya devam eder.

def response_callback(response):
    global secondary_read_count
    if blob_client.location_mode == LocationMode.SECONDARY:

        # You're reading the secondary. Let it read the secondary [secondaryThreshold] times,
        # then switch back to the primary and see if it is available now.
        secondary_read_count += 1
        if secondary_read_count >= secondary_threshold:
            blob_client.location_mode = LocationMode.PRIMARY
            secondary_read_count = 0