在Kubernetes上使用支持流式HTTP的 Spring AI MCP MVC(1.1.2):如何在多个副本之间管理MCP会话?

人工智能 2026-07-08

我在使用Spring AI MCP MVC 1.1.2版本,并在Kubernetes上部署我的MCP服务器,拥有多个副本(2个实例)。

MCP服务器使用Streamable HTTP传输。

问题在于,当代理连接时,首先会初始化一个会话。MCP服务器返回一个 Mcp-Session-Id,后续的请求(工具发现、工具调用等)必须包含这个会话ID。

然而,在多实例部署中,只有最初创建会话的实例能够识别该会话:

  1. 代理发送 initialize 请求。
  2. Replica A处理该请求并返回 Mcp-Session-Id=abc123
  3. 稍后,代理发送带有 Mcp-Session-Id=abc123 的工具调用。
  4. Kubernetes负载均衡将请求路由到Replica B。
  5. Replica B不知道会话 abc123,请求失败。

因此MCP会话变成实例本地化,在水平扩展部署中会带来问题。

我的问题是:

  • 在多副本的Kubernetes环境中,是否有推荐的方式来运行带有Streamable HTTP的 Spring AI MCP MVC?
  • 是否应将MCP会话状态外部化(例如存储在Redis中),以便所有副本都能访问相同的会话信息?
  • Spring AI MCP MVC是否提供用于分布式会话管理或共享会话存储的内置机制?
  • 首选的解决方案是在入口/负载均衡器层使用黏性会话,还是有更好的做法?
  • 对于使用Streamable HTTP的 MCP服务器的生产环境部署,是否有最佳实践?

环境:

  • Spring AI MCP MVC:1.1.2
  • 传输:Streamable HTTP
  • 部署:Kubernetes
  • 副本数:2+
  • 通过Kubernetes Service / Ingress进行负载均衡

解决方案

协议:STATELESS

可以使用stateless-streamable-http。

https://docs.spring.io/spring-ai/reference/1.1/api/mcp/mcp-stateless-server-boot-starter-docs.html

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章