使用 Rust 接入 Azure Service Bus:agentic-awesome-skills 官方技能中的队列、主题与可靠消息收发实战指南
  • AI 技能
  • AI 插件
  • 人工智能

【免费下载链接】agentic-awesome-skills

AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600+ agentic skills. Includes CLI, local MCP, catalog, plugins, and Workbench.

项目地址:https://gitcode.com/GitHub_Trending/an/agentic-awesome-skills
点击查看免费下载

导读

本文以 agentic-awesome-skills 仓库中收录的官方技能文档 azure-servicebus-rust 为主体,系统讲解如何用 Rust 通过官方azure_messaging_servicebuscrate 接入 Azure Service Bus,实现基于队列的点对点消息与基于主题/订阅的发布-订阅消息。读完本文,你将掌握从依赖安装、Entra ID 认证、发送/接收消息到消息结算(complete/abandon)与 RBAC 授权的完整落地路径,并理解该 SDK 目前处于早期开发阶段这一关键前提。

技能定位与使用场景

该技能对应微软官方 Skills 仓库中azure-sdk-rust插件下的同名技能,source_type 标注为official,风险等级为critical,日期为 2026-07-01。其触发词包括"service bus rust"、"ServiceBusClient rust"、"send message servicebus rust"、"receive message servicebus rust"、"queue rust messaging"、"topic subscription rust"。

适用场景非常明确:

  • 应用需要从 Rust 中通过 Azure Service Bus 发送或接收消息;
  • 需要基于队列的点对点消息,配合竞争消费者(competing consumers)模型;
  • 需要基于主题和订阅的发布-订阅消息,实现一对多扇出;
  • 需要具备完成语义(completion semantics)的可靠消息投递。

⚠️重要警告:该 crate 正处于早期开发阶段,不应在生产环境中使用,API 可能在没有通知的情况下发生变化。任何引入该依赖的工程都需要接受这一风险,并通过固定版本号来约束升级。

⚠️包来源约束:只能使用由 crates.io 上 azure-sdk 用户发布的官方azure_messaging_servicebuscrate,不要使用非官方或社区 crate。官方 crate 均使用下划线命名,且没有任何官方 crate 的版本是 0.21.0——这是甄别山寨包的重要信号。

安装与依赖管理

技能文档明确要求通过cargo add管理依赖,永远不要直接手改Cargo.toml:

cargo add azure_messaging_servicebus azure_identity tokio

依赖取舍要点:

  • 如果代码中直接使用了azure_core的类型(例如azure_core::http::Url、azure_core::http::RequestContent、azure_core::error::ErrorKind),需要额外cargo add azure_core;
  • 如果只使用azure_messaging_servicebus重导出的类型,则azure_core的直接依赖是可选的;
  • azure_identity提供全部认证凭据类型,tokio为异步运行时,二者均为必选项。

环境变量与命名空间

使用 Entra ID(原 Azure AD)认证时,唯一的必需环境变量是命名空间:

SERVICEBUS_NAMESPACE=<namespace>.servicebus.windows.net # Required — fully qualified namespace

<namespace>.servicebus.windows.net是全限定命名空间主机名,Service Bus 客户端通过该主机名定位到命名空间下的全部消息组件。

若使用服务主体(Service Principal)认证,可参考同仓库 azure-identity-rust 技能补充以下环境变量:

# Service Principal(生产/CI 环境) AZURE_TENANT_ID=<your-tenant-id> AZURE_CLIENT_ID=<your-client-id> AZURE_CLIENT_SECRET=<your-client-secret> # 用户分配托管身份(可选) AZURE_CLIENT_ID=<managed-identity-client-id>

关键概念

概念说明
Namespace所有消息组件的容器,是连接与管理的边界
Queue点对点消息,支持竞争消费者(一个消息只被一个消费者处理)
Topic发布-订阅消息——一个发送者,多个订阅者
Subscription从主题接收消息的实体,每个订阅独立获得消息副本
Message数据与元数据的封装,具有完成(complete)/放弃(abandon)语义

理解这四个实体的关系是使用本技能的前提:Queue 适合任务分发与负载均衡;Topic + Subscription 适合事件广播与扇出(fan-out)场景——当多个消费者需要同一份消息时,应选择主题而非队列。

认证:从本地开发到生产

该 SDK 采用与 azure-sdk-for-rust 一致的凭据模型。技能文档强调:Rust 没有单一的DefaultAzureCredential类型,因此本地开发使用DeveloperToolsCredential,生产环境使用ManagedIdentityCredential。

use azure_identity::DeveloperToolsCredential; use azure_messaging_servicebus::ServiceBusClient; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { // Local dev: DeveloperToolsCredential. Production: use ManagedIdentityCredential. let credential = DeveloperToolsCredential::new(None)?; let client = ServiceBusClient::builder() .open("your_namespace.servicebus.windows.net", credential.clone()) .await?; Ok(()) }

凭据链与凭据类型

据同仓库 azure-identity-rust 技能文档,DeveloperToolsCredential会按固定顺序尝试开发者工具:

顺序凭据环境要求
1AzureCliCredential已执行az login
2AzureDeveloperCliCredential已执行azd auth login

完整的凭据类型覆盖了本地、Azure 托管资源与 CI 等全部场景:

凭据适用场景
DeveloperToolsCredential本地开发,自动尝试 CLI 工具
ManagedIdentityCredentialAzure VM、App Service、Functions、AKS 等托管资源
WorkloadIdentityCredentialKubernetes 工作负载身份
ClientSecretCredential使用密钥的服务主体
ClientCertificateCredential使用证书的服务主体
AzureCliCredential直接使用 Azure CLI 认证
AzureDeveloperCliCredential直接使用 azd CLI 认证
AzurePipelinesCredentialAzure Pipelines 服务连接
ClientAssertionCredential自定义断言(联合身份)

生产环境使用托管身份的写法:

use azure_identity::ManagedIdentityCredential; // 系统分配托管身份 let credential = ManagedIdentityCredential::new(None)?; // 用户分配托管身份 let options = ManagedIdentityCredentialOptions { client_id: Some("<user-assigned-mi-client-id>".into()), ..Default::default() }; let credential = ManagedIdentityCredential::new(Some(options))?;

若采用服务主体 + 密钥(适合无托管身份的 CI 场景):

use azure_identity::ClientSecretCredential; let credential = ClientSecretCredential::new( "<tenant-id>".into(), "<client-id>".into(), "<client-secret>".into(), None, )?;

凭据是Arc包裹的,clone 成本极低,同一凭据实例可复用于多个客户端(Service Bus、Event Hubs、Cosmos DB 等),这是 azure-sdk-for-rust 的统一约定。

核心工作流:队列消息收发

向队列发送消息

use azure_identity::DeveloperToolsCredential; use azure_messaging_servicebus::{ServiceBusClient, Message}; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let credential = DeveloperToolsCredential::new(None)?; let client = ServiceBusClient::builder() .open("your_namespace.servicebus.windows.net", credential.clone()) .await?; let sender = client.create_sender("my_queue", None).await?; let message = Message::from("Hello, Service Bus!"); sender.send_message(message, None).await?; Ok(()) }

关键点:create_sender("my_queue", None)返回Sender句柄;Message::from从字符串构造消息;send_message第二个参数为可选选项(此处传None)。

从队列接收消息

use azure_identity::DeveloperToolsCredential; use azure_messaging_servicebus::ServiceBusClient; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let credential = DeveloperToolsCredential::new(None)?; let client = ServiceBusClient::builder() .open("your_namespace.servicebus.windows.net", credential.clone()) .await?; let receiver = client.create_receiver("my_queue", None).await?; let messages = receiver.receive_messages(5, None).await?; for message in messages { println!("Received: {}", message.body_as_string()?); receiver.complete_message(&message, None).await?; } Ok(()) }

receive_messages(5, None)一次性拉取至多 5 条消息;body_as_string()解码消息体;处理成功后必须调用complete_message,否则消息会被重新投递。

核心工作流:主题与订阅

向主题发送消息

let sender = client.create_sender("my_topic", None).await?; let message = Message::from("Hello, Topic subscribers!"); sender.send_message(message, None).await?;

发送到主题与发送到队列的 API 完全一致,区别仅在于目标实体:发送到主题后,该消息会被投递到主题下每个订阅的独立副本中。

从订阅接收消息

let receiver = client .create_receiver_for_subscription("my_topic", "my_subscription", None) .await?; let messages = receiver.receive_messages(5, None).await?; for message in messages { println!("Received: {}", message.body_as_string()?); receiver.complete_message(&message, None).await?; }

接收订阅消息使用create_receiver_for_subscription,需要同时指定主题名与订阅名。循环内的complete_message语义与队列接收完全一致。

消息结算(Message Settlement)

