共用方式為


如何使用來自 Python 的 Azure 佇列記憶體

概觀

本文示範使用 Azure 佇列記憶體服務的常見案例。 涵蓋的案例包括插入、查看、取得和刪除佇列訊息。 也涵蓋建立和刪除佇列的程序代碼。

本文中的範例是以 Python 撰寫,並使用 適用於 Python 的 Azure 佇列記憶體客戶端連結庫。 如需佇列的詳細資訊,請參閱 後續步驟 一節。

什麼是佇列記憶體?

Azure 佇列記憶體是一項服務,可用來儲存大量訊息,可透過 HTTP 或 HTTPS 的已驗證呼叫從世界各地存取。 單一佇列訊息的大小最多可達 64 KB,而佇列可以包含數百萬則訊息,最多可達記憶體帳戶的總容量限制。 佇列存儲通常用於建立待處理工作的清單,以便進行異步處理。

隊列服務概念

Azure 佇列服務包含下列元件:

Azure 佇列服務元件

  • 記憶體帳戶: 所有對 Azure 記憶體的存取都是透過記憶體帳戶完成。 如需儲存體帳戶的詳細資訊,請參閱儲存體帳戶概觀

  • 佇列:佇列包含一組訊息。 所有訊息都必須在佇列中。 請注意,佇列名稱必須全部小寫。 如需為佇列命名的詳細資訊,請參閱 為佇列和中繼資料命名

  • 訊息:大小上限為 64 KB 的訊息 (任何格式)。 訊息可以保留在佇列中的時間上限為 7 天。 在 2017-07-29 版或更新版本中,存留時間上限可以是任何正數或 -1 (表示訊息不會過期)。 如果省略此參數,則預設存留時間為七天。

  • URL 格式: 佇列可以使用下列 URL 格式尋址:http://<storage account>.queue.core.windows.net/<queue>

    下列 URL 指向圖表中的佇列:

    http://myaccount.queue.core.windows.net/incoming-orders

建立 Azure 儲存體帳戶

建立第一個 Azure 記憶體帳戶最簡單的方式是使用 Azure 入口網站。 若要深入了解,請參閱 建立儲存體帳戶

您也可以使用 Azure PowerShellAzure CLI或適用於 .NET 的 Azure 記憶體資源提供者來建立 Azure 記憶體帳戶。

如果您目前不想在 Azure 中建立記憶體帳戶,您也可以使用 Azurite 記憶體模擬器在本機環境中執行和測試程式代碼。 如需詳細資訊,請參閱 使用 Azurite 模擬器進行本機 Azure 記憶體開發

下載並安裝適用於 Python 的 Azure 記憶體 SDK

適用於 Python 的 Azure 記憶體 SDK 需要 Python v2.7、v3.3 或更新版本。

透過 PyPI 安裝

若要透過 Python 套件索引安裝 (PyPI),請輸入:

pip install azure-storage-queue

備註

如果您要從適用於 Python v0.36 或更早版本的 Azure 儲存體 SDK 升級,請先使用 pip uninstall azure-storage 卸載舊版的 SDK,然後再安裝最新的套件。

如需替代安裝方法,請參閱 適用於 Python 的 Azure SDK

從 Azure 入口網站複製您的認證

當應用程式範例向 Azure 儲存體發出要求時,該要求必須獲得授權。 若要對要求授權,請以連接字串的形式將儲存體帳戶認證新增至應用程式。 若要檢視您的儲存體帳戶認證,請遵循下列步驟:

  1. 登入 Azure 入口網站

  2. 找尋您的儲存體帳戶。

  3. 在 [儲存體帳戶] 功能表窗格的 [安全性 + 網路] 下方,選取 [存取金鑰]。 在此處,您可以檢視帳戶存取金鑰,和每個金鑰的完整連接字串。

    顯示存取金鑰設定在 Azure 入口網站 位置的螢幕快照

  4. 在 [存取金鑰] 窗格中,選取 [顯示金鑰]

  5. 在 [金鑰 1] 區段中,找出連接字串值。 選取 [複製到剪貼簿] 圖示以複製連接字串。 在下一小節中,您會將該連接字串值新增至環境變數。

    顯示如何從 Azure 入口網站 複製 連接字串 的螢幕快照

設定儲存體連接字串

在複製連接字串後,請在執行應用程式的本機電腦上,將該字串寫入至新的環境變數中。 若要設定環境變數,請開啟主控台視窗,並遵循您的作業系統所適用的指示。 將 <yourconnectionstring> 用實際的連接字串取代。

setx AZURE_STORAGE_CONNECTION_STRING "<yourconnectionstring>"

在 Windows 中新增環境變數之後,您必須啟動新的命令視窗執行個體。

重新啟動程式

新增環境變數之後,請重新啟動任何需要讀取環境變數的執行中程式。 例如,請先重新啟動您的開發環境或編輯器,然後再繼續。

設定您的應用程式以存取佇列記憶體

物件 QueueClient 可讓您使用佇列。 在您想要以程序設計方式存取 Azure 佇列的任何 Python 檔案頂端附近新增下列程式代碼:

