菜单

会话管理

相关源文件

MCP Go SDK中的会话管理提供了一个框架,用于跟踪客户端连接、维护每个客户端的状态以及传递通知。该系统使服务器能够为单个客户端定制行为并管理客户端-服务器关系的生命周期。

有关服务器配置和功能的信息,请参阅 服务器配置。有关特定传输实现的详细信息,请参阅 传输机制

会话接口层次结构

会话管理系统围绕定义不同功能的接口层次结构构建。

来源: server/session.go10-65 server/sse.go22-116

核心会话接口

ClientSession 接口定义了会话管理的基本操作

方法目的
SessionID()返回唯一的会话标识符
NotificationChannel()提供用于发送通知的通道
Initialize()标记会话为已准备好接收通知
Initialized()检查会话是否已初始化

来源: server/session.go10-20

扩展的会话功能

其他接口扩展了基础会话以提供特定功能

接口目的关键方法
SessionWithLogging日志级别管理SetLogLevel(), GetLogLevel()
SessionWithTools每个会话的工具GetSessionTools(), SetSessionTools()
SessionWithClientInfo客户端元数据GetClientInfo(), SetClientInfo()
SessionWithStreamableHTTPConfigHTTP流UpgradeToSSEWhenReceiveNotification()

来源: server/session.go22-65

会话生命周期管理

来源: server/session.go86-111 server/sse.go350-369

会话注册

会话在建立连接时与服务器注册

注册过程

  1. 生成或验证唯一的会话 ID
  2. 将会话存储在并发安全的映射中
  3. 触发注册钩子
  4. 如果会话 ID 已存在,则返回错误

来源: server/session.go86-97

会话注销

当客户端断开连接时,会话将被移除

注销过程

  1. 从存储中移除会话
  2. 触发注销钩子
  3. 执行清理操作

来源: server/session.go99-111

基于上下文的会话访问

会话管理系统与 Go 的上下文系统集成,用于请求范围的访问

来源: server/session.go67-84

上下文操作

功能目的
WithContext(ctx, session)将会话存储在上下文中
ClientSessionFromContext(ctx)从上下文中检索会话

这些函数使处理程序无需显式传递参数即可访问当前会话。

来源: server/session.go70-84

通知系统

会话管理系统提供了多种通知传递模式

来源: server/session.go113-252

通知传递方法

方法目标需要上下文
SendNotificationToAllClients所有已初始化的会话
SendNotificationToClient来自上下文的当前会话
SendNotificationToSpecificClient通过 ID 指定的会话

来源: server/session.go113-252

通知通道管理

每个会话都提供一个具有以下特征的通知通道

  • 非阻塞发送,带错误处理
  • 可配置的缓冲区大小
  • 阻塞通道检测和错误报告
  • 与服务器错误钩子集成

来源: server/session.go130-148 server/session.go180-198

特定于会话的工具

会话可以维护自己的工具集,这些工具集可以覆盖或扩展全局工具

来源: server/session.go254-380

会话工具操作

操作方法已发送通知
添加单个工具AddSessionTool(sessionID, tool, handler)是(如果启用了 tools.listChanged
添加多个工具AddSessionTools(sessionID, ...tools)是(如果启用了 tools.listChanged
删除工具DeleteSessionTools(sessionID, ...names)是(如果启用了 tools.listChanged

来源: server/session.go254-380

工具继承和覆盖

会话工具遵循这些优先规则

  1. 同名的特定于会话的工具会覆盖全局工具
  2. 全局工具保持可用,除非被明确覆盖
  3. 工具过滤器适用于组合工具集

来源: server/session_test.go249-301

特定于传输的会话实现

SSE 传输提供了会话接口的具体实现

来源: server/sse.go22-116

SSE 会话功能

sseSession 实现提供了

  • 用于标志和值的线程安全原子操作
  • 并发通知处理
  • 使用 sync.Map 进行特定于会话的工具存储
  • 保持连接的 ping 机制
  • 用于 SSE 传递的事件队列

来源: server/sse.go22-116

会话存储和检索

会话存储在并发安全的映射结构中

  • 键:会话 ID(UUID 字符串)
  • 值:会话接口实现
  • 操作:Load、Store、Delete、Range

来源: server/sse.go128 server/session.go92

错误处理和弹性

会话管理系统包括全面的错误处理

来源: server/errors.go15-24 server/session.go134-147 server/session.go184-197

错误类型

错误发生时间处理
ErrSessionNotFound找不到会话向调用者返回错误
ErrSessionExists重复注册拒绝注册
ErrSessionNotInitialized会话未准备好跳过操作
ErrNotificationChannelBlocked通道已满通过错误钩子记录

来源: server/errors.go15-24

阻塞通道处理

当通知通道被阻塞时

  1. 非阻塞发送尝试失败
  2. 通过服务器错误钩子报告错误
  3. 会话继续正常运行
  4. 没有数据丢失

来源: server/session.go134-147 server/session.go184-197