动作用途
complete从队列/订阅移除消息——处理成功
abandon释放锁——消息重新变为可投递,用于重试

务必在成功处理之后完成(complete)消息,以防止重复投递。abandon 场景则用于处理失败时主动交还消息,让其他消费者重试。

RBAC 角色与授权

使用 Entra ID 认证时,需要为身份(用户、服务主体或托管身份)分配以下数据平面角色之一:

角色访问权限
Azure Service Bus Data Sender发送消息
Azure Service Bus Data Receiver接收消息
Azure Service Bus Data Owner完整访问

最小权限原则下:只发送就分配 Data Sender,只接收就分配 Data Receiver,避免直接使用 Data Owner。与 Event Hubs 等其他 Azure 消息服务的 RBAC 模型保持一致,可在 Azure 门户的命名空间"访问控制 (IAM)"中完成分配。

最佳实践清单

技能文档给出 8 条最佳实践,逐条展开如下:

  1. 用cargo add管理依赖,不要直接编辑Cargo.toml。添加/移除 Rust SDK 依赖一律通过 cargo 命令,避免手改清单导致版本漂移或依赖图损坏。
  2. 仅在直接导入azure_core类型时才添加azure_core依赖。判断标准是代码中是否出现azure_core::http::Url、azure_core::http::RequestContent、azure_core::error::ErrorKind等路径;否则直接依赖可选。
  3. 本地开发用DeveloperToolsCredential,生产用ManagedIdentityCredential。Rust 生态没有DefaultAzureCredential单类型方案,必须按环境显式选择。
  4. 绝不硬编码凭据——使用环境变量或托管身份。
  5. 分配 RBAC 角色——确保身份具备恰当的 Service Bus 数据角色(见上节)。
  6. 总是完成消息——处理完成后调用complete_message,将消息从队列/订阅移除,防止重复投递。
  7. 扇出场景用主题——当多个消费者需要同一份消息时,使用主题 + 订阅而非队列。
  8. 该 crate 处于预发布阶段——API 可能变动,务必在依赖工作流中固定依赖版本(pin version)。

参考资源

  • API 参考:azure_messaging_servicebus的 docs.rs 最新文档(对应 crate 名称azure_messaging_servicebus);
  • 发布页面:crates.io 上的azure_messaging_servicebus页面,注意甄别发布者为 azure-sdk 用户;
  • 源码:Azure/azure-sdk-for-rust 仓库的sdk/servicebus/azure_messaging_servicebus目录。

在 agentic-awesome-skills 仓库中,本文所依据的技能文件位于 azure-servicebus-rust/SKILL.md,与之配套的认证技能 azure-identity-rust 提供了完整的凭据体系说明;同为消息家族的 azure-eventhub-rust 与数据库客户端 azure-cosmos-rust 展示了 azure-sdk-for-rust 统一的"凭据 + 客户端 builder/open"使用模式,可交叉参考。

使用限制与注意事项

  • 仅在任务与技能的上游来源及本地项目上下文明确匹配时使用本技能;
  • 应用改动前,务必验证命令、生成的代码、依赖、凭据及外部服务行为;
  • 不要将示例当作环境特定测试、安全审查或对破坏性/高成本操作的用户批准的替代品;
  • 再次强调:当前 crate 处于早期开发阶段,引入生产系统前需充分评估 API 稳定性风险并固定版本。
  • AI 技能
  • AI 插件
  • 人工智能

【免费下载链接】agentic-awesome-skills

AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600+ agentic skills. Includes CLI, local MCP, catalog, plugins, and Workbench.

项目地址:https://gitcode.com/GitHub_Trending/an/agentic-awesome-skills
点击查看免费下载
上一篇:ILLA Builder表单提交体验优化:加载状态与成功反馈
下一篇:终极DNS反向解析指南:使用dig -x命令快速查询IP对应的域名

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

WPF实时相机显示:DispatcherTimer与Halcon集成实战

WPF实时相机显示:DispatcherTimer与Halcon集成实战

1. 为什么要在WPF里用DispatcherTimer做实时相机显示做过机器视觉上位机的人都有一个共识&#xff1a;相机取图这件事&#xff0c;最怕的不是算法跑不动&#xff0c;而是界面卡死。你辛辛苦苦把Halcon的算子调通了&#xff0c;图像处理结果也对了&#xff0c;结果一开实时预览&…

2026/10/21 3:49:31 阅读更多 →
BrewUI:Homebrew 官方图形界面完整指南

BrewUI:Homebrew 官方图形界面完整指南

