Отправка сообщений в раздел Служебной шины Azure и прием сообщений из подписок в разделе (Python)
В этом руководстве выполняются следующие шаги:
- Создание пространства имен служебной шины с помощью портала Azure.
- Создание раздела служебной шины с помощью портала Azure.
- Создание подписки на этот раздел служебной шины с помощью портала Azure.
- Напишите приложение Python, чтобы использовать пакет azure-servicebus , чтобы:
- Отправьте в раздел набор сообщений.
- Получение этих сообщений из подписки.
Примечание.
Это краткое руководство содержит пошаговые инструкции по простому сценарию отправки пакета сообщений в раздел служебная шина и получения этих сообщений из подписки раздела. Предварительно созданные примеры Python для Служебная шина Azure можно найти в репозитории Azure SDK для Python на сайте GitHub.
Необходимые компоненты
- Подписка Azure
- Python 3.8 или более поздней версии
Примечание.
В этом руководстве описаны примеры, которые можно скопировать и запустить с помощью Python. Инструкции по созданию приложения Python см. в статье "Создание и развертывание приложения Python на веб-сайте Azure". Дополнительные сведения об установке пакетов, используемых в этом руководстве, см. в руководстве по установке Python.
Создание пространства имен на портале Azure
Чтобы приступить к использованию сущностей обмена сообщениями в служебной шине в Azure, сначала необходимо создать пространство имен с уникальным для Azure именем. Пространство имен предоставляет контейнер области для служебная шина ресурсов (очередей, тем и т. д.) в приложении.
Создание пространства имен службы:
Войдите на портал Azure.
На панели навигации слева выберите "Интеграция" из списка категорий, наведите указатель мыши на служебная шина, а затем нажмите + кнопку на плитке служебная шина.
В теге Основные сведения на странице Создание пространства имен выполните следующие действия:
Выберите подписку Azure, в которой будет создано пространство имен.
Выберите существующую группу ресурсов, в которую будет включено это пространство имен, или создайте новую.
Введите имя для пространства имен. В имени пространства имен должны соблюдаться следующие соглашения об именовании:
- Это имя должно быть уникальным в пределах Azure. Система немедленно проверяет, доступно ли оно.
- Длина имени составляет не менее 6 и не более 50 символов.
- Имя может содержать только буквы, цифры и дефисы (-).
- Имя должно начинаться с буквы или цифры и заканчиваться буквой или цифрой.
- Имя не должно оканчиваться на -sb или -mgmt.
Укажите расположение — регион для размещения пространства имен.
Для параметра Ценовая категория выберите ценовую категорию ("Базовый", "Стандартный" или "Премиум") для пространства имен. Для работы с этим кратким руководством выберите вариант Стандартный.
Внимание
Чтобы использовать разделы и подписки, выберите категорию "Стандартный" или "Премиум". Разделы и подписки не поддерживаются в ценовой категории "Базовый".
Если выбрана ценовая категория Премиум, укажите число единиц обмена сообщениями. В категории "Премиум" обеспечивается изоляция ресурсов на уровне ЦП и памяти, так что рабочая нагрузка выполняется изолированно от других. Контейнер ресурса называется единицей обмена сообщениями. Пространству имен ценовой категории "Премиум" выделяется по крайней мере одна единица обмена сообщениями. Для каждого пространства имен служебной шины Premium можно выбрать 1, 2, 4, 8 или 16 единиц обмена сообщениями. Дополнительные сведения см. в статье Уровни обмена сообщениями через служебную шину Premium и Standard.
В нижней части страницы выберите Review + create (Проверить и создать).
На странице Проверить и создать проверьте параметры и нажмите кнопку Создать.
После успешного развертывания ресурса выберите "Перейти к ресурсу " на странице развертывания.
Вы увидите домашнюю страницу пространства имен служебной шины.
Создание раздела с помощью портала Azure
На странице Пространство имен служебной шины выберите пункт Разделы в левом меню.
На панели инструментов выберите + Раздел.
Введите имя раздела. Для других параметров оставьте значения по умолчанию.
Нажмите кнопку создания.
Создание подписки на раздел
Выберите раздел, который был создан в предыдущем разделе.
На странице Раздел Служебной шины выберите + Подписка на панели инструментов.
На странице Создать подписку выполните следующие действия:
Введите S1 в качестве имени подписки.
Задайте для параметра Максимальное число доставок значение 3.
Выберите Создать, чтобы создать подписку.
Проверка подлинности приложения в Azure
В этом кратком руководстве показано два способа подключения к Служебная шина Azure: без пароля и строка подключения.
Первый вариант показывает, как использовать субъект безопасности в идентификаторе Microsoft Entra ID и управлении доступом на основе ролей (RBAC) для подключения к пространству имен служебная шина. Вам не нужно беспокоиться о наличии жестко закодированных строка подключения в коде или в файле конфигурации или в безопасном хранилище, например Azure Key Vault.
Второй вариант показывает, как использовать строка подключения для подключения к пространству имен служебная шина. Если вы не знакомы с Azure, вы можете найти вариант строка подключения проще следовать. Мы рекомендуем использовать параметр без пароля в реальных приложениях и рабочих средах. Дополнительные сведения см. в разделе "Проверка подлинности и авторизация". Дополнительные сведения о проверке подлинности без пароля см. на странице обзора.
Назначение ролей пользователю Microsoft Entra
При локальной разработке убедитесь, что учетная запись пользователя, которая подключается к Служебная шина Azure имеет правильные разрешения. Для отправки и получения сообщений вам потребуется роль владельца данных Служебная шина Azure. Чтобы назначить себе эту роль, вам потребуется роль администратора доступа пользователей или другая роль, которая включает Microsoft.Authorization/roleAssignments/write
действие. Роли Azure RBAC можно назначить пользователю с помощью портала Azure, Azure CLI или Azure PowerShell. Дополнительные сведения о доступных областях назначения ролей на странице обзора области.
В следующем примере роль назначается Azure Service Bus Data Owner
учетной записи пользователя, которая предоставляет полный доступ к ресурсам Служебная шина Azure. В реальном сценарии следуйте принципу наименьших привилегий , чтобы предоставить пользователям только минимальные разрешения, необходимые для более безопасной рабочей среды.
Встроенные роли Azure для служебной шины Azure
Для служебной шины Azure управление пространствами имен и всеми связанными ресурсами через портал Azure и API управления ресурсами Azure уже защищено с помощью модели Azure RBAC. Azure предоставляет следующие встроенные роли Azure для авторизации доступа к пространству имен служебной шины:
- Служебная шина Azure Владелец данных: включает доступ к пространству имен служебная шина и его сущностям (очереди, разделы, подписки и фильтры). Участник этой роли может отправлять и получать сообщения из очередей или разделов или подписок.
- Служебная шина Azure Отправителю данных: используйте эту роль, чтобы предоставить доступ к пространству имен служебная шина и его сущностям.
- Служебная шина Azure приемник данных: используйте эту роль, чтобы предоставить доступ к пространству имен служебная шина и его сущностям.
Если вы хотите создать пользовательскую роль, см. раздел "Права", необходимые для операций служебная шина.
Добавление пользователя Microsoft Entra в роль владельца Служебная шина Azure
Добавьте имя пользователя Microsoft Entra в роль владельца данных Служебная шина Azure на уровне пространства имен служебная шина. Это позволит приложению, работающему в контексте учетной записи пользователя, отправлять сообщения в очередь или раздел, а также получать сообщения из очереди или подписки раздела.
Внимание
В большинстве случаев для распространения назначения ролей в Azure потребуется несколько минут. В редких случаях может потребоваться до восьми минут. Если при первом запуске кода возникают ошибки аутентификации, подождите несколько минут и повторите попытку.
Если в портал Azure нет страницы пространства имен служебная шина, найдите пространство имен служебная шина с помощью главной панели поиска или навигации слева.
На странице обзора выберите элемент управления доступом (IAM) в меню слева.
На странице Контроль доступа (IAM) откройте вкладку Назначения ролей.
Выберите + Добавить в верхнем меню, а затем выберите Добавить назначение роли в появившемся раскрывающемся меню.
Используйте поле поиска, чтобы отфильтровать результаты для отображения нужной роли. В этом примере найдите
Azure Service Bus Data Owner
и выберите соответствующий результат. Теперь щелкните Далее.В разделе Назначение доступа для выберите Пользователь, группа или субъект-служба и + Выбрать членов.
В диалоговом окне найдите имя пользователя Microsoft Entra (обычно ваш user@domain адрес электронной почты), а затем выберите в нижней части диалогового окна.
Нажмите кнопку Проверить и назначить, чтобы перейти на последнюю страницу, а затем еще раз Проверить и назначить, чтобы завершить процесс.
Настройка кода
Чтобы следовать этому краткому руководству, используя проверку подлинности без пароля и собственную учетную запись Azure:
- Установите интерфейс командной строки Azure.
- Войдите с помощью учетной записи Azure в терминале или командной строке
az login
. - Используйте ту же учетную запись при добавлении соответствующей роли в ресурс далее в этом руководстве.
- Запустите код учебника в том же терминале или командной строке.
Внимание
Убедитесь, что вы войете с помощью az login
. Класс DefaultAzureCredential
в коде без пароля использует учетные данные Azure CLI для проверки подлинности с помощью идентификатора Microsoft Entra.
Чтобы использовать код без пароля, необходимо указать следующее:
- полное пространство имен служебной шины, например: <service-bus-namespace.servicebus.windows.net>
- Имя раздела
- название подписки
Установка пакетов с помощью pip
Чтобы установить необходимые пакеты Python для этого руководства служебная шина, откройте командную строку с Python в пути. Измените каталог на папку, в которой вы хотите получить примеры.
Установка пакетов:
pip install azure-servicebus pip install azure-identity pip install aiohttp
Отправка сообщений в раздел
В следующем примере кода показано, как отправить пакет сообщений в раздел служебной шины. Дополнительные сведения см. в комментариях к коду.
Откройте любимый редактор, например Visual Studio Code, создайте файл send.py и добавьте в него следующий код.
Добавьте следующие операторы
import
.import asyncio from azure.servicebus.aio import ServiceBusClient from azure.servicebus import ServiceBusMessage from azure.identity.aio import DefaultAzureCredential
Добавьте константы и определите учетные данные.
FULLY_QUALIFIED_NAMESPACE = "FULLY_QUALIFIED_NAMESPACE" TOPIC_NAME = "TOPIC_NAME" credential = DefaultAzureCredential()
Внимание
- Замените
FULLY_QUALIFIED_NAMESPACE
полное пространство имен для пространства имен служебная шина. - Затем замените
TOPIC_NAME
именем раздела.
В приведенном выше коде вы использовали класс клиентской библиотеки
DefaultAzureCredential
удостоверений Azure. Когда приложение выполняется локально во время разработки,DefaultAzureCredential
автоматически обнаруживает и проходит проверку подлинности в Azure с помощью учетной записи, вошедшего в Azure CLI. При развертывании приложения в AzureDefaultAzureCredential
можно пройти проверку подлинности приложения в идентификаторе Microsoft Entra с помощью управляемого удостоверения без каких-либо изменений кода.- Замените
Добавьте метод для отправки одного сообщения.
async def send_single_message(sender): # Create a Service Bus message message = ServiceBusMessage("Single Message") # send the message to the topic await sender.send_messages(message) print("Sent a single message")
Отправитель — это объект, который выступает в качестве клиента для созданного раздела. Вы создадите его позже и отправите в качестве аргумента этой функции.
Добавьте метод для отправки списка сообщений.
async def send_a_list_of_messages(sender): # Create a list of messages messages = [ServiceBusMessage("Message in list") for _ in range(5)] # send the list of messages to the topic await sender.send_messages(messages) print("Sent a list of 5 messages")
Добавьте метод для отправки пакета сообщений.
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 topic await sender.send_messages(batch_message) print("Sent a batch of 10 messages")
Создайте клиента служебной шины, а затем объект отправителя раздела для отправки сообщений.
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 Topic Sender object to send messages to the topic sender = servicebus_client.get_topic_sender(topic_name=TOPIC_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() asyncio.run(run()) print("Done sending messages") print("-----------------------")
Получение сообщений из подписки
В следующем примере кода показано, как получать сообщения из подписки. Этот код будет непрерывно получать новые сообщения, пока в течение 5 (max_wait_time
) секунд не будет получено ни одного нового сообщения.
Откройте любимый редактор, например Visual Studio Code, создайте файл recv.py и добавьте в него следующий код.
Как и в примере отправки, добавьте
import
инструкции, определите константы, которые следует заменить собственными значениями, и определите учетные данные.import asyncio from azure.servicebus.aio import ServiceBusClient from azure.identity.aio import DefaultAzureCredential FULLY_QUALIFIED_NAMESPACE = "FULLY_QUALIFIED_NAMESPACE" SUBSCRIPTION_NAME = "SUBSCRIPTION_NAME" TOPIC_NAME = "TOPIC_NAME" credential = DefaultAzureCredential()
Создайте клиент служебная шина, а затем объект получателя подписки для получения сообщений.
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: async with servicebus_client: # get the Subscription Receiver object for the subscription receiver = servicebus_client.get_subscription_receiver(topic_name=TOPIC_NAME, subscription_name=SUBSCRIPTION_NAME, max_wait_time=5) 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 subscription await receiver.complete_message(msg) # Close credential when no longer needed. await credential.close()
Вызовите метод
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. Если количество не отображается, обновите страницу, подождав несколько минут.
Выберите раздел в нижней области, чтобы просмотреть страницу Раздел служебной шины своего раздела. На этой странице вы увидите три входящих и три исходящих сообщения в диаграмме Сообщения.
При выборе подписки на этой странице вы будете перенаправлены на страницу Service Bus Subscription (Подписка служебной шины). Также на этой странице можно увидеть количество активных и недоставленных сообщений и многое другое. В этом примере получены все сообщения, поэтому количество активных сообщений равно нулю.
Если закомментировать код получения, вы увидите, что количество активных сообщений будет равно 16.
Следующие шаги
Ознакомьтесь со следующими примерами и документацией:
- Клиентская библиотека Служебной шины Azure для Python
- Примеры.
- В папке sync_samples приведены примеры, демонстрирующие взаимодействие со служебной шиной в синхронном режиме. Проходя краткое руководство, вы использовали этот метод.
- В папке async_samples приведены примеры, демонстрирующие взаимодействие со служебной шиной в асинхронном режиме.
- Справочная документация по использованию пакета azure-servicebus