MCP 协议:为什么 Streamable HTTP 是最佳选择?

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
容器镜像服务 ACR,镜像仓库100个 不限时长
云原生网关 MSE Higress,422元/月
简介: 随着AI应用变得越来越复杂并被广泛部署,原有的通信机制面临着一系列挑战。近期MCP仓库的PR #206引入了一个全新的Streamable HTTP传输层替代原有的HTTP+SSE传输层。本文将详细分析该协议的技术细节和实际优势。

1.gif

MCP(Model Context Protocol)协议是一个用于 AI 模型和工具之间通信的标准协议。随着 AI 应用变得越来越复杂并被广泛部署,原有的通信机制面临着一系列挑战。近期 MCP 仓库的 PR #206【1】 引入了一个全新的 Streamable HTTP 传输层替代原有的 HTTP+SSE 传输层。本文将详细分析该协议的技术细节和实际优势。


要点速览


  • Streamable HTTP 相比 HTTP + SSE 具有更好的稳定性,在高并发场景下表现更优。
  • Streamable HTTP 在性能方面相比 HTTP + SSE 具有明显优势,响应时间更短且更稳定。
  • Streamable HTTP 客户端实现相比 HTTP + SSE 更简单,代码量更少,维护成本更低。


为什么选择 Streamable HTTP?


HTTP + SSE 存在的问题


HTTP+SSE 的传输过程实现中,客户端和服务器通过两个主要渠道进行通信:(1)HTTP 请求/响应:客户端通过标准的 HTTP 请求向服务器发送消息。(2)服务器发送事件(SSE):服务器通过专门的 /sse 端点向客户端推送消息,这就导致存在下面三个问题:

  • 服务器必须维护长连接,在高并发情况下会导致显著的资源消耗。
  • 服务器消息只能通过 SSE 传递,造成了不必要的复杂性和开销。
  • 基础架构兼容性,许多现有的网络基础架构可能无法正确处理长期的 SSE 连接。企业防火墙可能会强制终止超时连接,导致服务不可靠。


Streamable HTTP 的改进

Streamable HTTP 是 MCP 协议的一次重要升级,通过下面的改进解决了原有 HTTP + SSE 传输方式的多个关键问题:

  • 统一端点:移除了专门建立连接的 /sse 端点,将所有通信整合到统一的端点。
  • 按需流式传输:服务器可以灵活选择返回标准 HTTP 响应或通过 SSE 流式返回。
  • 状态管理:引入 session 机制以支持状态管理和恢复。


HTTP + SSE vs Streamable HTTP

下面通过实际应用场景中稳定性,性能和客户端复杂度三个角度对比说明 Streamable HTTP 相比 HTTP + SSE 的优势,AI 网关 Higress 目前已经支持了 Streamable HTTP 协议,通过 MCP 官方 Python SDK 的样例 Server 部署了一个 HTTP + SSE 协议的 MCP Server,通过 Higress 部署了一个 Streamable HTTP 协议的 MCP Server。

稳定性对比

TCP 连接数对比


利用 Python 程序模拟 1000 个用户同时并发访问远程的 MCP Server 并调用获取工具列表,图中可以看出 SSE Server 的 SSE 连接无法复用且需要长期维护,高并发的需求也会带来 TCP 连接数的突增,而 Streamable HTTP 协议则可以直接返回响应,多个请求可以复用同一个 TCP 连接,TCP 连接数最高只到几十条,并且整体执行时间也只有 SSE Server 的四分之一。

在 1000 个并发用户的测试场景下,Higress 部署的 Streamable HTTP 方案的 TCP 连接数明显低于 HTTP + SSE 方案:

  • HTTP + SSE:需要维持大量长连接,TCP连接数随时间持续增长
  • Streamable HTTP:按需建立连接,TCP连接数维持在较低水平


请求成功率对比