BrewUI&#xff1a;Homebrew 官方图形界面完整指南 【免费下载链接】BrewUI &#x1f4fa; Homebrews official macOS GUI 项目地址: https://gitcode.com/GitHub_Trending/br/BrewUI Mac 上装软件长期有两条路&#xff1a;把 .dmg 拖进 Applications&#xff0c;或在终…

2026/10/21 3:49:31 阅读更多 →
AI编程五维协作范式:Vibe/Plan/Glue/Spec/Smell实战指南

AI编程五维协作范式:Vibe/Plan/Glue/Spec/Smell实战指南

1. 这不是新概念堆砌&#xff0c;而是AI编程的“操作手册”级分层认知你有没有过这种体验&#xff1a;刚学完一个AI编码工具&#xff0c;发现它在另一个项目里完全不灵&#xff1b;看了十篇“AI编程最佳实践”&#xff0c;落地时还是卡在“到底该让AI写什么、怎么写、写到哪一步…

2026/10/21 3:48:31 阅读更多 →

最新新闻

Buck-Boost变换器仿真设计:从开环计算到闭环补偿

Buck-Boost变换器仿真设计:从开环计算到闭环补偿

最近在做某车载电源项目时&#xff0c;需要把一个波动范围很宽的电池电压&#xff08;9V到16V&#xff09;稳定成5V输出&#xff0c;给传感器电路供电。输入可能比输出高&#xff0c;也可能比输出低&#xff0c;普通的Buck或Boost拓扑都搞不定&#xff0c;只能上Buck-Boost。而…

2026/10/21 7:19:55 阅读更多 →
卫星图像降雨预测实战:从数据对齐到模型部署的完整技术路线

卫星图像降雨预测实战:从数据对齐到模型部署的完整技术路线

卫星图像预测降雨&#xff0c;听起来像是一个标准计算机视觉任务&#xff1a;数据是云图&#xff0c;标签是雨量&#xff0c;训练一个分割模型就完事。我第一次接触这类需求时也是这么想的&#xff0c;真到动手才发现&#xff0c;模型反而是整个链条里最不费心思的部分&#xf…

2026/10/21 7:19:55 阅读更多 →
AI Agent编排层故障排查:上下文窗口、工具调用与稳定性的工程实践

AI Agent编排层故障排查:上下文窗口、工具调用与稳定性的工程实践

很长一段时间里&#xff0c;我都在围绕 AI Agent 的编排层做工作&#xff0c;也就是圈子里常说的 Agent Harness Engineering。这个环节介于模型能力和业务场景之间&#xff0c;干的是工具注册、上下文管理、状态流转、调用编排这些不怎么光鲜、但是决定系统能不能真正跑起来的…

2026/10/21 7:19:55 阅读更多 →
基于PyTorch的时空预测模型复现:图卷积与时间卷积工程实践

基于PyTorch的时空预测模型复现:图卷积与时间卷积工程实践

简介&#xff1a;这是一份面向时空预测模型研究与PyTorch进阶学习者的PyTorch复现代码包。针对交通流量、气象等序列预测场景&#xff0c;资源将多个论文模型拆解为内聚的小Module再组装&#xff0c;便于读者对照公式与图示理解结构&#xff0c;并适配(batch, sequence, channe…

2026/10/21 7:19:55 阅读更多 →
AI威胁检测实战指南:从数据治理到模型落地的全链路解析

AI威胁检测实战指南:从数据治理到模型落地的全链路解析

今年一直在折腾一套东西&#xff1a;把AI和大数据技术揉进安全检测里&#xff0c;做智能威胁检测。说白了&#xff0c;就是让机器自己去流量、日志里找坏人&#xff0c;别总靠人肉盯。这个方向最近特别火&#xff0c;但真正落地过的人都知道&#xff0c;里面坑多水深&#xff0…

2026/10/21 7:19:55 阅读更多 →
寒区块石路基水热力耦合与冻胀变形的COMSOL模拟要诀

寒区块石路基水热力耦合与冻胀变形的COMSOL模拟要诀

一提到寒区路基&#xff0c;干这行的人第一反应通常都是那六个字——冻胀、融沉、翻浆。我前两年接了一个某寒区道路工程的数值评估任务&#xff0c;核心就是把一段块石路基的水热力耦合行为在COMSOL里算清楚&#xff0c;最后落到冻胀变形预测上。这类项目看着是纯仿真&#xf…

2026/10/21 7:18:55 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →