將訊息傳送至 Azure 服務匯流排 主題,並從訂用帳戶接收主題的訊息 (Python)

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

  1. 使用 Azure 入口網站 建立 服務匯流排 命名空間。
  2. 使用 Azure 入口網站 建立 服務匯流排 主題。
  3. 使用 Azure 入口網站,建立該主題的 服務匯流排 訂用帳戶。
  4. 撰寫 Python 應用程式以使用 azure-servicebus 套件來:
    • 將一組訊息傳送至主題。
    • 從訂用帳戶接收這些訊息。

注意

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

必要條件

注意

本教學課程適用於您可以使用 Python 複製和執行的範例。 如需如何建立 Python 應用程式的指示,請參閱 建立 Python 應用程式並將其部署至 Azure 網站。 如需安裝本教學課程中使用的套件的詳細資訊,請參閱 Python 安裝指南

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

若要開始在 Azure 中使用 服務匯流排 傳訊實體,您必須先建立命名空間,其名稱在 Azure 中是唯一的。 命名空間提供應用程式內 服務匯流排 資源(佇列、主題等)的範圍容器。

若要建立命名空間:

  1. 登入 Azure 入口網站

  2. 流覽至 [ 所有服務] 頁面

  3. 在左側導覽列上,從類別清單中選取 [整合],將滑鼠停留在 服務匯流排 上方,然後在 服務匯流排 圖格上選取+按鈕。

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

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

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

    2. 針對 [ 資源群組],選擇命名空間將存留在其中的現有資源群組,或建立新的資源群組。

    3. 輸入命名空間的名稱。 命名空間名稱應遵守下列命名慣例:

      • 名稱在整個 Azure 中必須是唯一的。 系統會立即檢查此名稱是否可用。
      • 名稱長度至少為 6,最多 50 個字元。
      • 名稱只能包含字母、數位、連字元 “-”。
      • 名稱必須以字母開頭,並以字母或數字結尾。
      • 名稱結尾不是 “-sb” 或 “-mgmt”。
    4. 針對 [ 位置],選擇您的命名空間應該裝載所在的區域。

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

      重要

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

      如果您選取 進階版 定價層,請指定傳訊單位數目。 進階層會在 CPU 和記憶體層級提供資源隔離,讓每個工作負載以隔離方式執行。 此資源容器稱為傳訊單位。 進階命名空間至少有一個傳訊單位。 您可以為每個 服務匯流排 進階版 命名空間選取 1、2、4、8 或 16 個傳訊單位。 如需詳細資訊,請參閱 服務匯流排 進階版 傳訊

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

      Image showing the Create a namespace page

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

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

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

  6. 您會看到服務總線命名空間的首頁。

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

使用 Azure 入口網站 建立主題

  1. [服務匯流排 命名空間] 頁面上,選取左側功能表上的 [主題]。

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

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

  4. 選取 建立

    Image showing the Create topic page.

建立主題的訂用帳戶

  1. 選取您在上一節中建立的主題

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

  2. 在 [服務匯流排 主題] 頁面上,選取工具列上的 [+ 訂用帳戶]。

    Image showing the Add subscription button.

  3. 在 [ 建立訂用帳戶] 頁面上,遵循下列步驟:

    1. 輸入 S1 以取得 訂用帳戶的名稱

    2. 針對 [最大傳遞計數] 輸入 3

    3. 然後,選取 [建立 ] 以建立訂用帳戶。

      Image showing the Create subscription page.

向 Azure 驗證應用程式

本快速入門示範兩種連線到 Azure 服務匯流排 的方式:密碼和 連接字串

第一個選項示範如何使用 Microsoft Entra ID 和角色型存取控制 (RBAC) 中的安全性主體來連線到 服務匯流排 命名空間。 您不需要擔心在程式代碼或組態檔中,或在 Azure 金鑰保存庫 等安全記憶體中硬式編碼 連接字串。

第二個選項示範如何使用 連接字串 來連線到 服務匯流排 命名空間。 如果您不熟悉 Azure,您可能會發現 連接字串 選項更容易遵循。 我們建議在真實世界應用程式和生產環境中使用無密碼選項。 如需詳細資訊,請參閱驗證與授權。 您也可以在概 觀頁面上深入瞭解無密碼驗證。

將角色指派給 Microsoft Entra 使用者

在本機開發時,請確定連線到 Azure 服務匯流排 的用戶帳戶具有正確的許可權。 您需要 Azure 服務匯流排 數據擁有者角色,才能傳送和接收訊息。 若要指派此角色,您需要使用者存取 管理員 istrator 角色,或包含Microsoft.Authorization/roleAssignments/write動作的另一個角色。 您可以使用 Azure 入口網站、Azure CLI 或 Azure PowerShell,將 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. 從頂端功能表選取 [+ 新增],然後從產生的下拉功能表中選取 [新增角色指派]

    A screenshot showing how to assign a role.

  5. 使用搜尋方塊,從結果篩選出所需的角色。 在此範例中,搜尋 Azure Service Bus Data Owner 並選取相符的結果。 接著,選擇 [下一步]

  6. 在 [存取權指派對象為] 下,選取 [使用者、群組或服務主體],然後選擇 [+ 選取成員]

  7. 在對話方塊中,搜尋 Microsoft Entra 使用者名稱 (通常是您的 user@domain 電子郵件地址),然後在對話方塊底部選擇 [選取]

  8. 選取 [檢閱 + 指派] 以移至最終頁面,然後再次選取 [檢閱 + 指派] 以完成此程序。

程式代碼設定

若要遵循本快速入門,請使用無密碼驗證和您自己的 Azure 帳戶:

  • 安裝 Azure CLI
  • 在終端機或命令提示字元 az login中使用 您的 Azure 帳戶登入。
  • 當您稍後在教學課程中將適當的角色新增至資源時,請使用相同的帳戶。
  • 在相同的終端機或命令提示字元中執行教學課程程序代碼。

重要

請確定您使用 登入 az loginDefaultAzureCredential無密碼程式代碼中的 類別會使用 Azure CLI 認證向 Microsoft Entra ID 進行驗證。

若要使用無密碼程式代碼,您必須指定:

  • 完整服務總線命名空間,例如:<service-bus-namespace.servicebus.windows.net>
  • 主題名稱
  • 訂閱名稱

使用 pip 安裝套件

  1. 若要安裝此 服務匯流排 教學課程所需的 Python 套件,請開啟在其路徑中有 Python 的命令提示字元。 將目錄變更為您要有範例的資料夾。

  2. 安裝套件:

    pip install azure-servicebus
    pip install azure-identity
    pip install aiohttp
    

將訊息傳送至主題

下列範例程式代碼示範如何將一批訊息傳送至 服務匯流排 主題。 如需詳細資料,請參閱程式碼註解。

開啟您最愛的編輯器,例如 Visual Studio Code、建立檔案 send.py,並將下列程式代碼新增至其中。

  1. 加入下列 import 陳述式。

    import asyncio
    from azure.servicebus.aio import ServiceBusClient
    from azure.servicebus import ServiceBusMessage
    from azure.identity.aio import DefaultAzureCredential
    
  2. 新增常數並定義認證。

    FULLY_QUALIFIED_NAMESPACE = "FULLY_QUALIFIED_NAMESPACE"
    TOPIC_NAME = "TOPIC_NAME"
    
    credential = DefaultAzureCredential()
    

    重要

    • 將取代FULLY_QUALIFIED_NAMESPACE為您 服務匯流排 命名空間的完整命名空間。
    • 將取代 TOPIC_NAME 為主題的名稱。

    在上述程式代碼中,您已使用 Azure 身分識別用戶端連結庫的 DefaultAzureCredential 類別。 當應用程式在開發期間於本機執行時, DefaultAzureCredential 將會使用您登入 Azure CLI 的帳戶自動探索並驗證至 Azure。 將應用程式部署至 Azure 時, DefaultAzureCredential 可以透過受控識別向 Microsoft Entra 識別碼驗證您的應用程式,而不需要變更任何程式代碼。

  3. 新增方法以傳送單一訊息。

    async def send_single_message(sender):
        # Create a Service Bus message
        message = ServiceBusMessage("Single Message")
        # send the message to the topic
        await sender.send_messages(message)
        print("Sent a single message")
    

    傳送者是物件,做為您建立之主題的用戶端。 您稍後會建立它,並將 做為自變數傳送至此函式。

  4. 新增方法以傳送訊息清單。

    async def send_a_list_of_messages(sender):
        # Create a list of messages
        messages = [ServiceBusMessage("Message in list") for _ in range(5)]
        # send the list of messages to the topic
        await sender.send_messages(messages)
        print("Sent a list of 5 messages")
    
  5. 新增方法以傳送一批訊息。

    async def send_batch_message(sender):
        # Create a batch of messages
        async with sender:
            batch_message = await sender.create_message_batch()
            for _ in range(10):
                try:
                    # Add a message to the batch
                    batch_message.add_message(ServiceBusMessage("Message inside a ServiceBusMessageBatch"))
                except ValueError:
                    # ServiceBusMessageBatch object reaches max_size.
                    # New ServiceBusMessageBatch object can be created here to send more data.
                    break
            # Send the batch of messages to the topic
            await sender.send_messages(batch_message)
        print("Sent a batch of 10 messages")
    
  6. 建立 服務匯流排 客戶端,然後建立主題傳送者對象來傳送訊息。

    async def run():
        # create a Service Bus client using the credential.
        async with ServiceBusClient(
            fully_qualified_namespace=FULLY_QUALIFIED_NAMESPACE,
            credential=credential,
            logging_enable=True) as servicebus_client:
            # Get a Topic Sender object to send messages to the topic
            sender = servicebus_client.get_topic_sender(topic_name=TOPIC_NAME)
            async with sender:
                # Send one message
                await send_single_message(sender)
                # Send a list of messages
                await send_a_list_of_messages(sender)
                # Send a batch of messages
                await send_batch_message(sender)
            # Close credential when no longer needed.
            await credential.close()
    
    asyncio.run(run())
    print("Done sending messages")
    print("-----------------------")
    