from azure.storage.queue import (
        QueueClient,
        BinaryBase64EncodePolicy,
        BinaryBase64DecodePolicy
)

import os, uuid

封裝 os 支援擷取環境變數。 封裝 uuid 支持產生佇列名稱的唯一標識符。

建立佇列

連接字串是從稍早設定的 AZURE_STORAGE_CONNECTION_STRING 環境變數擷取。

下列程式代碼會使用記憶體連接字串建立 QueueClient 物件。

# Retrieve the connection string from an environment
# variable named AZURE_STORAGE_CONNECTION_STRING
connect_str = os.getenv("AZURE_STORAGE_CONNECTION_STRING")

# Create a unique name for the queue
q_name = "queue-" + str(uuid.uuid4())

# Instantiate a QueueClient object which will
# be used to create and manipulate the queue
print("Creating queue: " + q_name)
queue_client = QueueClient.from_connection_string(connect_str, q_name)

# Create the queue
queue_client.create_queue()

Azure 佇列訊息會儲存為文字。 如果您想要儲存二進位數據,請先設定Base64編碼和譯碼函式,再將訊息放入佇列中。

在建立客戶端物件時設定Base64編碼和譯碼函式。

# Setup Base64 encoding and decoding functions
base64_queue_client = QueueClient.from_connection_string(
                            conn_str=connect_str, queue_name=q_name,
                            message_encode_policy = BinaryBase64EncodePolicy(),
                            message_decode_policy = BinaryBase64DecodePolicy()
                        )

將訊息插入佇列

若要將訊息插入佇列中,請使用 send_message 方法。

message = u"Hello World"
print("Adding message: " + message)
queue_client.send_message(message)

查看訊息

您可以呼叫 peek_messages 方法來查看訊息,而不需從佇列中移除訊息。 根據預設,此方法會查看單一訊息。

# Peek at the first message
messages = queue_client.peek_messages()

for peeked_message in messages:
    print("Peeked message: " + peeked_message.content)

變更佇列訊息的內容

您可以直接在佇列中變更訊息的內容。 如果訊息代表工作,您可以使用此功能來更新工作的狀態。

下列程式代碼會使用 update_message 方法來更新訊息。 可見度逾時設定為 0,這表示訊息會立即出現,並更新內容。

messages = queue_client.receive_messages()
list_result = next(messages)

message = queue_client.update_message(
        list_result.id, list_result.pop_receipt,
        visibility_timeout=0, content=u'Hello World Again')

print("Updated message to: " + message.content)

取得佇列長度

您可估計佇列中的訊息數目。

get_queue_properties方法會傳回佇列屬性,包括approximate_message_count

properties = queue_client.get_queue_properties()
count = properties.approximate_message_count
print("Message count: " + str(count))

結果只是近似值,因為服務回應您的要求之後,可以新增或移除訊息。

從佇列中取出訊息

在兩個步驟中從佇列中移除訊息。 如果您的程式代碼無法處理訊息,此雙步驟程式可確保您可以取得相同的訊息,然後再試一次。 成功處理訊息之後呼叫 delete_message

當您呼叫 receive_messages 時,預設會在佇列中取得下一則訊息。 讀取此佇列訊息的任何其他程式碼皆無法看到從 receive_messages 傳回的訊息。 根據預設,此訊息會保持不可見 30 秒。 若要完成從佇列中移除訊息,您也必須呼叫 delete_message

messages = queue_client.receive_messages()

for message in messages:
    print("Dequeueing message: " + message.content)
    queue_client.delete_message(message.id, message.pop_receipt)

有兩種方式可以自訂從佇列擷取訊息的方式。 首先,您可以取得一批訊息(最多32則)。 其次,您可以設定較長或較短的隱性逾時,讓您的程式代碼有或多或少的時間完整處理每個訊息。

下列程式代碼範例會使用 receive_messages 方法來批次取得訊息。 然後,它會使用巢狀 for 循環來處理每個批次中的每個訊息。 它也會將不可見逾時設定為每則訊息五分鐘。

messages = queue_client.receive_messages(messages_per_page=5, visibility_timeout=5*60)

for msg_batch in messages.by_page():
   for msg in msg_batch:
      print("Batch dequeue message: " + msg.content)
      queue_client.delete_message(msg)

刪除佇列

若要刪除佇列及其中包含的所有訊息,請呼叫 delete_queue 方法。

print("Deleting queue: " + queue_client.queue_name)
queue_client.delete_queue()

小提示

試用 Microsoft Azure 儲存體總管

Microsoft Azure 儲存體總管 是一個免費的獨立應用程式,可讓您在 Windows、MacOS 和 Linux 上以視覺化方式處理 Azure 儲存體資料。

後續步驟

既然您已瞭解佇列記憶體的基本概念,請遵循這些連結以深入瞭解。

如需使用已取代 Python 第 2 版 SDK 的相關程式代碼範例,請參閱 使用 Python 第 2 版的程式代碼範例