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


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

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

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

Примечание.

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

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

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

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

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

Примечание.

В этом руководстве приведены примеры, которые можно скопировать и запустить с помощью Node.js. Указания по созданию приложения Node.js можно найти в статьях Создание веб-приложений Node.js в Azure или Build and deploy a Node.js application to an Azure Cloud Service (Построение и развертывание приложения Node.js в облачной службе Azure).

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

Настройка проекта

  1. Создайте папку проекта для хранения файлов быстрого запуска.

  2. В окне терминала в папке проекта инициализируйте проект Node.js.

    npm init -y
    
  3. package.json Откройте файл в папке проекта и добавьте свойство для настройки ESM. Добавьте это свойство после version свойства:

    "type":"module",
    
  4. В файле измените package.jsonscripts свойство, чтобы скомпилировать файлы TypeScript. build Добавьте сценарий.

    "scripts": {
        "build": "tsc"
    }
    
  5. tsconfig.json Создайте файл проекта для настройки сборки TypeScript ESM и скопируйте следующее в файл:

    {
      "compilerOptions": {
        "module": "NodeNext",
        "target": "ESNext",
        "moduleResolution": "NodeNext",
    
        "outDir": "dist",
        "rootDir": "./src",
    
        "esModuleInterop": true,
        "skipLibCheck": true
      },
      "include": ["src/**/*"],
      "exclude": ["node_modules", "dist"]
    }
    
  6. Создайте папку src в проекте. Здесь вы будете размещать файлы TypeScript, созданные в этом кратком руководстве.

Установка пакета с помощью диспетчер пакетов узла (npm)

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

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

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

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

В следующем примере кода показано, как отправить сообщение в очередь.

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

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

  2. В папке src создайте файл с именем send.ts и вставьте в него приведенный ниже код. Этот код отправляет имена ученых в очередь сообщений.

    Внимание

    Учетные данные без пароля предоставляются с параметром DefaultAzureCredential.

    import {
        ServiceBusClient,
        ServiceBusSender,
        ServiceBusMessageBatch,
      } from "@azure/service-bus";
    import { DefaultAzureCredential } from "@azure/identity";
    
    // Replace `<SERVICE-BUS-NAMESPACE>` with your namespace
    const fullyQualifiedNamespace = "<SERVICE-BUS-NAMESPACE>.servicebus.windows.net";
    
    // Passwordless credential
    const credential = new DefaultAzureCredential();
    
    // name of the queue
    const queueName = "<QUEUE 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 serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
    
        // createSender() can also be used to create a sender for a topic.
        const serviceBusSender: ServiceBusSender = serviceBusClient.createSender(queueName);
    
        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 serviceBusMessageBatch: ServiceBusMessageBatch = await serviceBusSender.createMessageBatch();
            for (let i = 0; i < messages.length; i++) {
                // for each message in the array
    
                // try to add the message to the batch
                if (!serviceBusMessageBatch.tryAddMessage(messages[i])) {
                    // if it fails to add the message to the current batch
                    // send the current batch as it is full
                    await serviceBusSender.sendMessages(serviceBusMessageBatch);
    
                    // then, create a new batch
                    serviceBusMessageBatch = await serviceBusSender.createMessageBatch();
    
                    // now, add the message failed to be added to the previous batch to this batch
                    if (!serviceBusMessageBatch.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 queue
            await serviceBusSender.sendMessages(serviceBusMessageBatch);
    
            console.log(`Sent a batch of messages to the queue: ${queueName}`);
    
            // Close the sender
            await serviceBusSender.close();
        } finally {
            await serviceBusSender.close();
        }
    }
    
    // call the main function
    main().catch((err) => {
        console.log("Error occurred: ", err);
        process.exit(1);
        });
    
  3. Замените <SERVICE-BUS-NAMESPACE> пространство имен служебная шина.

  4. Замените <QUEUE NAME> именем очереди.

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

    npm run build
    node dist/send.js
    
  6. Вы должны увидеть следующие выходные данные.

    Sent a batch of messages to the queue: myqueue
    

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

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

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

  2. В папке src создайте файл с именем receive.ts и вставьте в него следующий код.

    import { delay, ServiceBusClient, ServiceBusMessage, ProcessErrorArgs, ServiceBusReceiver } from "@azure/service-bus";
    import { DefaultAzureCredential } from "@azure/identity";
    
    // Replace `<SERVICE-BUS-NAMESPACE>` with your namespace
    const fullyQualifiedNamespace = "<SERVICE-BUS-NAMESPACE>.servicebus.windows.net";
    
    // Passwordless credential
    const credential = new DefaultAzureCredential();
    
    // name of the queue
    const queueName = "<QUEUE NAME>"
    
     async function main() {
        // create a Service Bus client using the passwordless authentication to the Service Bus namespace
        const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
    
        // createReceiver() can also be used to create a receiver for a subscription.
        const serviceBusReceiver: ServiceBusReceiver = serviceBusClient.createReceiver(queueName);
    
        // function to handle messages
        const myMessageHandler = async (
            messageReceived: ServiceBusMessage,
        ): Promise<void> => {
            console.log(`Received message: ${messageReceived.body}`);
        };
    
        // function to handle any errors
        const myErrorHandler = async (error: ProcessErrorArgs): Promise<void> => {
            console.log(error);
        };
    
        // subscribe and specify the message and error handlers
        serviceBusReceiver.subscribe({
            processMessage: myMessageHandler,
            processError: myErrorHandler,
        });
    
        // Waiting long enough before closing the sender to send messages
        await delay(20000);
    
        await serviceBusReceiver.close();
        await serviceBusReceiver.close();
    }
    // call the main function
    main().catch((err) => {
        console.log("Error occurred: ", err);
        process.exit(1);
     });
    
  3. Замените <SERVICE-BUS-NAMESPACE> пространство имен служебная шина.

  4. Замените <QUEUE NAME> именем очереди.

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

    npm run build
    node dist/receive.js
    

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

Received message: Albert Einstein
Received message: Werner Heisenberg
Received message: Marie Curie
Received message: Stephen 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 можно видеть количество входящих и исходящих сообщений. Чтобы просмотреть последние значения, возможно, потребуется подождать около минуты, а затем обновить страницу.

Снимок экрана: портал Azure с числом входящих и исходящих сообщений.

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

Снимок экрана: портал Azure с сведениями о очереди.

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

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

  • Утверждения send требуются для выполнения этой операции.
  • Утверждения "Receive" требуются для выполнения этой операции

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

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

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

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