從訂用帳戶接收訊息

下列範例程式代碼示範如何從訂用帳戶接收訊息。 此程式代碼會持續接收新訊息,直到它未收到 5 秒max_wait_time的任何新訊息為止。

開啟您慣用的編輯器,例如 Visual Studio Code、建立檔案 recv.py,並將下列程式代碼新增至其中。

  1. 類似於傳送範例 add import 語句、定義您應該以您自己的值取代的常數,以及定義認證。

    import asyncio
    from azure.servicebus.aio import ServiceBusClient
    from azure.identity.aio import DefaultAzureCredential
    
    FULLY_QUALIFIED_NAMESPACE = "FULLY_QUALIFIED_NAMESPACE"
    SUBSCRIPTION_NAME = "SUBSCRIPTION_NAME"
    TOPIC_NAME = "TOPIC_NAME"
    
    credential = DefaultAzureCredential()
    
  2. 建立 服務匯流排 客戶端,然後建立要接收訊息的訂用帳戶接收者物件。

    async def run():
        # create a Service Bus client using the credential
        async with ServiceBusClient(
            fully_qualified_namespace=FULLY_QUALIFIED_NAMESPACE,
            credential=credential,
            logging_enable=True) as servicebus_client:
    
            async with servicebus_client:
                # get the Subscription Receiver object for the subscription
                receiver = servicebus_client.get_subscription_receiver(topic_name=TOPIC_NAME, 
                subscription_name=SUBSCRIPTION_NAME, max_wait_time=5)
                async with receiver:
                    received_msgs = await receiver.receive_messages(max_wait_time=5, max_message_count=20)
                    for msg in received_msgs:
                        print("Received: " + str(msg))
                        # complete the message so that the message is removed from the subscription
                        await receiver.complete_message(msg)
            # Close credential when no longer needed.
            await credential.close()
    
  3. 呼叫 run 方法。

    asyncio.run(run())
    

執行應用程式

開啟路徑中有 Python 的命令提示字元,然後執行程式碼,以在主題下傳送和接收訂用帳戶的訊息。

python send.py; python recv.py

您應該會看見下列輸出:

Sent a single message
Sent a list of 5 messages
Sent a batch of 10 messages
Done sending messages
-----------------------
Received: Single Message
Received: Message in list
Received: Message in list
Received: Message in list
Received: Message in list
Received: Message in list
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch

瀏覽至 Azure 入口網站中您的服務匯流排命名空間。 在 [概 觀] 頁面上,確認 傳入傳出 訊息計數為 16。 如果您沒有看到計數,請在等候幾分鐘后重新整理頁面。

Incoming and outgoing message count

選取底部窗格中的主題,以查看主題 服務匯流排 主題頁面。 在此頁面上,您應該會在 [訊息] 圖表中看到三個傳入和三個傳出訊息。

Incoming and outgoing messages

在此頁面上,如果您選取訂用帳戶,您會前往 [服務匯流排 訂用帳戶] 頁面。 您可以在此頁面看到作用中的訊息計數、寄不出的信件訊息計數等等。 在此範例中,已收到所有訊息,因此使用中訊息計數為零。

Active message count

如果您將接收程式代碼批注化,您會看到作用中訊息計數為 16。

Active message count - no receive

下一步

請參閱下列檔和範例: