Condividi tramite


Archiviazione BLOB di Azure esempi di codice usando librerie client Python versione 2.1

Questo articolo illustra gli esempi di codice che usano la versione 2.1 della libreria client Archiviazione BLOB di Azure per Python.

Il 31 marzo 2023 è stato ritirato il supporto per le librerie di Azure SDK che non sono conformi alle linee guida correnti di Azure SDK. Le nuove librerie di Azure SDK vengono aggiornate regolarmente per guidare esperienze coerenti e rafforzare il comportamento di sicurezza. È consigliabile passare alle nuove librerie di Azure SDK per sfruttare le nuove funzionalità e gli aggiornamenti critici della sicurezza.

Anche se le librerie precedenti possono ancora essere usate oltre il 31 marzo 2023, non riceveranno più supporto e aggiornamenti ufficiali da Microsoft. Per altre informazioni, vedere l'annuncio di ritiro del supporto.

Creare un'app a disponibilità elevata con Archiviazione BLOB

Scaricare il progetto di esempio ed estrarre (decomprimere) il file storage-python-circuit-breaker-pattern-ha-apps-using-ra-grs.zip. È anche possibile usare git per scaricare una copia dell'applicazione nell'ambiente di sviluppo. Il progetto di esempio contiene un'applicazione Python di base.

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

Configurare l'esempio

Nell'applicazione è necessario specificare le credenziali dell'account di archiviazione. È possibile archiviare queste informazioni nelle variabili di ambiente del computer locale che esegue l'applicazione. Seguire uno degli esempi seguenti, in base al sistema operativo, per creare le variabili di ambiente.

Nel portale di Azure passare all'account di archiviazione. Nell'account di archiviazione selezionare Chiavi di accesso in Impostazioni. Incollare i valori di Nome dell'account di archiviazione e Chiave nei comandi seguenti, sostituendo i segnaposto <youraccountname> e <youraccountkey>. Questo comando salva le variabili di ambiente nel computer locale. In Windows la variabile di ambiente non è disponibile finché non si ricarica il prompt dei comandi o la shell in uso.

Linux

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

Windows

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

Eseguire l'applicazione console

Per eseguire l'applicazione in un terminale o al prompt dei comandi, passare alla directory circuitbreaker.py e quindi immettere python circuitbreaker.py. L'applicazione carica l'immagine HelloWorld.png dalla soluzione nell'account di archiviazione. L'applicazione verifica che l'immagine sia stata replicata nell'endpoint RA-GZRS secondario. Si avvia quindi il download dell'immagine fino a 999 volte. Ogni lettura è rappresentata da una P o una S. P rappresenta l'endpoint primario e S rappresenta l'endpoint secondario.

Nel codice di esempio, il metodo run_circuit_breaker nel file circuitbreaker.py viene usato per scaricare un'immagine dall'account di archiviazione con il metodo get_blob_to_path.

La funzione di ripetizione dei tentativi dell'oggetto di archiviazione è impostata su un criterio di ripetizione lineare. La funzione di ripetizione dei tentativi determina se eseguire o meno un nuovo tentativo per una richiesta e specifica il numero di secondi di attesa prima del nuovo tentativo. Impostare il valore retry_to_secondary su true, se la richiesta deve essere riprovata a secondaria nel caso in cui la richiesta iniziale su primario non riesce. Nell'applicazione di esempio, nella funzione retry_callback dell'oggetto di archiviazione viene definito un criterio di ripetizione dei tentativi personalizzato.

Prima del download vengono definite le funzioni retry_callback e response_callback dell'oggetto del servizio, che definiscono i gestori eventi che vengono attivati quando un download viene completato oppure ha esito negativo e viene eseguito un nuovo tentativo.

Informazioni sull'esempio di codice

Riprovare il gestore dell'evento

Quando il download dell'immagine non riesce ed è impostata la ripetizione dei tentativi, viene chiamato il gestore eventi retry_callback. Se viene raggiunto il numero massimo di tentativi definito nell'applicazione, il valore di LocationMode della richiesta viene modificato in SECONDARY. Questa impostazione forza l'applicazione a tentare di scaricare l'immagine dall'endpoint secondario. Questa configurazione riduce il tempo impiegato per richiedere l'immagine perché l'endpoint primario non viene riprovato indefinito.

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.")

Gestore dell'evento per la richiesta completata

Quando il download dell'immagine riesce viene chiamato il gestore dell'evento response_callback. Se l'applicazione usa l'endpoint secondario, continua a usarlo fino a 20 volte. Dopo 20 volte, l'applicazione reimposta LocationMode su PRIMARY ed esegue un nuovo tentativo con l'endpoint primario. Se una richiesta ha esito positivo, l'applicazione continua a eseguire la lettura dall'endpoint primario.

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