实际应用场景中进程级别通常会限制最大连接数,linux 默认通常是 1024。利用 Python 程序模拟不同数量的用户访问远程的 MCP Server 并调用获取工具列表,SSE Server 在并发请求数到达最大连接数限制后,成功率会极速下降,大量的并发请求无法建立新的 SSE 连接而访问失败。

在不同并发用户数下的请求成功率测试中,Higress 部署的 Streamable HTTP 的成功率显著高于 HTTP + SSE 方案:

  • HTTP + SSE:随着并发用户数增加,成功率显著下降
  • Streamable HTTP:即使在高并发场景下仍能保持较高的请求成功率


性能对比


这里对比的是社区 Python 版本的 GitHUB MCP Server【2】 和 Higress MCP 市场的 GitHUB MCP Server

利用 Python 程序模拟不同数量的用户同时并发访问远程的 MCP Server 并调用获取工具列表,并统计调用返回响应的时间,图中给出的响应时间对比为对数刻度,SSE Server 在并发用户数量较多时平均响应时间会从 0.0018s 显著增加到 1.5112s,而 Higress 部署的 Streamable HTTP Server 则依然维持在 0.0075s 的响应时间,也得益于 Higress 生产级的性能相比于 Python Starlette 框架。

性能测试结果显示,Higress 部署的 Streamable HTTP 在响应时间方面具有明显优势:

  • Streamable HTTP 的平均响应时间更短,响应时间波动较小,随并发用户数增加,响应时间增长更平
  • HTTP + SSE 的平均响应时间更长,在高并发场景下响应时间波动较大


客户端复杂度对比


Streamable HTTP 支持无状态的服务和有状态的服务,目前的大部分场景无状态的 Streamable HTTP 的可以解决,通过对比两种传输方案的客户端实现代码,可以直观地看到无状态的 Streamable HTTP 的客户端实现简洁性。


HTTP + SSE 客户端样例代码


class SSEClient:
    def __init__(self, url: str, headers: dict = None):
        self.url = url
        self.headers = headers or {}
        self.event_source = None
        self.endpoint = None

        async def connect(self):
            # 1. 建立 SSE 连接
            async with aiohttp.ClientSession(headers=self.headers) as session:
                self.event_source = await session.get(self.url)

                # 2. 处理连接事件
                print('SSE connection established')

                # 3. 处理消息事件
                async for line in self.event_source.content:
                    if line:
                        message = json.loads(line)
                        await self.handle_message(message)

                        # 4. 处理错误和重连
                        if self.event_source.status != 200:
                            print(f'SSE error: {self.event_source.status}')
                            await self.reconnect()

        async def send(self, message: dict):
            # 需要额外的 POST 请求发送消息
            async with aiohttp.ClientSession(headers=self.headers) as session:
                async with session.post(self.endpoint, json=message) as response:
                    return await response.json()

                async def handle_message(self, message: dict):
                    # 处理接收到的消息
                    print(f'Received message: {message}')

    async def reconnect(self):
        # 实现重连逻辑
        print('Attempting to reconnect...')
        await self.connect()

Streamable HTTP 客户端样例代码


class StreamableHTTPClient:
    def __init__(self, url: str, headers: dict = None):
        self.url = url
        self.headers = headers or {}
        
    async def send(self, message: dict):
        # 1. 发送 POST 请求
        async with aiohttp.ClientSession(headers=self.headers) as session:
            async with session.post( self.url, json=message,
                headers={'Content-Type': 'application/json'}
            ) as response:
                # 2. 处理响应
                if response.status == 200:
                    return await response.json()
                else:
                    raise Exception(f'HTTP error: {response.status}')


从代码对比可以看出:

1. 复杂度:Streamable HTTP 无需处理连接维护、重连等复杂逻辑

2. 可维护性:Streamable HTTP 代码结构更清晰,更易于维护和调试

3. 错误处理:Streamable HTTP 的错误处理更直接,无需考虑连接状态


【1】PR #206https://github.com/modelcontextprotocol/modelcontextprotocol/pull/206


【2】GitHUB MCP Serverhttps://github.com/modelcontextprotocol/servers/tree/main/src/github

