Azure 存储队列 Rust SDK
适用于 Rust 的 Azure Queue Storage 库
使用场景
当你需要为 Rust 使用 Azure Queue Storage 库时,请使用此技能。它可以发送、接收和管理队列消息。触发词:"queue storage rust", "QueueClient rust", "send message rust", "receive messages rust", "QueueServiceClient rust", "queue rust"。
这是 Azure Queue Storage 的客户端库 —— 用于发送、接收和管理队列消息。
在以下场景中使用此技能:
- 应用程序需要在 Rust 中向 Azure Queue Storage 发送或接收消息
- 需要创建或管理队列
- 需要查看 (peek)、接收或删除队列消息
- 需要为队列操作使用基于 RBAC 的身份验证
> 重要提示: 仅使用由 azure-sdk crates.io 用户发布的官方 azure_storage_queue crate。请勿使用非官方或社区 crate。官方 crate 的名称中使用下划线,且没有任何一个版本号为 0.21.0。
安装
cargo add azure_storage_queue azure_identity azure_core tokio> 如果你的代码直接使用了 azure_core 类型,请将 azure_core 添加到 Cargo.toml。如果你仅使用 azure_storage_queue 重新导出的类型,则 azure_core 直接依赖项为可选。
环境变量
AZURE_STORAGE_QUEUE_ENDPOINT=https://<account>.queue.core.windows.net/ # 所有操作均需要身份验证
use azure_core::http::Url;
use azure_identity::DeveloperToolsCredential;
use azure_storage_queue::QueueServiceClient;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 本地开发:使用 DeveloperToolsCredential。生产环境:使用 ManagedIdentityCredential。
let credential = DeveloperToolsCredential::new(None)?;
let service_url = Url::parse("https://<storage_account_name>.queue.core.windows.net/")?;
let service_client = QueueServiceClient::new(service_url, Some(credential), None)?;
// 通过名称获取队列客户端。
let queue_client = service_client.queue_client("<queue_name>")?;
Ok(())
}
客户端类型
| 客户端 | 用途 | 访问方式 |
| -------------------- | ------------------------------------- | ---------------------------------------- |
| QueueServiceClient | 账户级操作,列出队列 | QueueServiceClient::new() |
| QueueClient | 队列操作,发送/接收/删除 | service_client.queue_client("<name>")? |
核心工作流
发送消息
use azure_core::http::Url;
use azure_identity::DeveloperToolsCredential;
use azure_storage_queue::{models::QueueMessage, QueueServiceClient};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let credential = DeveloperToolsCredential::new(None)?;
let service_url = Url::parse("https://<storage_account_name>.queue.core.windows.net/")?;
let service_client = QueueServiceClient::new(service_url, Some(credential), None)?;
let qu
eue_client = service_client.queue_client("<queue_name>")?;
let message = QueueMessage {
message_text: Some("hello world".to_string()),
};
queue_client.send_message(message.try_into()?, None).await?;
Ok(())
}
### 接收消息use azure_core::http::Url;
use azure_identity::DeveloperToolsCredential;
use azure_storage_queue::QueueServiceClient;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let credential = DeveloperToolsCredential::new(None)?;
let service_url = Url::parse("https://<storage_account_name>.queue.core.windows.net/")?;
let service_client = QueueServiceClient::new(service_url, Some(credential), None)?;
let queue_client = service_client.queue_client("<queue_name>")?;
let response = queue_client.receive_messages(None).await?;
let messages = response.into_model()?;
for msg in messages.items.unwrap_or_default() {
println!("{}", msg.message_text.as_deref().unwrap_or("<empty>"));
}
Ok(())
}
### 删除消息
接收消息后,使用消息 ID 和弹出收据(pop receipt)将其删除:
let response = queue_client.receive_messages(None).await?;
let messages = response.into_model()?;
for msg in messages.items.unwrap_or_default() {
if let (Some(id), Some(pop_receipt)) = (&msg.message_id, &msg.pop_receipt) {
queue_client.delete_message(id, pop_receipt, None).await?;
}
}
### 窥视消息
在不将消息从队列中移除的情况下查看消息:
let response = queue_client.peek_messages(None).await?;
let messages = response.into_model()?;
for msg in messages.items.unwrap_or_default() {
println!("Peeked: {}", msg.message_text.as_deref().unwrap_or("<empty>"));
}
``
RBAC 角色
对于 Entra ID 认证,请为标识分配以下角色之一:
| 角色 | 访问权限 |
| -------------------------------------- | ---------------------- |
|
Storage Queue Data Reader | 读取和窥视消息 |
| Storage Queue Data Contributor | 读取/写入消息 |
| Storage Queue Data Message Sender | 仅发送消息 |
| Storage Queue Data Message Processor | 接收和删除消息 |
最佳实践
1. 使用
cargo add 管理依赖,不要直接编辑 Cargo.toml。 使用 cargo 命令添加或删除 Rust SDK 依赖,而非手动编辑清单文件。
2. 仅在直接导入 azure_core 类型时才添加 azure_core。 如果代码中导入了 azure_core::http::Url、azure_core::http::RequestContent 或 azure_core::error::ErrorKind,请包含 azure_core;否则,直接依赖项是可选的。
3. 本地开发使用 DeveloperToolsCredential,生产环境使用 ManagedIdentityCredential —— Rust 尚未提供统一的 DefaultAzureCredential 类型。
4. 切勿硬编码凭据 —— 请使用环境变量或托管标识。
5. 分配 RBAC 角色 —— 确保标识拥有适当的队列数据角色。
6. 将 QueueServiceClient 作为入口点,并通过 queue_client() 方法获取 QueueClient。
7. 处理后删除消息 —— 使用 receive_messages` 返回的消息 ID 和弹出收据进行删除。8. 复用客户端 —— 客户端是线程安全的;创建一次后即可在多个任务间共享。
参考链接
| 资源 | 链接 |
| ------------- | -----------------------------------------------------------
-------------------------- |
| API 参考 | https://docs.rs/crate/azure_storage_queue/latest |
| crates.io | https://crates.io/crates/azure_storage_queue |
| 源代码 | https://github.com/Azure/azure-sdk-for-rust/tree/main/sdk/storage/azure_storage_queue |
局限性
- 仅在任务与上游源码及本地项目上下文明确匹配时使用此技能。
- 在应用更改前,请验证命令、生成的代码、依赖项、凭据以及外部服务的行为。
- 不要将示例视为环境特定测试、安全审查或破坏性/高成本操作用户确认的替代方案。