在Kubernetes上使用支持流式HTTP的 Spring AI MCP MVC(1.1.2):如何在多个副本之间管理MCP会话?
我在使用Spring AI MCP MVC 1.1.2版本,并在Kubernetes上部署我的MCP服务器,拥有多个副本(2个实例)。
MCP服务器使用Streamable HTTP传输。
问题在于,当代理连接时,首先会初始化一个会话。MCP服务器返回一个 Mcp-Session-Id,后续的请求(工具发现、工具调用等)必须包含这个会话ID。
然而,在多实例部署中,只有最初创建会话的实例能够识别该会话:
- 代理发送
initialize请求。 - Replica A处理该请求并返回
Mcp-Session-Id=abc123。 - 稍后,代理发送带有
Mcp-Session-Id=abc123的工具调用。 - Kubernetes负载均衡将请求路由到Replica B。
- 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。