目录
打赏
0
3
4
1
12729
分享
相关文章
MCP协议重大升级,Spring AI Alibaba联合Higress发布业界首个Streamable HTTP实现方案
本文由Spring AI Alibaba Contributor刘军、张宇撰写,探讨MCP官方引入的全新Streamable HTTP传输层对原有HTTP+SSE机制的重大改进。文章解析Streamable HTTP的设计思想与技术细节,并介绍Spring AI Alibaba开源框架提供的Java实现,包含无状态服务器模式、流式进度反馈模式等多种场景的应用示例。同时,文章还展示了Spring AI Alibaba + Higress的完整可运行示例,分析当前实现限制及未来优化方向,为开发者提供参考。
利用HTTP POST协议实现简单的RPC协议:WireShark抓包分析
通过这种方式,我们可以使用HTTP POST实现简单的RPC协议,并使用WireShark进行抓包分析。这不仅可以帮助我们理解RPC协议的工作原理,也可以帮助我们调试和优化我们的代码。
47 30
|
14天前
|
利用HTTP POST协议实现简单的RPC协议,并使用WireShark进行抓包分析
通过这种方式,我们可以利用HTTP POST实现简单的RPC协议,并使用WireShark进行抓包分析。这种方式简单易懂,实用性强,可以应用于各种网络编程场景。
57 16
HTTP 与 HTTPS 协议及 SSL 证书解析-http和https到底有什么区别?-优雅草卓伊凡
HTTP 与 HTTPS 协议及 SSL 证书解析-http和https到底有什么区别?-优雅草卓伊凡
35 3
Apipost接口调试全解:从HTTP到gRPC,程序员必备的“协议生存指南
Apipost是一款强大的接口调试工具,支持多种主流API协议。它涵盖HTTP/HTTPS、WebSocket、Socket.IO、gRPC、GraphQL、TCP及ISO8583金融报文等冷门协议。通过Body多样化、全局参数配置、性能分析等功能优化HTTP调试;提供WebSocket多消息存档与事件监听;gRPC支持服务反射和流式调试;GraphQL可自动生成Schema;TCP报文模板专业精准;SSE配置简单。此外,Apipost还具备环境变量、脚本加持和文档生成功能,是提升开发效率的全能工具。
网络通讯技术:HTTP POST协议用于发送本地压缩数据到服务器的方案。
总的来说,无论你是一名网络开发者,还是普通的IT工作人员,理解并掌握POST方法的运用是非常有价值的。它就像一艘快速,稳定,安全的大船,始终为我们在网络海洋中的冒险提供了可靠的支持。
67 22
|
27天前
|
如何克服HTTP协议的无状态问题
总的来说,如何克服HTTP协议的无状态性,就是通过某种方式,让服务器或客户端“记住”一些信息。这其中,Cookie和Session是最经常使用的两种方式,其他的根据具体的应用场景来选择。
56 10
开发效率翻倍!Apipost这些协议调试秘籍,从HTTP到金融报文全搞定
Apipost是一款强大的API研发管理工具,支持多种协议与数据格式,包括HTTP(s)、WebSocket、SSE、gRPC、TCP及金融协议(如ISO 8583、FIX)。它内置国密算法库,提供HTTP文件秒传、全局参数配置等实用功能。在SSE调试中,可轻松处理AI模型流式响应;WebSocket与Socket.IO实现高效实时通信;GraphQL支持可视化Query编写;TCP模块解决金融报文编码难题;gRPC则具备服务反射与流式调试能力。Apipost不仅简化了多协议切换的复杂性,还自动生成文档,显著提升开发效率,让开发者专注于核心业务逻辑。
Nginx中配置HTTP2协议的方法
Nginx中配置HTTP2协议的方法
335 7
HTTP 协议浅析
通过对HTTP协议的深入了解,开发者可以更好地设计和优化Web应用,提高数据传输效率和用户体验。
162 21

云原生

+关注

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等