Envíe mensajes a un tema de Azure Service Bus y reciba mensajes de las suscripciones a ese tema (JavaScript)

En este tutorial, va a completar los siguientes pasos:

  1. Creación de un espacio de nombres de Service Bus mediante Azure Portal
  2. Creación de un tema de Service Bus mediante Azure Portal.
  3. Creación de una suscripción de Service Bus a dicho tema mediante Azure Portal.
  4. Escriba una aplicación de JavaScript para usar el paquete @azure/service-bus para:
    • 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 ejemplos pregenerados de JavaScript y TypeScript para Azure Service Bus en el repositorio del SDK de Azure para JavaScript en GitHub.

Requisitos previos

Para usar este inicio rápido con su propia cuenta de Azure, debe hacer lo siguiente:

  • Instale la CLI de Azure, que proporciona la autenticación sin contraseña en la máquina del desarrollador.
  • Inicie 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.
  • Ejecute el código en el mismo terminal o símbolo del sistema.
  • Anote el nombre y la suscripción del tema para el espacio de nombres de Service Bus. Lo necesitará en el código.

Nota

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:

  1. Inicie sesión en Azure Portal.

  2. Vaya a la página Todos los servicios.

  3. 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.

    Image showing selection of Create a resource, Integration, and then Service Bus in the menu.

  4. En la pestaña Datos básicos de la página Crear espacio de nombres, siga estos pasos:

    1. En Suscripción, elija la suscripción de Azure en la que se va a crear el espacio de nombres.

    2. En Grupo de recursos, elija un grupo de recursos existente en el que residirá el espacio de nombres o cree uno.

    3. 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".
    4. En Ubicación, elija la región donde se debe hospedar el espacio de nombres.

    5. 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.

    6. En la parte inferior de la página, seleccione Revisar y crear.

      Image showing the Create a namespace page

    7. En la página Revisar y crear, examine la configuración y seleccione Crear.

  5. Una vez que la implementación del recurso sea correcta, seleccione Ir al recurso en la página de implementación.

    Image showing the deployment succeeded page with the Go to resource link.

  6. Verá la página principal del espacio de nombres de Service Bus.

    Image showing the home page of the Service Bus namespace created.

Creación de un tema mediante Azure Portal

  1. En la página Espacio de nombres de Service Bus, seleccione Temas en el menú izquierdo.

  2. En la barra de herramientas, seleccione + Tema.

  3. Escriba un nombre para el tema. Deje las restantes opciones con sus valores predeterminados.

  4. Seleccione Crear.

    Image showing the Create topic page.

Creación de una suscripción al tema

  1. Seleccione el tema que creó en la sección anterior.

    Image showing the selection of topic from the list of topics.

  2. En la página Tema de Service Bus, seleccione Suscripción en la barra de herramientas.

    Image showing the Add subscription button.

  3. En la página Crear suscripción, siga estos pasos:

    1. Escriba S1 como nombre de la suscripción.

    2. Escriba 3 en Max delivery count (Número máximo de entregas).

    3. Luego, seleccione Create (Crear) para guardar la suscripción.

      Image showing the Create subscription page.

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:

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.

  1. 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.

  2. En la página de información general, seleccione Control de acceso (IAM) en el menú de la izquierda.

  3. En la página Control de acceso (IAM), seleccione la pestaña Asignación de roles.

  4. Seleccione + Agregar en el menú superior y, a continuación, Agregar asignación de roles en el menú desplegable resultante.

    A screenshot showing how to assign a role.

  5. 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.

  6. En la pestaña Asignar acceso a, seleccione Usuario, grupo o entidad de servicio y, a continuación, elija + Seleccionar miembros.

  7. 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.

  8. Seleccione Revisar y asignar para ir a la página final y, a continuación, de nuevo Revisar y asignar para completar el proceso.

Uso del Administrador de paquetes para Node (NPM) para instalar el paquete

  1. Para instalar los paquetes de npm necesarios para Service Bus, abra un símbolo del sistema que tenga npm en la ruta de acceso, cambie el directorio a la carpeta en la que quiere colocar los ejemplos y ejecute este comando.

  2. Instale los siguientes paquetes:

    npm install @azure/service-bus @azure/identity
    

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.

Debe haber iniciado sesión con el comando az login de la CLI de Azure para que la máquina local proporcione la autenticación sin contraseña necesaria en este código.

  1. Abra el editor que prefiera, como Visual Studio Code

  2. Cree un archivo denominado sendtotopic.js y pegue en él el código siguiente. Este código enviará un mensaje al tema.

    Importante

    La credencial sin contraseña se proporciona con DefaultAzureCredential.

    const { ServiceBusClient } = require("@azure/service-bus");
    const { DefaultAzureCredential } = require("@azure/identity");
    
    // Replace `<SERVICE-BUS-NAMESPACE>` with your namespace
    const fullyQualifiedNamespace = "<SERVICE-BUS-NAMESPACE>.servicebus.windows.net";
    
    // Passwordless credential
    const credential = new DefaultAzureCredential();
    
    const topicName = "<TOPIC NAME>";
    
    const messages = [
        { body: "Albert Einstein" },
        { body: "Werner Heisenberg" },
        { body: "Marie Curie" },
        { body: "Steven Hawking" },
        { body: "Isaac Newton" },
        { body: "Niels Bohr" },
        { body: "Michael Faraday" },
        { body: "Galileo Galilei" },
        { body: "Johannes Kepler" },
        { body: "Nikolaus Kopernikus" }
     ];
    
     async function main() {
        // create a Service Bus client using the passwordless authentication to the Service Bus namespace
        const sbClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
    
        // createSender() can also be used to create a sender for a queue.
        const sender = sbClient.createSender(topicName);
    
        try {
            // Tries to send all messages in a single batch.
            // Will fail if the messages cannot fit in a batch.
            // await sender.sendMessages(messages);
    
            // create a batch object
            let batch = await sender.createMessageBatch();
            for (let i = 0; i < messages.length; i++) {
                // for each message in the array
    
                // try to add the message to the batch
                if (!batch.tryAddMessage(messages[i])) {
                    // if it fails to add the message to the current batch
                    // send the current batch as it is full
                    await sender.sendMessages(batch);
    
                    // then, create a new batch
                    batch = await sender.createMessageBatch();
    
                    // now, add the message failed to be added to the previous batch to this batch
                    if (!batch.tryAddMessage(messages[i])) {
                        // if it still can't be added to the batch, the message is probably too big to fit in a batch
                        throw new Error("Message too big to fit in a batch");
                    }
                }
            }
    
            // Send the last created batch of messages to the topic
            await sender.sendMessages(batch);
    
            console.log(`Sent a batch of messages to the topic: ${topicName}`);
    
            // Close the sender
            await sender.close();
        } finally {
            await sbClient.close();
        }
    }
    
    // call the main function
    main().catch((err) => {
        console.log("Error occurred: ", err);
        process.exit(1);
     });
    
  3. Reemplace <SERVICE BUS NAMESPACE CONNECTION STRING> por la cadena de conexión del espacio de nombres de Service Bus.

  4. Reemplace <TOPIC NAME> por el nombre del tema.

  5. Después, ejecute el comando en un símbolo del sistema para ejecutar este archivo.

    node sendtotopic.js
    
  6. Debería ver la siguiente salida.

    Sent a batch of messages to the topic: mytopic
    

Recepción de mensajes de una suscripción

Debe haber iniciado sesión con el comando az login de la CLI de Azure para que la máquina local proporcione la autenticación sin contraseña necesaria en este código.

  1. Abra el editor que prefiera, como Visual Studio Code

  2. Cree un archivo denominado receivefromsubscription.js y pegue en él el código siguiente. Vea los comentarios de código para obtener más detalles.

    const { delay, ServiceBusClient, ServiceBusMessage } = require("@azure/service-bus");
    const { DefaultAzureCredential } = require("@azure/identity");
    
    // Replace `<SERVICE-BUS-NAMESPACE>` with your namespace
    const fullyQualifiedNamespace = "<SERVICE-BUS-NAMESPACE>.servicebus.windows.net";
    
    // Passwordless credential
    const credential = new DefaultAzureCredential();
    
    const topicName = "<TOPIC NAME>";
    const subscriptionName = "<SUBSCRIPTION NAME>";
    
     async function main() {
        // create a Service Bus client using the passwordless authentication to the Service Bus namespace
        const sbClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
    
        // createReceiver() can also be used to create a receiver for a queue.
        const receiver = sbClient.createReceiver(topicName, subscriptionName);
    
        // function to handle messages
        const myMessageHandler = async (messageReceived) => {
            console.log(`Received message: ${messageReceived.body}`);
        };
    
        // function to handle any errors
        const myErrorHandler = async (error) => {
            console.log(error);
        };
    
        // subscribe and specify the message and error handlers
        receiver.subscribe({
            processMessage: myMessageHandler,
            processError: myErrorHandler
        });
    
        // Waiting long enough before closing the sender to send messages
        await delay(5000);
    
        await receiver.close();
        await sbClient.close();
    }
    
    // call the main function
    main().catch((err) => {
        console.log("Error occurred: ", err);
        process.exit(1);
     });
    
  3. Reemplace <SERVICE BUS NAMESPACE CONNECTION STRING> por la cadena de conexión al espacio de nombres.

  4. Reemplace <TOPIC NAME> por el nombre del tema.

  5. Reemplace <SUBSCRIPTION NAME> por el nombre de la suscripción al tema.

  6. Después, ejecute el comando en un símbolo del sistema para ejecutar este archivo.

    node receivefromsubscription.js
    

Debería ver la siguiente salida.

Received message: Albert Einstein
Received message: Werner Heisenberg
Received message: Marie Curie
Received message: Steven Hawking
Received message: Isaac Newton
Received message: Niels Bohr
Received message: Michael Faraday
Received message: Galileo Galilei
Received message: Johannes Kepler
Received message: Nikolaus Kopernikus

En Azure Portal, vaya al espacio de nombres de Service Bus, cambie a Temas en el panel inferior y seleccione el tema para ver la página Tema de Service Bus del tema. En esta página, debería ver 10 mensajes entrantes y 10 salientes en el gráfico Mensajes.

Incoming and outgoing messages

Si ejecuta solo la aplicación de envío la próxima vez, en la página Tema de Service Bus, verá 20 mensajes entrantes (10 nuevos) pero 10 mensajes salientes.

Updated topic page

En esta página, si selecciona una suscripción en el panel inferior, irá a la página Suscripción a 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, hay 10 mensajes activos que todavía no ha recibido ningún receptor.

Active message count

Solucionar problemas

Si recibe un error al ejecutar la versión sin contraseña del código JavaScript sobre las notificaciones obligatorias, asegúrese de que ha iniciado sesión mediante el comando az login de la CLI de Azure y que el rol adecuado se aplica a la cuenta de usuario de Azure.

Limpieza de recursos

Vaya al espacio de nombres de Service Bus en Azure Portal y seleccione Eliminar para eliminar el espacio de nombres y la cola que hay en él.

Pasos siguientes

Consulte la documentación y los ejemplos siguientes: