用途
Azure Queue Storage Python SDK 提供简单、低成本的消息队列能力,用于异步通信、可靠的消息排队与任务分发。该技能面向需要在 Python 应用中接入 Azure 队列存储的场景。
安装与环境变量
安装命令:
pip install azure-storage-queue azure-identity
环境变量示例:
AZURE_STORAGE_ACCOUNT_URL=https://<account>.queue.core.windows.net
身份验证
使用 DefaultAzureCredential 进行身份验证,并创建服务客户端与队列客户端:
from azure.identity import DefaultAzureCredential
from azure.storage.queue import QueueServiceClient, QueueClient
credential = DefaultAzureCredential()
account_url = "https://<account>.queue.core.windows.net"
# Service client
service_client = QueueServiceClient(account_url=account_url, credential=credential)
# Queue client
queue_client = QueueClient(account_url=account_url, queue_name="myqueue", credential=credential)
主要能力
队列操作
# Create queue
service_client.create_queue("myqueue")
# Get queue client
queue_client = service_client.get_queue_client("myqueue")
# Delete queue
service_client.delete_queue("myqueue")
# List queues
for queue in service_client.list_queues():
print(queue.name)
发送消息
# Send message (string)
queue_client.send_message("Hello, Queue!")
# Send with options
queue_client.send_message(
content="Delayed message",
visibility_timeout=60, # Hidden for 60 seconds
time_to_live=3600 # Expires in 1 hour
)
# Send JSON
import json
data = {"task": "process", "id": 123}
queue_client.send_message(json.dumps(data))
接收消息
# Receive messages (makes them invisible temporarily)
messages = queue_client.receive_messages(
messages_per_page=10,
visibility_timeout=30 # 30 seconds to process
)
for message in messages:
print(f"ID: {message.id}")
print(f"Content: {message.content}")
print(f"Dequeue count: {message.dequeue_count}")
# Process message...
# Delete after processing
queue_client.delete_message(message)
查看消息(Peek)
# Peek without hiding (doesn't affect visibility)
messages = queue_client.peek_messages(max_messages=5)
for message in messages:
print(message.content)
更新消息
# Extend visibility or update content
messages = queue_client.receive_messages()
for message in messages:
# Extend timeout (need more time)
queue_client.update_message(
message,
visibility_timeout=60
)
# Update content and timeout
queue_client.update_message(
message,
content="Updated content",
visibility_timeout=60
)
删除消息
# Delete after successful processing
messages = queue_client.receive_messages()
for message in messages:
try:
# Process...
queue_client.delete_message(message)
except Exception:
# Message becomes visible again after timeout
pass
清空队列
# Delete all messages
queue_client.clear_messages()
队列属性与元数据
# Get queue properties
properties = queue_client.get_queue_properties()
print(f"Approximate message count: {properties.approximate_message_count}")
# Set/get metadata
queue_client.set_queue_metadata(metadata={"environment": "production"})
properties = queue_client.get_queue_properties()
print(properties.metadata)
异步客户端
from azure.storage.queue.aio import QueueServiceClient, QueueClient
from azure.identity.aio import DefaultAzureCredential
async def queue_operations():
credential = DefaultAzureCredential()
async with QueueClient(
account_url="https://<account>.queue.core.windows.net",
queue_name="myqueue",
credential=credential
) as client:
# Send
await client.send_message("Async message")
# Receive
async for message in client.receive_messages():
print(message.content)
await client.delete_message(message)
import asyncio
asyncio.run(queue_operations())
Base64 编码
from azure.storage.queue import QueueClient, BinaryBase64EncodePolicy, BinaryBase64DecodePolicy
# For binary data
queue_client = QueueClient(
account_url=account_url,
queue_name="myqueue",
credential=credential,
message_encode_policy=BinaryBase64EncodePolicy(),
message_decode_policy=BinaryBase64DecodePolicy()
)
# Send bytes
queue_client.send_message(b"Binary content")
使用方式
通过 pip 安装 SDK 与 azure-identity,配置 AZURE_STORAGE_ACCOUNT_URL 环境变量,使用 DefaultAzureCredential 创建 QueueServiceClient 或 QueueClient,然后调用上述方法完成队列的创建、消息的发送/接收/查看/更新/删除、队列清空以及属性与元数据管理。高吞吐场景可使用异步客户端。
适用场景
适用于需要可靠消息排队、任务分发与异步处理的 Python 应用。
最佳实践
- 处理完成后删除消息,防止重复处理
- 根据处理时间设置合适的可见性超时
- 利用 dequeue_count 检测毒消息
- 高吞吐场景使用异步客户端
- 使用 peek_messages 进行监控而不影响队列
- 设置 time_to_live 防止消息过期残留
- 需要高级功能(会话、主题)时考虑 Service Bus
限制
- 仅当任务明确匹配上述范围时使用该技能。
- 不应将输出视为环境特定验证、测试或专家评审的替代。
- 如果缺少必需的输入、权限、安全边界或成功标准,应停止并请求澄清。