当前位置: 首页 > news >正文

bug复盘:MCP SSE Client 生命周期问题之context.Background() 的使用

最近在开发过程中,遇到了一个棘手的 BUG,它与 MCP (Mobile Cloud Platform) 的 SSE (Server-Sent Events) 客户端初始化及其生命周期管理息息相关。经过排查,发现问题出在 client.NewSSEMCPClient 之后调用 Start 方法时,错误地传入了当前的请求上下文 ctx,而不是一个独立的、无超时限制的上下文。

问题现象:tools/call 结束后 SSE 连接意外中断

我们的 MCP 客户端代码大致是这样的:

case do.TransportTypeSSE:c, err := client.NewSSEMCPClient(endpoint)if err != nil {return nil, fmt.Errorf("创建 SSE 客户端失败: %w", err)}// 问题出在这里:将当前的请求 ctx 传给了 Start 方法if err := c.Start(ctx); err != nil {return nil, fmt.Errorf("启动 SSE 客户端失败: %w", err)}mcpClient = c

当我们在外部调用 mcpClienttools/call 方法,并且该方法执行完毕后发现SSE 连接竟然断开了! 下次尝试复用这个 mcpClient 进行 tools/call 时,会直接失败,并可能收到类似 Session ID not found, Please reconnect 的错误。

这个问题的根源在于对 Go 语言中 context.Context 的理解和使用不当。

传入 Start(ctx)ctx 是来自当前 HTTP 请求或 RPC 调用的上下文。这类上下文通常具有超时或取消机制。当这个上层请求处理完毕(无论是成功返回还是发生错误),或者请求被取消时,ctx.Done() 管道就会收到信号。

c.Start(ctx) 内部监听的 ctx.Done() 收到信号时,它就会认为外部调用者希望终止 SSE 连接,从而导致 SSE 连接被主动关闭。这样一来,虽然 tools/call 流程结束了,但作为底层传输通道的 SSE 连接也随之关闭,其生命周期与当前的请求流程绑定在一起。这显然不是我们希望的,因为我们想复用这个 mcpClient 来处理后续的请求。

解决这个问题的关键在于,为 SSE 客户端的 Start 方法提供一个独立的、不受特定请求生命周期影响的上下文。context.Background()。它 是一个永不取消、永不超时的根上下文。将它传递给 c.Start(),意味着 SSE 连接的生命周期将与应用程序的生命周期保持一致,而不会因为某个具体的 tools/call 请求结束而中断。

当需要启动一个与整个应用程序生命周期绑定、不应被上层调用取消或超时的 Goroutine 或服务时

 

相关文章:

  • 草料二维码怎么制作网站网推平台
  • 网络培训的网站建设电脑系统优化软件十大排名
  • 做网站设计是什么专业seo工具不包括
  • 制作微信小程序步骤黑帽seo工具
  • 网站域名怎样注销seo网络推广有哪些
  • 中国那个公司的网站做的最好看今晚日本比分预测
  • window显示驱动开发—DirectX 图形内核子系统(一)
  • 学习昇腾开发的第9天--在Ubuntu下安装ffmpeg4.2.11
  • Spring Boot 项目中同时使用 Swagger 和 Javadoc 的完整指南
  • Linux IPV4/IPV6配置终极指南
  • Unix 时间戳
  • 推荐系统的视频特征-视频关键帧特征提取与向量生成
  • [3D-portfolio] 3D画布组件 | <Canvas> | Framer Motion | 预定义动画序列
  • OpenCV边缘填充方式详解
  • 设置cursor、vscode的默认终端
  • VIVADO设定寄存器/存储器的初始值
  • Java+LangChain实战入门:深度剖析开发大语言模型应用!
  • [论文阅读] 人工智能+ | 用大语言模型给建筑合规检查“开挂“:BIM领域的自动化革命
  • PHP的
  • DeepSeek16-open-webui Pipelines开发填坑
  • 课堂笔记:吴恩达的AI课(AI FOR EVERYONE)-W1 机器学习什么能做,什么不能做
  • 算法 按位运算
  • 缓存与加速技术实践-MongoDB数据库应用
  • 阿里云ACP-检索分析服务
  • 深入解析Python多服务器监控告警系统:从原理到生产部署
  • 解锁阿里云Datatransport:数据迁移的终极利器