Envío de mensajes a un tema de Azure Service Bus y recepción de mensajes de las suscripciones a ese tema (Python)
En este tutorial, va a completar los siguientes pasos:
- Creación de un espacio de nombres de Service Bus mediante Azure Portal
- Creación de un tema de Service Bus mediante Azure Portal.
- Creación de una suscripción de Service Bus a dicho tema mediante Azure Portal.
- Escriba una aplicación de Python para usar el paquete azure-servicebus para lo siguiente:
- Enviar un lote de mensajes al tema.
- Recibir esos mensajes de la suscripción.
Nota
En este inicio rápido se proporcionan instrucciones detalladas para un escenario sencillo de envío de un lote de mensajes a un tema de Service Bus y recepción de esos mensajes desde una suscripción del tema. Puede encontrar más ejemplos pregenerados de Python para Azure Service Bus en el repositorio del SDK de Azure para Python en GitHub.
Requisitos previos
- Una suscripción de Azure.
- Python 3.8 o versiones superiores
Nota:
En este tutorial se trabaja con ejemplos que puede copiar y ejecutar con Python. Para obtener instrucciones sobre cómo crear una aplicación de Python, consulte Creación e implementación de una aplicación de Python en un sitio web de Azure. Para más información sobre cómo instalar los paquetes que se usaron en este tutorial, consulte la Guía de instalación de Python.
Creación de un espacio de nombres en Azure Portal
Para empezar a usar entidades de mensajería de Service Bus en Azure, primero hay que crear un espacio de nombres con un nombre que sea único en Azure. Un espacio de nombres proporciona un contenedor de ámbito para los recursos de Service Bus (colas, temas, etc.) que están dentro de la aplicación.
Para crear un espacio de nombres:
Inicie sesión en Azure Portal.
Vaya a la página Todos los servicios.
En la barra de navegación izquierda, seleccione Integration en la lista de categorías, mantenga el mouse sobre Service Bus, y a continuación, seleccione el botón + en el mosaico de Service Bus.
En la pestaña Datos básicos de la página Crear espacio de nombres, siga estos pasos:
En Suscripción, elija la suscripción de Azure en la que se va a crear el espacio de nombres.
En Grupo de recursos, elija un grupo de recursos existente en el que residirá el espacio de nombres o cree uno.
Escriba nombre para el espacio de nombres. El nombre del espacio de nombres debe cumplir las siguientes convenciones de nomenclatura:
- El nombre debe ser único en Azure. El sistema realiza la comprobación automáticamente para ver si el nombre está disponible.
- La longitud del nombre es de 6 caracteres como mínimo y 50 como máximo.
- El nombre solo puede contener letras, números, guiones "-".
- El nombre debe comenzar con una letra y terminar con una letra o un número.
- El nombre no termina con "-sb" o "-mgmt".
En Ubicación, elija la región donde se debe hospedar el espacio de nombres.
En Plan de tarifa, seleccione el plan de tarifa (Básico, Estándar o Prémium) del espacio de nombres. Para este inicio rápido, seleccione Estándar.
Importante
Si desea usar temas y suscripciones, elija Estándar o Premium. El plan de tarifas Básico no admite temas o suscripciones.
Si ha seleccionado el plan de tarifa Prémium, especifique el número de unidades de mensajería. El plan Premium proporciona aislamiento de recursos en el nivel de CPU y memoria para que cada carga de trabajo se ejecute de forma aislada. Este contenedor de recursos se llama unidad de mensajería. A cada espacio de nombres prémium se le asigna al menos una unidad de mensajería. Puede seleccionar 1, 2, 4, 8 o 16 unidades de mensajería para cada espacio de nombres prémium de Service Bus. Para más información, consulte Mensajería prémium de Service Bus.
En la parte inferior de la página, seleccione Revisar y crear.
En la página Revisar y crear, examine la configuración y seleccione Crear.
Una vez que la implementación del recurso sea correcta, seleccione Ir al recurso en la página de implementación.
Verá la página principal del espacio de nombres de Service Bus.
Creación de un tema mediante Azure Portal
En la página Espacio de nombres de Service Bus, seleccione Temas en el menú izquierdo.
En la barra de herramientas, seleccione + Tema.
Escriba un nombre para el tema. Deje las restantes opciones con sus valores predeterminados.
Seleccione Crear.
Creación de una suscripción al tema
Seleccione el tema que creó en la sección anterior.
En la página Tema de Service Bus, seleccione Suscripción en la barra de herramientas.
En la página Crear suscripción, siga estos pasos:
Escriba S1 como nombre de la suscripción.
Escriba 3 en Max delivery count (Número máximo de entregas).
Luego, seleccione Create (Crear) para guardar la suscripción.
Autenticación de la aplicación en Azure
En este inicio rápido, se muestran dos maneras de conectarse a Azure Service Bus: sin contraseña y con la cadena de conexión.
La primera opción muestra cómo usar la entidad de seguridad en Microsoft Entra ID y el control de acceso basado en rol (RBAC) para conectarse a un espacio de nombres de Service Bus. No es necesario preocuparse por tener una cadena de conexión codificada de forma rígida en el código, en un archivo de configuración o en un almacenamiento seguro, como Azure Key Vault.
La segunda opción muestra cómo usar una cadena de conexión para conectarse a un espacio de nombres de Service Bus. Si no está familiarizado con Azure, puede que le resulte más fácil la opción de la cadena de conexión. Se recomienda usar la opción sin contraseña en aplicaciones reales y entornos de producción. Para más información, consulte Autenticación y autorización. También puede obtener más información sobre la autenticación sin contraseña en la página de información general.
Asignación de roles al usuario de Microsoft Entra
Al desarrollar localmente, asegúrese de que la cuenta de usuario que se conecta a Azure Service Bus tenga los permisos correctos. Necesitará el rol propietario de datos Azure Service Bus para enviar y recibir mensajes. Para asignarse este rol, necesitará el rol Administrador de accesos de usuarios, u otro que incluya la acción Microsoft.Authorization/roleAssignments/write
. Puede asignar roles RBAC de Azure a un usuario mediante Azure Portal, la CLI de Azure o Azure PowerShell. Puede obtener más información sobre los ámbitos disponibles para las asignaciones de roles en la página de información general del ámbito.
En el ejemplo siguiente se asigna el rol Azure Service Bus Data Owner
a la cuenta de usuario, que proporciona un acceso completo a los recursos de Azure Service Bus. En un escenario real, siga el Principio de privilegios mínimos para conceder a los usuarios solo los permisos mínimos necesarios para un entorno de producción más seguro.
Roles integrados de Azure para Azure Service Bus
En el caso de Azure Service Bus, la administración de los espacios de nombres y de todos los recursos relacionados mediante Azure Portal y la API de administración de recursos de Azure, ya se ha protegido mediante el modelo de Azure RBAC. Azure proporciona los siguientes roles integrados de Azure para autorizar el acceso a un espacio de nombres de Service Bus:
- Propietario de datos de Azure Service Bus: permite el acceso a datos en el espacio de nombres de Service Bus y sus entidades (colas, temas, suscripciones y filtros). Un miembro de este rol puede enviar y recibir mensajes de colas o temas y suscripciones.
- Emisor de datos de Azure Service Bus: use este rol para proporcionar acceso de envío a un espacio de nombres de Service Bus y sus entidades.
- Receptor de datos de Azure Service Bus: use este rol para proporcionar acceso de recepción a un espacio de nombres de Service Bus y sus entidades.
Si desea crear un rol personalizado, consulte Derechos necesarios para las operaciones de Service Bus.
Incorporación de un usuario de Microsoft Entra al rol Propietario de Azure Service Bus
Asigne el rol Propietario de datos de Azure Service Bus al nombre de usuario de Microsoft Entra en el nivel de espacio de nombres de Service Bus. Permitirá que una aplicación que se ejecuta en el contexto de la cuenta de usuario envíe mensajes a una cola o tema y reciba mensajes de la suscripción de una cola o tema.
Importante
En la mayoría de los casos, la asignación de roles tardará un minuto o dos en propagarse en Azure. En ocasiones excepcionales, puede tardar hasta ocho minutos. Si recibe errores de autenticación al ejecutar por primera vez el código, espere unos instantes e inténtelo de nuevo.
Si no tiene abierta la página Espacio de nombres de Service Bus en Azure-Portal, busque el espacio de nombres de Service Bus mediante la barra de búsqueda principal o el panel de navegación izquierdo.
En la página de información general, seleccione Control de acceso (IAM) en el menú de la izquierda.
En la página Control de acceso (IAM), seleccione la pestaña Asignación de roles.
Seleccione + Agregar en el menú superior y, a continuación, Agregar asignación de roles en el menú desplegable resultante.
Puede usar el cuadro de búsqueda para filtrar los resultados por el rol deseado. En este ejemplo, busque
Azure Service Bus Data Owner
y seleccione el resultado coincidente. Después, haga clic en Siguiente.En la pestaña Asignar acceso a, seleccione Usuario, grupo o entidad de servicio y, a continuación, elija + Seleccionar miembros.
En el cuadro de diálogo, busque el nombre de usuario de Microsoft Entra (normalmente su dirección de correo electrónico de user@domain) y, a continuación, elija Seleccionar en la parte inferior del cuadro de diálogo.
Seleccione Revisar y asignar para ir a la página final y, a continuación, de nuevo Revisar y asignar para completar el proceso.
Configuración del código
Para seguir esta guía de inicio rápido mediante la autenticación sin contraseña y su propia cuenta de Azure, haga lo siguiente:
- Instale la CLI de Azure.
- Iniciar sesión con su cuenta de Azure en el terminal o en el símbolo del sistema con
az login
. - Use la misma cuenta al agregar el rol adecuado al recurso más adelante en el tutorial.
- Ejecute el código del tutorial en el mismo terminal o símbolo del sistema.
Importante
Asegúrese de iniciar sesión con az login
. La clase DefaultAzureCredential
del código sin contraseña usa las credenciales de la CLI de Azure para autenticarse con Microsoft Entra ID.
Para usar el código sin contraseña, deberá especificar:
- un espacio de nombres completo de Service Bus, por ejemplo, <espacio-de-nombres-de-Service-Bus>.servicebus.windows.net.
- un nombre del tema
- subscription name
Uso de Pip para instalar paquetes
Para instalar los paquetes de Python necesarios para este tutorial de Service Bus, abra un símbolo del sistema que tenga Python en su ruta de acceso. Cambie el directorio a la carpeta en la que quiera tener los ejemplos.
Instale los paquetes:
pip install azure-servicebus pip install azure-identity pip install aiohttp
Envío de mensajes a un tema
En el código de ejemplo siguiente se muestra cómo enviar un lote de mensajes a un tema de Service Bus. Vea los comentarios de código para obtener más detalles.
Abra su editor favorito, como Visual Studio Code, cree un archivo send.py y agréguele el código siguiente.
Agregue las siguientes instrucciones
import
.import asyncio from azure.servicebus.aio import ServiceBusClient from azure.servicebus import ServiceBusMessage from azure.identity.aio import DefaultAzureCredential
Agregue las constantes y defina una credencial.
FULLY_QUALIFIED_NAMESPACE = "FULLY_QUALIFIED_NAMESPACE" TOPIC_NAME = "TOPIC_NAME" credential = DefaultAzureCredential()
Importante
- Reemplace
FULLY_QUALIFIED_NAMESPACE
por el espacio de nombres completo de Service Bus. - Reemplace
TOPIC_NAME
por el nombre del tema.
En el código anterior, ha usado la clase de la biblioteca cliente de Azure Identity
DefaultAzureCredential
. Cuando la aplicación se ejecute localmente durante el desarrollo,DefaultAzureCredential
detectará y se autenticará automáticamente en Azure mediante la cuenta con la que ha iniciado sesión en la CLI de Azure. Cuando la aplicación se implementa en Azure,DefaultAzureCredential
puede autenticar la aplicación en Microsoft Entra ID a través de una identidad administrada sin cambios en el código.- Reemplace
Agregue un método para enviar un solo mensaje.
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")
El remitente es un objeto que actúa como cliente para el tema que ha creado. Lo creará más adelante y lo enviará como argumento a esta función.
Agregue un método para enviar una lista de mensajes.
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")
Agregue un método para enviar un lote de mensajes.
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")
Cree un cliente de Service Bus y un objeto de remitente de tema para enviar mensajes.
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("-----------------------")
Recepción de mensajes de una suscripción
El código de ejemplo siguiente muestra cómo recibir mensajes de una suscripción. Este código recibe continuamente mensajes nuevos, hasta que no recibe mensajes nuevos durante 5 (max_wait_time
) segundos.
Abra su editor favorito, por ejemplo Visual Studio Code, cree un archivo recv.py y agréguele el código siguiente.
De forma similar al ejemplo de envío, agregue instrucciones
import
, defina las constantes que debe reemplazar por sus propios valores y defina una credencial.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()
Cree un cliente de Service Bus y un objeto de receptor de suscripción para recibir mensajes.
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()
Llame al método
run
.asyncio.run(run())
Ejecución de la aplicación
Abra un símbolo del sistema que tenga Python en su ruta de acceso y, a continuación, ejecute el código para enviar y recibir mensajes para una suscripción en un tema.
python send.py; python recv.py
Debería ver la siguiente salida:
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
En Azure Portal, vaya al espacio de nombres de Service Bus. En la página Información general, compruebe que el recuento de mensajes entrantes y salientes es 16. Si no los ve, actualice la página al cabo de unos minutos.
Seleccione el tema en el panel inferior para ver la página Tema de Service Bus de su tema. En esta página debería ver tres mensajes entrantes y tres salientes en el gráfico Mensajes.
En esta página, si selecciona una suscripción, irá a la página Service Bus Subscription (Suscripción de Service Bus). En esta página puede ver el recuento de mensajes activos, el de mensajes con problemas de entrega y mucho más. En este ejemplo se han recibido todos los mensajes, por lo que el número de mensajes activos es cero.
Si marca el código de recepción, verá que el número de mensajes activos es 16.
Pasos siguientes
Consulte la documentación y los ejemplos siguientes:
- Biblioteca cliente de Azure Service Bus para Python.
- Ejemplos.
- La carpeta sync_samples tiene ejemplos que muestran cómo interactuar con Service Bus de forma sincrónica. En este inicio rápido, ha usado este método.
- La carpeta async_samples tiene ejemplos que muestran cómo interactuar con Service Bus de forma asincrónica.
- Documentación de referencia de Azure Service Bus