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


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

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

  1. Создание пространства имен служебной шины с помощью портала Azure.
  2. Создание раздела служебной шины с помощью портала Azure.
  3. Создание подписки на этот раздел служебной шины с помощью портала Azure.
  4. Напишите приложение JavaScript для использования пакета @azure/служебной шины :
    • Отправьте в раздел набор сообщений.
    • Получение этих сообщений из подписки.

Примечание.

Это краткое руководство содержит пошаговые инструкции для простого сценария отправки пакета сообщений в раздел Служебной шины и получения этих сообщений из подписки раздела. Готовые примеры JavaScript и TypeScript для Служебной шины Azure находятся в репозитории пакета SDK Azure для JavaScript на GitHub.

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

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

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

Примечание.

Создание пространства имен на портале 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. Нажмите кнопку создания.

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

Создание подписки на раздел

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

    Снимок экрана: выбор раздела из списка тем.

  2. На странице Раздел Служебной шины выберите + Подписка на панели инструментов.

    Снимок экрана: кнопка

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

    1. Введите S1 в качестве имени подписки.

    2. Выберите Создать, чтобы создать подписку.

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

Проверка подлинности приложения в 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. Нажмите кнопку Проверить и назначить, чтобы перейти на последнюю страницу, а затем еще раз Проверить и назначить, чтобы завершить процесс.

Использование диспетчера пакета Node (NPM) для установки пакета

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

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

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

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

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

Для обеспечения проверки подлинности без пароля, необходимо выполнить вход с помощью Azure CLI az login для локального компьютера.

  1. Откройте редактор, например Visual Studio Code.

  2. Создайте файл с именем sendtotopic.js и вставьте в него приведенный ниже код. Этот код отправляет сообщение в указанный раздел.

    Внимание

    Учетные данные без пароля предоставляются с параметром 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. Замените <SERVICE BUS NAMESPACE CONNECTION STRING> строкой подключения к пространству имен Служебной шины.

  4. Затем замените <TOPIC NAME> именем раздела.

  5. Затем в окне командной строки выполните команду, которая запускает этот файл.

    node sendtotopic.js
    
  6. Вы должны увидеть следующие выходные данные.

    Sent a batch of messages to the topic: mytopic
    

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

Для обеспечения проверки подлинности без пароля, необходимо выполнить вход с помощью Azure CLI az login для локального компьютера.

  1. Откройте редактор, например Visual Studio Code.

  2. Создайте файл с именем receivefromsubscription.js и вставьте в него следующий код. Дополнительные сведения см. в комментариях к коду.

    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. Замените <SERVICE BUS NAMESPACE CONNECTION STRING> строкой подключения к пространству имен.

  4. Затем замените <TOPIC NAME> именем раздела.

  5. Замените <SUBSCRIPTION NAME> именем подписки на раздел.

  6. Затем в окне командной строки выполните команду, которая запускает этот файл.

    node receivefromsubscription.js
    

Вы должны увидеть следующие выходные данные.

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

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

Экран

Если в следующий раз запустить только приложение отправки, на странице Раздел служебной шины вы увидите 20 входящих сообщений (из них 10 новых),но только 10 исходящих.

Экран

При выборе подписки в нижней части этой страницы вы будете перенаправлены на страницу Подписка служебной шины. Также на этой странице можно увидеть количество активных и недоставленных сообщений и многое другое. Из этого примера видно, что получатель еще не получил 10 активных сообщений.

Количество активных сообщений

Устранение неполадок

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

Очистка ресурсов

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

Следующие шаги

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