Condividi tramite


Creare e gestire i lease di BLOB con Python

Questo articolo illustra come creare e gestire i lease di BLOB usando la libreria client di Archiviazione di Azure per Python. È possibile usare la libreria client per acquisire, rinnovare, rilasciare e interrompere lease di BLOB.

Per informazioni su come creare lease sui BLOB tramite API asincrone, vedere Creare lease sui BLOB in modo asincrono.

Prerequisiti

  • Questo articolo presuppone che sia già stato configurato un progetto per l'uso con la libreria client di Archiviazione BLOB di Azure per Python. Per informazioni sulla configurazione del progetto, tra cui l'installazione del pacchetto, l'aggiunta di istruzioni import e la creazione di un oggetto client autorizzato, vedere Introduzione ad Archiviazione BLOB di Azure e Python.
  • Il meccanismo di autorizzazione deve disporre delle autorizzazioni necessarie per usare un lease di BLOB. Per altre informazioni, vedere le linee guida per l'autorizzazione per l'operazione API REST seguente:

Informazioni sui lease di BLOB

Un lease crea e gestisce un blocco su un BLOB per operazioni di scrittura ed eliminazione. La durata del blocco può variare da 15 a 60 secondi o può essere infinita. Un lease su un Blob fornisce un accesso esclusivo in scrittura ed eliminazione al BLOB. Per scrivere su un BLOB con un lease attivo, un client deve includere l'ID del lease attivo insieme alla richiesta di scrittura.

Per ulteriori informazioni sugli stati di lease e su quando è possibile eseguire una determinata azione su un lease, consultare Stati e azioni dei lease.

Su un contenitore che include BLOB con un lease attivo, sono consentite tutte le operazioni, inclusa l'operazione Delete Container. Pertanto, un contenitore può essere eliminato anche se i BLOB al suo interno presentano lease attivi. Usare l'operazione Lease Container per controllare i diritti di eliminazione di un contenitore.

Le operazioni di lease sono gestite dalla classe BlobLeaseClient, che fornisce un client contenente tutte le operazioni di lease per BLOB e contenitori. Per altre informazioni sui lease di contenitori tramite la libreria client, vedere Creare e gestire lease di contenitori con Python.

Acquisire un lease

Quando si acquisisce un lease di un BLOB, si ottiene un ID del lease che può essere usato dal codice per operare sul BLOB. Se il BLOB ha già un lease attivo, è possibile richiedere un nuovo lease solo usando l'ID del lease attivo. Tuttavia, è possibile specificare una nuova durata del lease.

Per acquisire un lease, creare un'istanza della classe BlobLeaseClient e quindi usare il metodo seguente:

È anche possibile acquisire un lease su un BLOB creando un'istanza di BlobClient e usando il metodo seguente:

L'esempio seguente acquisisce un lease di 30 secondi per un BLOB:

def acquire_blob_lease(self, blob_service_client: BlobServiceClient, container_name):
    # Instantiate a BlobClient
    blob_client = blob_service_client.get_blob_client(container=container_name, blob="sample-blob.txt")

    # Acquire a 30-second lease on the blob
    lease_client = blob_client.acquire_lease(30)

    return lease_client

Rinnovare un lease

È possibile rinnovare il lease di un BLOB se l'ID lease specificato nella richiesta corrisponde all'ID lease associato al BLOB. Il lease può essere rinnovato anche se scaduto, purché il BLOB non sia stato modificato o non sia stato associato a un nuovo lease dopo la scadenza di quello corrente. Quando si rinnova un lease, la durata del lease viene reimpostata.

Per rinnovare un lease, usare il metodo seguente:

L'esempio seguire rinnova un lease per un BLOB:

def renew_blob_lease(self, lease_client: BlobLeaseClient):
    # Renew a lease on a blob
    lease_client.renew()

Rilasciare un lease

È possibile rilasciare il lease di un BLOB se l'ID lease specificato nella richiesta corrisponde all'ID lease associato al BLOB. Il rilascio di un lease consente a un altro client di acquisire un lease per il BLOB non appena il rilascio viene completato.

È possibile rilasciare un lease usando il metodo seguente:

L'esempio seguente rilascia il lease su un BLOB:

def release_blob_lease(self, lease_client: BlobLeaseClient):
    # Release a lease on a blob
    lease_client.release()

Interrompere un lease

È possibile interrompere il lease su un BLOB se il BLOB presenta un lease attivo. Qualsiasi richiesta autorizzata può interrompere il lease. Non è necessario che nella richiesta sia specificato un ID lease corrispondente. Un lease non può essere rinnovato dopo che è stato interrotto e l'interruzione di un lease impedisce di acquisirne uno nuovo per un certo periodo, fino alla scadenza o al rilascio del lease originale.

È possibile interrompere un lease usando il metodo seguente:

L'esempio seguente interrompe il lease su un BLOB:

def break_blob_lease(self, lease_client: BlobLeaseClient):
    # Break a lease on a blob
    lease_client.break_lease()

Creare lease sui BLOB in modo asincrono

La libreria client di Archiviazione BLOB di Azure per Python supporta l'impostazione asincrona di lease sui BLOB. Per altre informazioni sui requisiti di configurazione del progetto, vedere Programmazione asincrona.

Seguire questa procedura per creare un lease su un BLOB usando le API asincrone:

  1. Aggiungere le seguenti istruzioni Import:

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient, BlobLeaseClient
    
  2. Aggiungere il codice per eseguire il programma usando asyncio.run. Questa funzione esegue la coroutine passata, main() nell'esempio, e gestisce il ciclo di eventi asyncio. Le coroutine vengono dichiarate con la sintassi async/await. In questo esempio, la coroutine main() crea innanzitutto il BlobServiceClient di primo livello usando async with, quindi chiama il metodo che elimina il BLOB. Si noti che solo il client di primo livello deve usare async with, poiché gli altri client creati da esso condividono lo stesso pool di connessioni.

    async def main():
        sample = BlobSamples()
    
        # TODO: Replace <storage-account-name> with your actual storage account name
        account_url = "https://<storage-account-name>.blob.core.windows.net"
        credential = DefaultAzureCredential()
    
        async with BlobServiceClient(account_url, credential=credential) as blob_service_client:
            lease_client = await sample.acquire_blob_lease(blob_service_client, "sample-container")
    
    if __name__ == '__main__':
        asyncio.run(main())
    
  3. Aggiungere il codice per acquisire un lease di BLOB. Il codice è uguale a quello dell'esempio sincrono, ad eccezione del fatto che il metodo viene dichiarato con la parola chiave async e che quando si chiama il metodo acquire_lease viene usata la parola chiave await.

    async def acquire_blob_lease(self, blob_service_client: BlobServiceClient, container_name):
        # Instantiate a BlobClient
        blob_client = blob_service_client.get_blob_client(container=container_name, blob="sample-blob.txt")
    
        # Acquire a 30-second lease on the blob
        lease_client = await blob_client.acquire_lease(30)
    
        return lease_client
    

Con questa configurazione di base, è possibile implementare altri esempi in questo articolo come coroutine usando la sintassi async/await.

Stati e azioni dei lease

Il diagramma seguente illustra i cinque stati di un lease e i comandi o gli eventi che causano modifiche dello stato del lease.

A diagram showing blob lease states and state change triggers.

La tabella seguente elenca i cinque stati di lease, fornisce una breve descrizione di ognuno di essi ed elenca le azioni di lease consentite in un determinato stato. Queste azioni di lease causano transizioni di stato, come illustrato nel diagramma.

Stato lease Descrizione Azioni di lease consentite
Disponibile Il lease è sbloccato e può essere acquisito. acquire
Leased Il lease è bloccato. acquire (solo stesso ID del lease), renew, change, release e break
Scaduta La durata del lease è scaduta. acquire, renew, release e break
Breaking Il lease è stato interrotto, ma rimarrà bloccato fino alla scadenza del periodo di interruzione. release e break
Broken Il lease è stato interrotto e il periodo di interruzione è scaduto. acquire, release e break

Quando un lease scade, il relativo ID viene mantenuto dal servizio BLOB finché il BLOB non viene modificato o finché non viene impostato un nuovo lease. Un client può provare a rinnovare o rilasciare il lease usando l'ID lease scaduto. Se l'operazione ha esito positivo, il client sa che il BLOB non è stato modificato dall'ultima volta che l'ID è stato ritenuto valido. Se la richiesta ha esito negativo, il client sa che il BLOB è stato modificato o nuovamente associato a un lease dopo l'ultima attività del lease. Il client deve quindi acquisire un nuovo lease sul BLOB.

Se un lease scade anziché essere rilasciato in modo esplicito, è possibile che un client debba attendere fino a un minuto prima di poter acquisire un nuovo lease per il BLOB. Tuttavia, se il BLOB non è stato modificato, il client può rinnovare subito il lease con il relativo ID.

Non è possibile concedere un lease per uno snapshot di BLOB, poiché gli snapshot sono di sola lettura. La richiesta di un lease per uno snapshot risulterà nel codice di stato 400 (Bad Request).

Risorse

Per altre informazioni su come gestire i lease di BLOB tramite la libreria client di Archiviazione BLOB di Azure per Python, vedere le risorse seguenti.

Operazioni dell'API REST

Azure SDK per Python contiene librerie basate sull'API REST di Azure, che consentono di interagire con le operazioni dell'API REST tramite paradigmi Python noti. I metodi della libreria client per gestire i lease di BLOB usano l'operazione API REST seguente:

Esempi di codice

Risorse per la libreria client

Vedi anche