Поделиться через


Создание аренды BLOB-объектов и управление ими с помощью Python

В этой статье показано, как создавать аренды BLOB-объектов и управлять ими с помощью клиентской библиотеки служба хранилища Azure для Python. Клиентская библиотека может использовать для получения, продления, выпуска и прерывания аренды BLOB-объектов.

Сведения о аренде большого двоичного объекта с помощью асинхронных API см. в статье "Аренда BLOB-объектов" асинхронно.

Необходимые компоненты

Настройка среды

Если у вас нет существующего проекта, в этом разделе показано, как настроить проект для работы с клиентской библиотекой Хранилище BLOB-объектов Azure для Python. Дополнительные сведения см. в статье "Начало работы с Хранилище BLOB-объектов Azure и Python".

Чтобы работать с примерами кода в этой статье, выполните следующие действия, чтобы настроить проект.

Установка пакетов

Установите следующие пакеты с помощью pip install:

pip install azure-storage-blob azure-identity

Добавление инструкций импорта

Добавьте следующие операторы import :

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient, BlobLeaseClient

Авторизация

Механизм авторизации должен иметь необходимые разрешения для работы с арендой BLOB-объектов. Для авторизации с помощью идентификатора Microsoft Entra (рекомендуется), требуется встроенный участник данных хранилища BLOB-объектов хранилища ролей или более поздней версии. Дополнительные сведения см. в руководстве по авторизации для BLOB-объекта аренды (REST API).

Создание клиентского объекта

Чтобы подключить приложение к хранилищу BLOB-объектов, создайте экземпляр BLOBServiceClient. В следующем примере показано, как создать клиентский объект с помощью DefaultAzureCredential авторизации:

# TODO: Replace <storage-account-name> with your actual storage account name
account_url = "https://<storage-account-name>.blob.core.windows.net"
credential = DefaultAzureCredential()

# Create the BlobServiceClient object
blob_service_client = BlobServiceClient(account_url, credential=credential)

Можно также создавать клиентские объекты для определенных контейнеров или больших двоичных объектов напрямую или из BlobServiceClient объекта. Дополнительные сведения о создании клиентских объектов и управлении ими см. в статье "Создание клиентских объектов и управление ими", взаимодействующих с ресурсами данных.

Сведения об аренде BLOB-объектов

Аренда создает и управляет блокировкой большого двоичного объекта для операций записи и удаления. Длительность блокировки может составлять 15–60 секунд либо быть бесконечной. Аренда большого двоичного объекта обеспечивает монопольный доступ на запись и удаление большого двоичного объекта. Чтобы записать в большой двоичный объект с активной арендой, клиент должен включить активный идентификатор аренды с запросом на запись.

Дополнительные сведения о состояниях аренды и о том, когда можно выполнить данное действие по аренде, см. в разделе "Состояния аренды" и действия.

Все операции контейнера разрешены в контейнере, включающее большие двоичные объекты с активной арендой, включая удаление контейнера. Поэтому контейнер может быть удален даже в том случае, если в нем есть активные аренды больших двоичных объектов. Используйте операцию "Контейнер аренды" для управления правами на удаление контейнера.

Операции аренды обрабатываются классом BlobLeaseClient , который предоставляет клиенту все операции аренды для больших двоичных объектов и контейнеров. Дополнительные сведения об аренде контейнеров с помощью клиентской библиотеки см. в статье "Создание аренды контейнеров и управление ими с помощью Python".

Получение аренды

При получении аренды BLOB-объектов вы получите идентификатор аренды, который код может использовать для работы с большим двоичным объектом. Если большой двоичный объект уже имеет активную аренду, можно запросить только новую аренду с помощью активного идентификатора аренды. Однако можно указать новую длительность аренды.

Чтобы получить аренду, создайте экземпляр класса BlobLeaseClient , а затем используйте следующий метод:

Вы также можете получить аренду для большого двоичного объекта, создав экземпляр BLOB-объекта и используя следующий метод:

Следующий пример получает 30-секундную аренду для большого двоичного объекта:

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

Продление аренды

Вы можете продлить аренду BLOB-объектов, если идентификатор аренды, указанный в запросе, соответствует идентификатору аренды, связанному с большим двоичным объектом. Аренда может быть продлена даже в том случае, если срок его действия истек, если большой двоичный объект не был изменен или арендован еще раз после истечения срока действия этой аренды. При продлении аренды длительность сброса аренды.

Чтобы продлить аренду, используйте следующий метод:

В следующем примере возобновляется аренда большого двоичного объекта:

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

Освобождение аренды

Вы можете освободить аренду BLOB-объектов, если идентификатор аренды, указанный в запросе, соответствует идентификатору аренды, связанному с большим двоичным объектом. Освобождение аренды позволяет другому клиенту получить аренду большого двоичного объекта сразу после завершения выпуска.

Вы можете освободить аренду с помощью следующего метода:

В следующем примере освобождается аренда большого двоичного объекта:

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

Прерывание аренды

Вы можете нарушить аренду BLOB-объектов, если большой двоичный объект имеет активную аренду. Любой авторизованный запрос может нарушить аренду; Запрос не требуется для указания соответствующего идентификатора аренды. Аренда не может быть продлена после того, как она нарушена, и разрыв аренды предотвращает получение новой аренды в течение определенного периода времени, пока исходная аренда не истекает или не будет освобождена.

Вы можете разорвать аренду с помощью следующего метода:

В следующем примере прерывается аренда большого двоичного объекта:

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

Асинхронно арендованные BLOB-объекты

Клиентская библиотека Хранилище BLOB-объектов Azure для Python поддерживает асинхронную аренду BLOB-объектов. Дополнительные сведения о требованиях к настройке проекта см. в статье асинхронное программирование.

Выполните следующие действия, чтобы арендовать большой двоичный объект с помощью асинхронных API:

  1. Добавьте в файл следующие операторы импорта:

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient, BlobLeaseClient
    
  2. Добавьте код для запуска программы с помощью asyncio.run. Эта функция запускает переданную корутину в main() нашем примере и управляет циклом asyncio событий. Корутины объявляются с синтаксисом async/await. В этом примере main() корутин сначала создает верхний уровень BlobServiceClient с помощью async with, а затем вызывает метод, который получает аренду БОЛЬШОго двоичного объекта. Обратите внимание, что использовать только клиент верхнего уровня, так как другие клиенты, созданные из него, используют async withтот же пул подключений.

    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. Добавьте код для получения аренды BLOB-объектов. Код совпадает с синхронным примером, за исключением того, что метод объявляется с async ключевым словом, а await ключевое слово используется при вызове acquire_lease метода.

    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
    

С помощью этой базовой настройки вы можете реализовать другие примеры в этой статье в качестве корутин с помощью синтаксиса async/await.

Состояния аренды и действия

На следующей схеме показаны пять состояний аренды, а также команды или события, вызывающие изменение состояния аренды.

Схема с состояниями аренды BLOB-объектов и триггерами изменений состояния.

В следующей таблице перечислены пять состояний аренды, краткое описание каждого из них и список действий аренды, разрешенных в заданном состоянии. Эти действия аренды вызывают переходы состояния, как показано на схеме.

Состояние аренды Description Разрешенные действия аренды
Доступно Аренда разблокирована и может быть приобретена. acquire
Арендованный Аренда заблокирована. acquire (один и тот же идентификатор аренды), renew, change, releaseи break
Срок действия истек Срок аренды истек. acquire, renew, release и break
Ломка Аренда была нарушена, но аренда будет по-прежнему заблокирована до истечения периода перерыва. release и break.
Неисправно Аренда была нарушена, и срок перерыва истек. acquire, release и break

По истечении срока аренды идентификатор аренды сохраняется службой BLOB-объектов до тех пор, пока большой двоичный объект не будет изменен или арендован снова. Клиент может попытаться продлить или освободить аренду с помощью идентификатора аренды с истекшим сроком действия. Если эта операция выполнена успешно, клиент знает, что большой двоичный объект не был изменен с момента последнего действия идентификатора аренды. Если запрос завершается ошибкой, клиент знает, что большой двоичный объект был изменен, или большой двоичный объект был арендован снова после последней активности аренды. Затем клиент должен получить новую аренду большого двоичного объекта.

Если срок действия аренды истекает, а не освобождается явным образом, клиенту может потребоваться подождать до одной минуты, прежде чем будет получена новая аренда для большого двоичного объекта. Однако клиент может продлить аренду с идентификатором аренды немедленно, если большой двоичный объект не был изменен.

Аренда не может быть предоставлена для моментального снимка BLOB-объектов, так как моментальные снимки доступны только для чтения. Запрос аренды для моментального снимка приводит к коду 400 (Bad Request)состояния.

Ресурсы

Дополнительные сведения об управлении арендой BLOB-объектов с помощью клиентской библиотеки Хранилище BLOB-объектов Azure для Python см. в следующих ресурсах.

Примеры кода

Операции REST API

Пакет SDK Azure для Python содержит библиотеки, которые создаются на основе REST API Azure, что позволяет взаимодействовать с операциями REST API с помощью знакомых парадигм Python. Методы клиентской библиотеки для управления арендами BLOB-объектов используют следующую операцию REST API:

Ресурсы клиентской библиотеки

См. также

  • Эта статья является частью руководства разработчика хранилища BLOB-объектов для Python. Дополнительные сведения см. в полном списке статей руководства разработчика по созданию приложения Python.