共用方式為


將訊息傳送至 Azure 服務匯流排主題,以及接收來自主題訂用帳戶訊息 (JavaScript)

在本教學課程中,您會完成下列步驟:

  1. 使用 Azure 入口網站建立服務匯流排命名空間。
  2. 使用 Azure 入口網站建立服務匯流排主題。
  3. 使用 Azure 入口網站,針對該主題建立服務匯流排訂用帳戶。
  4. 撰寫 JavaScript 應用程式,將 @azure/service-bus 套件用於:
    • 將一組訊息傳送到主題。
    • 自訂用帳戶接收這些訊息。

附註

本快速入門提供逐步指示,說明將一批訊息傳送至服務匯流排主題,以及從主題訂用帳戶接收那些訊息的簡單案例。 您可以在 GitHub 上適用於 JavaScript 存放庫的 Azure SDK 中找到適用於 Azure 服務匯流排的預先建置 JavaScript 和 TypeScript 樣本。

先決條件

若要搭配您自己的 Azure 帳戶使用此快速入門,您需要:

  • 安裝 Azure CLI,為開發人員電腦提供無密碼驗證。
  • 在終端機或命令提示字元中,使用 az login 登入您的 Azure 帳戶。
  • 當您將適當的角色新增至資源時,請使用相同的帳戶。
  • 在相同的終端機或命令提示字元中執行程式碼。
  • 記下服務匯流排命名空間的主題名稱和訂用帳戶。 程式碼中需要這些資訊。

附註

在 Azure 入口網站中建立命名空間

若要開始使用 Azure 中的服務總線傳訊實體,請建立命名空間,其名稱在 Azure 中是唯一的。 命名空間會為應用程式中的服務總線資源提供範圍容器,例如佇列和主題。

若要建立命名空間:

  1. 登入 Azure 入口網站

  2. 從左上方選取展開選單,然後導航至所有服務頁面

  3. 在左側導覽列上,選取 [整合]。

  4. 向下卷動至 [傳訊服務>服務總線 ],然後選取 [ 建立]。

    顯示選取 [建立資源]、[整合] 和功能表中 [服務總線] 的螢幕快照。

  5. 在 [建立命名空間] 頁面的 [基本] 索引標籤中,遵循下列步驟:

    1. 針對 [訂用帳戶],選擇要在其中建立命名空間的 Azure 訂用帳戶。

    2. 針對資源群組,請選擇現有資源群組或建立新的資源群組。

    3. 輸入符合下列命名慣例的 命名空間名稱

      • 此名稱在整個 Azure 中必須是唯一的。 系統會立即檢查此名稱是否可用。
      • 名稱長度至少 6 個字元,最多 50 個字元。
      • 名稱僅可包含字母、數字和連字號 -
      • 名稱開頭必須為字母,且結尾必須為字母或數字。
      • 名稱結尾不得為 -sb-mgmt
    4. 針對 位置,選擇用於部署命名空間的區域。

    5. 針對定價層,選取命名空間的定價層 (基本、標準或進階)。 針對本快速入門,選取 [標準]

      如果您選取 Premium 層,您可以啟用命名空間的 異地複寫。 異地復寫功能可確保命名空間的元數據和數據會持續從主要區域複寫到一或多個次要區域。

      重要事項

      如果您想要使用主題和訂用帳戶,請選擇 [標準] 或 [進階]。 基本定價層不支援主題和訂用帳戶。

      若已選取 [進階] 定價層,請指定傳訊單位數目。 進階層可讓您的資源在 CPU 和記憶體層級上獲得隔離,讓每個工作負載能夠獨立執行。 此資源容器稱為「傳訊單位」 。 進階命名空間都至少有一個傳訊單位。 您可以為每個服務匯流排的進階命名空間選取 1、2、4、8 或 16 個傳訊單位。 如需詳細資訊,請參閱 服務總線進階傳訊層

    6. 選取頁面底部的 [檢閱 + 建立]

      顯示 [建立命名空間] 頁面的螢幕快照

    7. 在 [檢閱 + 建立] 頁面上檢閱設定,然後選取 [建立]

  6. 部署資源成功之後,請選取部署頁面上的 [移至資源 ]。

    顯示部署成功頁面的螢幕快照,其中包含 [移至資源] 連結。

  7. 您會看到服務匯流排命名空間的首頁。

    顯示所建立服務總線命名空間首頁的螢幕快照。

使用 Azure 入口網站建立主題

  1. 在 [服務匯流排命名空間] 頁面上,展開左側導覽功能表上的 [實體],然後選取左側功能表上的 [主題]

  2. 選取工具列上的 [+ 主題]

  3. 輸入主題的名稱。 保留其他選項的預設值。

  4. 選取 [建立]

    顯示 Azure 入口網站 中 [建立主題] 頁面的螢幕擷取畫面。

針對主題建立訂用帳戶

  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 入口網站、Azure CLI 或 Azure PowerShell,將 Azure RBAC 角色指派給使用者。 若要深入瞭解角色指派的可用範圍,請參閱 瞭解 Azure RBAC 的範圍

下列範例會將 Azure Service Bus Data Owner 角色指派給您的使用者帳戶,該角色提供對 Azure 服務匯流排資源的完整存取權。 在實際案例中,遵循 最低許可權原則 ,只為使用者提供更安全的生產環境所需的最低許可權。

Azure 服務匯流排的 Azure 內建角色

對於 Azure 服務匯流排來說,透過 Azure 入口網站和 Azure 資源管理 API 來的管理命名空間和所有相關資源的作業,皆已使用 Azure RBAC 模型來加以保護。 Azure 提供下列 Azure 內建角色,以授權存取服務匯流排命名空間:

如果您想要建立自訂角色,請參閱服務匯流排作業所需的權限 (機器翻譯)。

將 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 Package Manager (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 入口網站上選取 [刪除],以刪除其中的命名空間和佇列。

後續步驟

請參閱下列文件和範例: