news 2026/6/15 23:32:54

为什么不用 MCP,而用 MQTT?企业级多用户场景的通信架构选择

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
为什么不用 MCP,而用 MQTT?企业级多用户场景的通信架构选择

MCP 解决了工具连接的标准化,但在企业多用户场景下,会话隔离和权限管理这一层它没有覆盖。这篇说清楚这个问题在本方案里是怎么解决的,以及为什么选择 MQTT 作为通信骨干。

问题从哪里来

一个企业部署的 AI 工作台,同时在线的用户可能有几十个。张三在让数字员工查采购记录,李四在生成出库单,王五在分析设备维护历史。这三个会话在时间上是重叠的,在数据上是完全不同的,在权限上也可能不一样,比如张三能看采购数据,王五只能看设备数据。

这带来一系列工程要求,如会话之间的消息不能串台、每个会话的权限边界必须独立维护、Agent 的推理过程是异步的,用户发出请求之后不是同步等待一个返回值,而是等待一个可能持续几十秒甚至几分钟的流式过程等。

MCP 的主价值在工具描述和调用标准化,虽然它现在也已经支持流式传输、通知和订阅,不只是一个同步请求-响应协议。但它本身并不是为企业级多用户会话治理设计的。要在 MCP 之上实现这三个要求,仍然需要在外层补上会话管理、权限隔离和审计机制,而且这些能力通常不会由 MCP Server 自动统一提供。

MQTT 从协议设计上就是为异步消息、多客户端并发、主题隔离这类场景设计的,恰好和企业多用户场景的需求对齐。

MQTT 的基本结构

MQTT 是一个发布-订阅协议,核心概念是三个:Broker(消息代理)、Topic(主题)、Client(客户端)。

Broker 是消息中转站,所有消息都经过它流转。Client 可以发布消息到某个 Topic,也可以订阅某个 Topic 上的消息。发布者和订阅者不需要同时在线,也不需要知道对方是谁,只需要约定好 Topic 的命名规则。

Topic 是一个字符串,类似文件系统的路径格式,比如agent/session_001/inputagent/session_001/output。Broker 根据 Topic 把消息路由到对应的订阅者。

这个结构很适合表达隔离:不同会话用不同的 Topic 前缀,Broker 就能基于这个前缀做路由和授权控制。Topic 命名规则定义了隔离边界,真正让隔离生效的是客户端身份认证和 Broker 的 ACL 规则。

双链路设计

本方案里,MQTT 承载了两条独立的链路,它们对应架构里的两个不同方向的通信。

链路一:用户到 Agent。

用户在交互层发出任务请求,这条消息通过 MQTT Client 发布到一个以当前用户会话 ID 为前缀的 Topic,比如oc/user_zhang/input。Agent 订阅了这个 Topic,收到消息后开始处理。处理过程中的中间反馈和最终结果,Agent 发布到对应的输出 Topic,比如oc/user_zhang/output,交互层订阅这个 Topic,实时展示给用户。

这条链路的隔离边界由 Topic 前缀定义。张三的请求发到oc/user_zhang/input,李四的请求发到oc/user_li/input,两条消息在 Broker 里走的是独立通道。在 Topic 设计、客户端身份绑定和 ACL 配置都正确的前提下,会话串台的风险可以被压到很低。即便两个请求几乎同时到达,各自的处理过程和结果也可以保持独立。

链路二:Agent 到业务系统。

Agent 决定调用某个业务系统的接口时,不是直接发起 HTTP 请求,而是把调用指令发布到一个 Topic,业务系统侧的 MQTT Client 订阅这个 Topic,收到指令后执行实际的接口调用,把结果发布回另一个 Topic,Agent 订阅这个结果 Topic,拿到返回数据继续推理。

这条链路解决的是另一个问题:业务系统部署在内网,Agent 执行层部署在 DMZ(隔离网络),两者之间不能直接建立 HTTP 连接。在本文讨论的网络拓扑里,MQTT Broker 被放在一个内外两侧都可达的位置,内网的业务系统主动连出,DMZ 里的 Agent 也主动连出,两者通过 Broker 中转,不需要彼此直接连通。

在这种部署方式下,内网不需要为 Agent 单独开放入站端口,安全边界更容易保持清晰。

Topic 的隔离机制

Topic 隔离不只是消息不串台,它还是权限控制的基础。

MQTT Broker(比如 EMQX)支持基于 Topic 的访问控制:可以配置某个客户端只能发布或订阅哪些 Topic 前缀。张三登录工作台,系统为他分配一个会话 Token,这个 Token 对应的 MQTT Client 只能访问oc/user_zhang/*这个前缀下的 Topic。他发出去的消息只能发到这个前缀,他能收到的消息也只能来自这个前缀。即便有人恶意伪造一个请求,发到李四的 Topic,Broker 会直接拒绝,因为这个客户端没有发布到那个 Topic 的权限。

这个机制减少了在业务代码里手写会话隔离逻辑的需求,把消息级别的隔离和访问控制尽量收敛到 Broker 的认证与授权层。

异步模型的价值

Agent 处理一个复杂任务可能需要一两分钟,在这段时间里用户不应该傻等一个同步返回。MQTT 的发布-订阅模型天然是异步的——用户发出请求之后可以继续做别的事,Agent 处理完一个阶段就把中间结果发布到输出 Topic,交互层实时展示,用户看到的是一个动态更新的进度,而不是一个转圈等待的界面。

这也让"人在回路"的实现更自然。Agent 在某个决策点需要用户确认时,把问题发布到输出 Topic,交互层展示给用户,用户的回答通过输入 Topic 发回,Agent 继续。这整个过程都在同一个会话的 Topic 通道里流动,通信链路本身不需要额外设计一套同步阻塞机制,但 Agent 的任务状态、暂停点和上下文仍然需要由执行层自己维护。

同步模型在这里是反向的:如果用 HTTP 请求-响应做这件事,要么请求一直挂着等 Agent 处理完(连接超时问题),要么轮询(低效且增加服务端压力),要么 WebSocket(可以做,但需要额外管理连接状态)。MQTT 的发布-订阅模型把这些问题都绕开了。

和 MCP 是什么关系

把 MQTT 定位清楚之后,再回头看 MCP,两者的关系就清楚了。

MCP 解决的是"工具的接口怎么描述和调用"这个问题,是工具层的标准化协议。MQTT 解决的是"消息怎么在用户、Agent、业务系统之间路由和隔离"这个问题,是通信层的传输机制。

两者解决的不是同一层的问题,不是替代关系。即便未来在本方案里引入 MCP,它更适合承担的也是工具接入和能力描述这一层,而不是直接替代消息总线、会话隔离和跨网络通信骨干。技术选型应该跟着工程需求走,而不是跟着某个协议或框架的知名度走。

选 MQTT 不是因为它比 MCP 更"好",是因为它在企业多用户异步通信这个具体问题上,提供的是一个更匹配的解。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 23:22:50

终极VC++运行库一体化部署方案:告别Windows系统依赖烦恼

终极VC运行库一体化部署方案:告别Windows系统依赖烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist VisualCppRedist AIO项目为技术爱好者和系统管…

作者头像 李华
网站建设 2026/6/15 23:19:29

Kydavra相关性特征筛选:三行代码实现目标感知的冗余特征剔除

1. 项目概述:用Kydavra三行代码搞定相关性特征筛选,连Pandas DataFrame都懒得手动遍历 “Easy to use Correlation Feature Selection with Kydavra”——这个标题不是营销话术,是实打实的工程现实。我在上个月给一家做供应链需求预测的客户做…

作者头像 李华
网站建设 2026/6/15 23:18:00

Visual Studio项目丢失?UE5 C++项目依赖外部DLL的完整重建与配置指南

UE5 C项目外部DLL依赖重建全攻略:从崩溃到完美恢复 每次遇到UE5 C项目突然罢工,特别是那些依赖了外部DLL的复杂项目,开发者们总会经历一段"从绝望到重生"的心路历程。上周我的团队就遭遇了这样一场噩梦——一个集成了三个自研引擎模…

作者头像 李华
网站建设 2026/6/15 23:15:56

Java毕业设计-基于 SpringBoot 的考研学习交流生态圈平台设计与实现 面向考研群体的线上学习交流平台设计与开发(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华