MCP Server 三种传输协议深入分析:SSE、Streamable、Stateless
·
MCP Server 三种传输协议深入分析:SSE、Streamable、Stateless
写在前面
MCP(Model Context Protocol)在传输层支持三种协议:SSE、Streamable HTTP 和 Stateless HTTP。这三种协议各有特点,适用于不同场景。
一句话概括
| 协议 | 特点 | 适用场景 |
|---|---|---|
| SSE | 长连接、服务器推送 | 实时推送、简单工具调用 |
| Streamable | 流式响应、双向通信 | 复杂交互、需要流式输出 |
| Stateless | 无状态、简单直接 | 纯请求响应、微服务 |
1. SSE(Server-Sent Events)
原理
SSE 是基于 HTTP 的单向通信协议,服务器主动推送给客户端。
特点
- 单向通信:只能服务器 → 客户端
- 持久连接:一次连接,多次推送
- 自动重连:浏览器自动处理
- 简单:基于标准 HTTP,不需要 WebSocket
缺点
- 单向:客户端无法在连接中发送新请求
- 只支持文本:二进制数据不方便
- 并发限制:浏览器对单域名并发连接数有限制
适用场景
- 简单的工具调用
- 只需要从服务器获取结果
- 实时日志推送
2. Streamable HTTP(流式 HTTP)
原理
Streamable HTTP 是双向流式通信,支持在单个 HTTP 连接上进行多次请求响应,并且支持流式输出。
特点
- 双向通信:客户端和服务器可以在一个连接中交互
- 流式响应:支持 chunked transfer encoding,边算边返回
- 状态管理:可以在连接中保持会话状态
- 低延迟:流式返回,不用等全部结果
缺点
- 复杂度高:需要处理流式数据
- 资源占用:长连接占用服务器资源
- 调试困难:流式数据不好调试
适用场景
- LLM 响应流式输出(打字机效果)
- 复杂的多轮对话
- 需要实时反馈的场景
简单理解
- Stateless = 发短信 → 等回复 → 结束
- Streamable = 打电话 → 双方实时交流 → 说完才挂
3. Stateless HTTP(无状态 HTTP)
原理
Stateless HTTP 就是传统的请求-响应模式,每次请求都是独立的,不保持连接状态。
特点
- 简单:最传统的 HTTP 模式,容易理解
- 可扩展:无状态,易于水平扩展
- 资源友好:不占用长连接资源
- 天然适合微服务:负载均衡器可以直接路由
缺点
- 无状态:每次请求都要带全上下文
- 延迟高:每次都要建立新连接
- 不支持实时推送:只能轮询
适用场景
- 简单的工具调用
- 微服务架构
- 对性能要求不高的场景
三种协议对比
| 特性 | SSE | Streamable | Stateless |
|---|---|---|---|
| 连接类型 | 长连接 | 长连接 | 短连接 |
| 通信方向 | 单向 | 双向 | 双向 |
| 流式支持 | 部分 | 完全支持 | 不支持 |
| 状态保持 | 会话级 | 会话级 | 无状态 |
| 复杂度 | 低 | 中 | 低 |
| 资源占用 | 中 | 高 | 低 |
| 扩展性 | 一般 | 较差 | 优秀 |
| 实时性 | 推送 | 推送/流式 | 轮询 |
怎么选?
选 SSE
- 简单工具调用
- 只需要服务器推送结果
- 不想用 WebSocket 又需要实时性
选 Streamable
- LLM 流式输出(打字机效果)
- 复杂交互,需要在一个会话中多次往来
- 对实时性要求高
选 Stateless
- 微服务架构
- 简单请求-响应
- 需要高扩展性
- 容器化部署(无状态好调度)
Spring AI 中的选择
Spring AI MCP 默认使用 SSE 模式,因为:
- 实现简单,生态成熟
- 足够满足大部分场景
- 调试方便(curl 就能测试)
写在最后
MCP 的三种传输协议,本质上是在实时性和简单性之间做权衡:
- Stateless = 简单直接,但不够实时
- SSE = 能推送,但只能单向
- Streamable = 最强,但最复杂
根据你的业务场景选择合适的协议,别过度设计。
更多推荐
所有评论(0)