本快速入門提供將訊息傳送至服務匯流排佇列,並加以接收的簡單案例逐步指示。 在本快速入門中,您會完成下列工作:
使用 Azure 入口網站建立服務匯流排命名空間。
使用 Azure 入口網站建立服務匯流排佇列。
撰寫 JavaScript 應用程式以使用 @azure/service-bus 套件來:
- 將一組訊息傳送到佇列。
- 從佇列接收這些訊息。
您可以在 GitHub 上的 Azure SDK for JavaScript 存放庫中找到適用於 Azure 服務總線的預先建置 JavaScript 和 TypeScript 範例。
如果您不熟悉服務,請先參閱 服務總線概觀 ,再開始。
先決條件
Azure 訂用帳戶。 若要完成本快速入門,您需要 Azure 帳戶。 您可以 啟用 Visual Studio 訂閱者的每月 Azure 點數 ,或註冊 免費帳戶。
若要搭配您自己的 Azure 帳戶使用此快速入門:
- 安裝 Azure CLI,為開發人員電腦提供無密碼驗證。
- 使用 命令提示字元
az login登入您的 Azure 帳戶。 - 當您將適當的資料角色新增至資源時,請使用相同的帳戶。
- 在相同的命令提示字元視窗中執行程序代碼。
- 請記下您服務總線命名空間中的佇列名稱。 您需要將這個放到程式代碼中。
附註
本教學課程使用您可以透過 Nodejs 來複製和執行的範例。 如需有關建立 Node.js 應用程式的指示,請參閱建立 Node.js 應用程式並將其部署到 Azure 網站或 Node.js 雲端服務 (使用 Windows PowerShell)。
在 Azure 入口網站中建立命名空間
若要開始使用 Azure 中的服務總線傳訊實體,請建立命名空間,其名稱在 Azure 中是唯一的。 命名空間會為應用程式中的服務總線資源提供範圍容器,例如佇列和主題。
若要建立命名空間:
登入 Azure 入口網站。
從左上方選取展開選單,然後導航至所有服務頁面。
在左側導覽列上,選取 [整合]。
向下卷動至 [傳訊服務>服務總線 ],然後選取 [ 建立]。
在 [建立命名空間] 頁面的 [基本] 索引標籤中,遵循下列步驟:
針對 [訂用帳戶],選擇要在其中建立命名空間的 Azure 訂用帳戶。
針對資源群組,請選擇現有資源群組或建立新的資源群組。
輸入符合下列命名慣例的 命名空間名稱 :
- 此名稱在整個 Azure 中必須是唯一的。 系統會立即檢查此名稱是否可用。
- 名稱長度至少 6 個字元,最多 50 個字元。
- 名稱僅可包含字母、數字和連字號
-。 - 名稱開頭必須為字母,且結尾必須為字母或數字。
- 名稱結尾不得為
-sb或-mgmt。
針對 位置,選擇用於部署命名空間的區域。
針對定價層,選取命名空間的定價層 (基本、標準或進階)。 針對本快速入門,選取 [標準]。
如果您選取 Premium 層,您可以啟用命名空間的 異地複寫。 異地復寫功能可確保命名空間的元數據和數據會持續從主要區域複寫到一或多個次要區域。
重要事項
如果您想要使用主題和訂用帳戶,請選擇 [標準] 或 [進階]。 基本定價層不支援主題和訂用帳戶。
若已選取 [進階] 定價層,請指定傳訊單位數目。 進階層可讓您的資源在 CPU 和記憶體層級上獲得隔離,讓每個工作負載能夠獨立執行。 此資源容器稱為「傳訊單位」 。 進階命名空間都至少有一個傳訊單位。 您可以為每個服務匯流排的進階命名空間選取 1、2、4、8 或 16 個傳訊單位。 如需詳細資訊,請參閱 服務總線進階傳訊層。
選取頁面底部的 [檢閱 + 建立]。
在 [檢閱 + 建立] 頁面上檢閱設定,然後選取 [建立]。
部署資源成功之後,請選取部署頁面上的 [移至資源 ]。
您會看到服務匯流排命名空間的首頁。
在 Azure 入口網站中建立佇列
在 [ Azure 服務匯流排命名空間] 頁面上,展開左側導覽功能表上的 [實體],然後選取 [佇列]。
在 佇列 頁面上的工具列中,選取 + 佇列。
輸入佇列的名稱。 將其他值保留為預設值。
選取 ,創建。
向 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 內建角色,以授權存取服務匯流排命名空間:
- Azure 服務總線數據擁有者:啟用服務總線命名空間及其實體的數據存取,包括佇列、主題、訂用帳戶和篩選。 此角色的成員可以從佇列或主題/訂用帳戶傳送和接收訊息。
-
Azure 服務總線數據發送者:使用此角色來提供
send服務總線命名空間及其實體的存取權。 -
Azure 服務匯流排資料接收器:使用此角色提供
receive對服務匯流排命名空間及其實體的存取權。
如果您想要建立自訂角色,請參閱服務匯流排作業所需的權限 (機器翻譯)。
將 Microsoft Entra 使用者新增至 Azure 服務匯流排擁有者角色
將您的 Microsoft Entra 使用者名稱新增至服務匯流排命名空間層級的 Azure 服務匯流排資料擁有者角色, 此設定可讓在使用者帳戶內容中執行的應用程式,將訊息傳送至佇列或主題。 它可以接收來自佇列或主題訂閱的訊息。
重要事項
在大部分情況下,角色指派在 Azure 中傳播需要一兩分鐘的時間。 在罕見的情況下,可能需要高達八分鐘的時間。 如果您第一次執行程式碼時收到驗證錯誤,請稍候片刻再試一次。
如果您沒有在 Azure 入口網站中開啟 [服務匯流排命名空間] 頁面,請使用主要搜尋列或左側導覽找出您的服務匯流排命名空間。
在 [ 概觀] 頁面上,從左側功能表中選取 [訪問控制][IAM ]。
在 [存取控制 (IAM)] 頁面上,選取 [角色指派] 索引標籤。
從頂端功能表中選取 [+ 新增 ],然後 選取 [新增角色指派]。
使用搜尋方塊,從結果篩選出所需的角色。 在此範例中,搜尋
Azure Service Bus Data Owner並選取相符的結果。 接著,選擇 [下一步]。在 [存取權指派對象為] 下,選取 [使用者、群組或服務主體],然後選擇 [+ 選取成員]。
在對話方塊中,搜尋 Microsoft Entra 使用者名稱 (通常是您的 user@domain 電子郵件地址),然後在對話方塊底部選擇 [選取]。
選取 [檢閱 + 指派] 以移至最終頁面,然後再次選取 [檢閱 + 指派] 以完成此程序。
使用 Node Package Manager (NPM) 安裝封裝
若要安裝服務總線所需的 npm 套件,請開啟路徑中具有
npm的命令提示字元視窗,並將目錄變更為您要有範例的資料夾。安裝下列套件:
npm install @azure/service-bus @azure/identity
傳送訊息至佇列
下列範例程式碼示範如何將訊息傳送至佇列。
使用本機計算機的 Azure CLI 命令 az login 登入,以提供此程式碼中所需的無密碼驗證。
開啟文本編輯器,例如 Visual Studio Code。
建立名為
send.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(); // 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 sbClient = new ServiceBusClient(fullyQualifiedNamespace, credential); // createSender() can also be used to create a sender for a topic. const sender = sbClient.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 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 queue await sender.sendMessages(batch); console.log(`Sent a batch of messages to the queue: ${queueName}`); // 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); });將
<SERVICE-BUS-NAMESPACE>取代為您的服務匯流排命名空間。將
<QUEUE NAME>取代為佇列名稱。若要執行此檔案中的程式碼,請在命令提示字元中使用此命令:
node send.js您應該會看見下列輸出。
Sent a batch of messages to the queue: myqueue
從佇列接收訊息
使用本機計算機的 Azure CLI 命令 az login 登入,以提供此程式碼中所需的無密碼驗證。
開啟文本編輯器,例如 Visual Studio Code。
建立名為
receive.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(); // 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 sbClient = new ServiceBusClient(fullyQualifiedNamespace, credential); // createReceiver() can also be used to create a receiver for a subscription. const receiver = sbClient.createReceiver(queueName); // 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(20000); await receiver.close(); await sbClient.close(); } // call the main function main().catch((err) => { console.log("Error occurred: ", err); process.exit(1); });將
<SERVICE-BUS-NAMESPACE>取代為您的服務匯流排命名空間。將
<QUEUE NAME>取代為佇列名稱。若要執行此檔案中的程式碼,請在命令提示字元中使用此命令:
node receive.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 入口網站中服務匯流排命名空間的概觀頁面上,您可以看到傳入和傳出訊息計數。 您可能需要等候一分鐘左右,然後重新整理頁面以查看最新的值。
選取此概觀頁面上的佇列,瀏覽至服務匯流排佇列頁面。 您也會在此頁面上看到傳入和傳出訊息計數。 您也會看到其他資訊,例如佇列的目前大小、大小上限、作用中訊息計數等等。
疑難排解
如果您在執行 JavaScript 程式代碼的 無密碼 版本時收到下列其中一個錯誤,請使用 Azure CLI 命令 az login登入 。
適當的角色會套用至您的 Azure 用戶帳戶:
- 需要「傳送」宣告,才能執行此作業
- 需要「接收」宣告,才能執行此作業
清除資源
在 Azure 入口網站中瀏覽至您的服務匯流排命名空間,然後在 Azure 入口網站上選取 [刪除],以刪除其中的命名空間和佇列。
相關內容
請參閱下列文件和範例: