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


Краткое руководство: Отправка и получение сообщений из очередей сервисной шины Azure (Python)

В этой статье приведены пошаговые инструкции для простого сценария отправки сообщений в очередь Service Bus и получения сообщений из неё. Предварительно созданные примеры JavaScript и TypeScript для служебной шины Azure можно найти в репозитории Azure SDK для Python на сайте GitHub.

В этом кратком руководстве вы сможете:

  • Создание пространства имен служебной шины с помощью портала Azure.

  • Создание очереди служебной шины с помощью портала Azure.

  • Написание кода Python для использования пакета azure-servicebus для:

    • Отправьте набор сообщений в очередь.
    • Получение этих сообщений из очереди.

Если вы не знакомы со службой, ознакомьтесь с обзором Service Bus перед началом работы.

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

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

  • Установите Azure CLI, которая обеспечивает проверку подлинности без пароля на компьютере разработчика.
  • Войдите с помощью учетной записи Azure в терминале или командной строке az login.
  • Используйте ту же учетную запись при добавлении соответствующей роли данных в ресурс.
  • Запустите код в том же терминале или командной строке.
  • Запишите имя очереди для пространства имен служебная шина. Это необходимо в коде.

В этом быстром старте используются примеры, которые можно скопировать и запустить с помощью Python. Инструкции по созданию приложения Python см. в кратком руководстве по развертыванию веб-приложения Python в Службе приложений Azure. Дополнительные сведения об установке пакетов, используемых в этом кратком руководстве, см. в статье "Установка пакетов библиотек Azure для Python".

Создание пространства имен на портале Azure

Чтобы начать использование сущностей обмена сообщениями служебной шины в Azure, создайте пространство имен с уникальным именем в Azure. Пространство имен предоставляет контейнер области для ресурсов служебной шины, таких как очереди и разделы в приложении.

Создание пространства имен службы:

  1. Войдите на портал Azure.

  2. Выберите всплывающее меню в левом верхнем углу и перейдите на страницу "Все службы".

  3. На панели навигации слева выберите "Интеграция".

  4. Прокрутите вниз дослужебной шины служб >обмена сообщениямии нажмите кнопку "Создать".

    Снимок экрана: выбор ресурса, интеграции и служебной шины в меню.

  5. На вкладке "Основы" страницы"Создание пространства имен " выполните следующие действия:

    1. Выберите подписку Azure, в которой будет создано пространство имен.

    2. Для группы ресурсов выберите существующую группу ресурсов или создайте новую.

    3. Введите имя пространства имен, которое соответствует следующим соглашениям об именовании.

      • Это имя должно быть уникальным в пределах Azure. Система немедленно проверяет, доступно ли оно.
      • Длина имени составляет не менее 6 и не более 50 символов.
      • Имя может содержать только буквы, цифры, дефисы -.
      • Имя должно начинаться с буквы или цифры и заканчиваться буквой или цифрой.
      • Имя не заканчивается или -sbне заканчивается-mgmt.
    4. Для расположения выберите регион для размещения пространства имен.

    5. Для параметра Ценовая категория выберите ценовую категорию ("Базовый", "Стандартный" или "Премиум") для пространства имен. Для работы с этим кратким руководством выберите вариант Стандартный.

      При выборе уровня "Премиум" можно включить георепликацию для пространства имен. Функция георепликации гарантирует, что метаданные и данные пространства имен постоянно реплицируются из основного региона в один или несколько дополнительных регионов.

      Внимание

      Чтобы использовать разделы и подписки, выберите категорию "Стандартный" или "Премиум". Темы и подписки не поддерживаются в тарифном уровне "Базовый".

      Если выбрана ценовая категория Премиум, укажите число единиц обмена сообщениями. В категории "Премиум" обеспечивается изоляция ресурсов на уровне ЦП и памяти, так что рабочая нагрузка выполняется изолированно от других. Этот контейнер ресурсов называется единицей обмена сообщениями. Пространству имен ценовой категории "Премиум" выделяется по крайней мере одна единица обмена сообщениями. Для каждого пространства имен служебной шины Premium можно выбрать 1, 2, 4, 8 или 16 единиц обмена сообщениями. Дополнительные сведения см. на уровне обмена сообщениями служебной шины уровня "Премиум".

    6. В нижней части страницы выберите Review + create (Проверить и создать).

      Снимок экрана: страница

    7. На странице Проверить и создать проверьте параметры и нажмите кнопку Создать.

  6. После успешного развертывания ресурса выберите "Перейти к ресурсу " на странице развертывания.

    Снимок экрана: страница успешного развертывания с ссылкой

  7. Вы увидите домашнюю страницу пространства имен служебной шины.

    Снимок экрана: домашняя страница созданного пространства имен служебной шины.

Создание очереди на портале Azure

  1. На странице пространства имен служебная шина разверните сущности в меню навигации слева и выберите "Очереди".

  2. На странице очередей на панели инструментов выберите +Очередь.

  3. Введите имя очереди. Оставьте другие значения своими значениями по умолчанию.

  4. Нажмите кнопку "Создать".

    Снимок экрана: страница создания очереди.

Проверка подлинности приложения в Azure

В этой статье показано два способа подключения к служебной шине Azure: без пароля и строки подключения.

Первый вариант показывает, как использовать субъект безопасности в идентификаторе Microsoft Entra ID и управлении доступом на основе ролей (RBAC) для подключения к пространству имен служебная шина. Вам не нужно беспокоиться о наличии хардкодированной строки подключения в вашем коде, в файле конфигурации или в безопасном хранилище, таком как Azure Key Vault.

Второй вариант показывает, как использовать строка подключения для подключения к пространству имен служебная шина. Если вы не знакомы с Azure, вы можете найти вариант строка подключения проще следовать. Мы рекомендуем использовать параметр без пароля в реальных приложениях и рабочих средах. Дополнительные сведения см. в разделе "Проверка подлинности и авторизация служебной шины". Дополнительные сведения о проверке подлинности без пароля см. в статье "Проверка подлинности приложений .NET".

Назначение ролей пользователю Microsoft Entra

При локальной разработке убедитесь, что учетная запись пользователя, которая подключается к служебной шине Azure, имеет правильные разрешения. Для отправки и получения сообщений требуется роль владельца данных служебной шины Azure . Чтобы назначить себе эту роль, вам потребуется роль администратора доступа пользователей или другая роль, которая включает Microsoft.Authorization/roleAssignments/write действие.

Роли Azure RBAC можно назначить пользователю с помощью портала Azure, Azure CLI или Azure PowerShell. Чтобы узнать больше о доступных областях для назначения ролей, см. статью "Общие сведения об области применения Azure RBAC".

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

Встроенные роли Azure для служебной шины Azure

Для служебной шины Azure управление пространствами имен и всеми связанными ресурсами через портал Azure и API управления ресурсами Azure уже защищено с помощью модели Azure RBAC. Azure предоставляет следующие встроенные роли Azure для авторизации доступа к пространству имен служебная шина:

  • Владелец данных служебной шины Azure: обеспечивает доступ к пространству имен служебной шины и его сущностям, включая очереди, разделы, подписки и фильтры. Участник этой роли может отправлять и получать сообщения из очередей или разделов или подписок.
  • Отправитель данных служебной шины Azure: используйте эту роль для предоставления доступа к пространству send имен служебной шины и его сущностям.
  • Приемник данных служебной шины Azure. Используйте эту роль, чтобы предоставить receive доступ к пространству имен служебной шины и его сущностям.

Если вы хотите создать пользовательскую роль, см. раздел "Права", необходимые для операций служебная шина.

Добавление пользователя Microsoft Entra в роль владельца Служебная шина Azure

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

Внимание

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

  1. Если в портал Azure нет страницы пространства имен служебная шина, найдите пространство имен служебная шина с помощью главной панели поиска или навигации слева.

  2. На странице обзора выберите элемент управления доступом (IAM) в меню слева.

  3. На странице Контроль доступа (IAM) откройте вкладку Назначения ролей.

  4. Выберите +Добавить из верхнего меню и добавьте назначение ролей.

    Снимок экрана, на котором продемонстрировано назначение роли.

  5. Используйте поле поиска, чтобы отфильтровать результаты для отображения нужной роли. В этом примере найдите Azure Service Bus Data Owner и выберите соответствующий результат. Теперь щелкните Далее.

  6. В разделе Назначение доступа для выберите Пользователь, группа или субъект-служба и + Выбрать членов.

  7. В диалоговом окне найдите имя пользователя Microsoft Entra (обычно ваш user@domain адрес электронной почты), а затем выберите в нижней части диалогового окна.

  8. Нажмите кнопку Проверить и назначить, чтобы перейти на последнюю страницу, а затем еще раз Проверить и назначить, чтобы завершить процесс.

Установка пакетов с помощью pip

  1. Чтобы установить необходимые пакеты Python для этого краткого руководства по служебной шине, откройте окно командной строки с python в пути.

  2. Измените каталог на папку, в которой вы хотите получить примеры.

  3. Установите следующие пакеты:

    pip install azure-servicebus
    pip install azure-identity
    pip install aiohttp
    

Отправка сообщений в очередь

В следующем примере кода показано, как отправить сообщение в очередь. Откройте текстовый редактор, например Visual Studio Code, создайте файл send.py и добавьте в него следующий код.

  1. Добавьте инструкции импорта.

    import asyncio
    from azure.servicebus.aio import ServiceBusClient
    from azure.servicebus import ServiceBusMessage
    from azure.identity.aio import DefaultAzureCredential
    
  2. Добавьте константы и определите учетные данные.

    FULLY_QUALIFIED_NAMESPACE = "FULLY_QUALIFIED_NAMESPACE"
    QUEUE_NAME = "QUEUE_NAME"
    
    credential = DefaultAzureCredential()
    

    Внимание

    • Замените FULLY_QUALIFIED_NAMESPACE полное пространство имен для пространства имен служебная шина.
    • Замените QUEUE_NAME именем очереди.
  3. Добавьте метод для отправки одного сообщения.

    async def send_single_message(sender):
        # Create a Service Bus message and send it to the queue
        message = ServiceBusMessage("Single Message")
        await sender.send_messages(message)
        print("Sent a single message")
    

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

  4. Добавьте метод для отправки списка сообщений.

    async def send_a_list_of_messages(sender):
        # Create a list of messages and send it to the queue
        messages = [ServiceBusMessage("Message in list") for _ in range(5)]
        await sender.send_messages(messages)
        print("Sent a list of 5 messages")
    
  5. Добавьте метод для отправки пакета сообщений.

    async def send_batch_message(sender):
        # Create a batch of messages
        async with sender:
            batch_message = await sender.create_message_batch()
            for _ in range(10):
                try:
                    # Add a message to the batch
                    batch_message.add_message(ServiceBusMessage("Message inside a ServiceBusMessageBatch"))
                except ValueError:
                    # ServiceBusMessageBatch object reaches max_size.
                    # New ServiceBusMessageBatch object can be created here to send more data.
                    break
            # Send the batch of messages to the queue
            await sender.send_messages(batch_message)
        print("Sent a batch of 10 messages")
    
  6. Создайте клиента служебной шины, а затем объект отправителя очереди для отправки сообщений.

    async def run():
        # create a Service Bus client using the credential
        async with ServiceBusClient(
            fully_qualified_namespace=FULLY_QUALIFIED_NAMESPACE,
            credential=credential,
            logging_enable=True) as servicebus_client:
            # get a Queue Sender object to send messages to the queue
            sender = servicebus_client.get_queue_sender(queue_name=QUEUE_NAME)
            async with sender:
                # send one message
                await send_single_message(sender)
                # send a list of messages
                await send_a_list_of_messages(sender)
                # send a batch of messages
                await send_batch_message(sender)
    
            # Close credential when no longer needed.
            await credential.close()
    
  7. run Вызовите метод и распечатайте сообщение.

    asyncio.run(run())
    print("Done sending messages")
    print("-----------------------")
    

Получение сообщений из очереди

В следующем примере кода показано, как получать сообщения из очереди. Отображаемый код получает новые сообщения до тех пор, пока он не получит новые сообщения в течение 5 (max_wait_time) секунд.

Откройте текстовый редактор, например Visual Studio Code, создайте файл recv.py и добавьте в него следующий код.

  1. Аналогично примеру с send.py, добавьте операторы import. Замените константы собственными значениями и определите учетные данные.

    import asyncio
    
    from azure.servicebus.aio import ServiceBusClient
    from azure.identity.aio import DefaultAzureCredential
    
    FULLY_QUALIFIED_NAMESPACE = "FULLY_QUALIFIED_NAMESPACE"
    QUEUE_NAME = "QUEUE_NAME"
    
    credential = DefaultAzureCredential()
    
  2. Создайте клиент служебная шина, а затем объект приемника очереди для получения сообщений.

    async def run():
        # create a Service Bus client using the connection string
        async with ServiceBusClient(
            fully_qualified_namespace=FULLY_QUALIFIED_NAMESPACE,
            credential=credential,
            logging_enable=True) as servicebus_client:
    
            async with servicebus_client:
                # get the Queue Receiver object for the queue
                receiver = servicebus_client.get_queue_receiver(queue_name=QUEUE_NAME)
                async with receiver:
                    received_msgs = await receiver.receive_messages(max_wait_time=5, max_message_count=20)
                    for msg in received_msgs:
                        print("Received: " + str(msg))
                        # complete the message so that the message is removed from the queue
                        await receiver.complete_message(msg)
    
            # Close credential when no longer needed.
            await credential.close()
    
  3. Вызовите метод run .

    asyncio.run(run())
    

Выполнить приложение

Откройте командную строку с Python в пути, а затем запустите код для отправки и получения сообщений из очереди.

python send.py; python recv.py

Должен появиться следующий результат:

Sent a single message
Sent a list of 5 messages
Sent a batch of 10 messages
Done sending messages
-----------------------
Received: Single Message
Received: Message in list
Received: Message in list
Received: Message in list
Received: Message in list
Received: Message in list
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch

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

Количество входящих и исходящих сообщений

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

Сведения об очереди

Ознакомьтесь со следующими примерами и документацией: