跳转至

中继服务配置

本文引用的文件 - examples/config/relay-hub-v2.toml - examples/config/relay-agent-local-v2.toml - examples/config/mcp-relay-public-v2.toml - examples/config/mcp-relay-local-v2.toml - src/relay/descriptor.v - src/relay/runtime.v - src/ws/relay_agent.v - src/ws/relay_carrier.v - src/ws/runtime.v - src/dispatch/relay.v - tests/e2e/config_acceptance_test.sh

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能与容量规划
  8. 故障排查指南
  9. 结论
  10. 附录:完整配置示例与高可用部署

简介

本文件面向“中继服务(Relay Service)”的配置与部署,覆盖以下主题: - 中继节点配置:节点发现、集群通信、状态同步 - 会话管理配置:会话生命周期、状态持久化、故障恢复 - 负载均衡配置:请求分发、健康检查、故障转移 - 协议转换配置:协议适配、数据映射、格式转换 - 安全配置选项:认证授权、加密传输、访问控制 - 扩展性配置:水平扩展、插件机制、动态加载 - 完整配置示例与高可用部署架构说明

项目结构

仓库中与中继相关的配置与实现主要分布在如下位置: - 示例配置:examples/config 下的 relay- 与 mcp-relay- 配置文件 - 运行时与描述符:src/relay 下的 descriptor、runtime、session、carrier_runtime 等 - WebSocket 载体与代理:src/ws 下的 relay_agent、relay_carrier、runtime 等 - 调度入口:src/dispatch/relay.v 将中继帧转换为内部交换对象

graph TB
subgraph "配置"
C1["hub: relay-hub-v2.toml"]
C2["agent: relay-agent-local-v2.toml"]
C3["public: mcp-relay-public-v2.toml"]
C4["local: mcp-relay-local-v2.toml"]
end
subgraph "运行时"
R1["descriptor.v<br/>解析与校验中继描述符"]
R2["runtime.v<br/>中继运行时、通道与会话注册表"]
R3["ws/relay_agent.v<br/>Agent握手/重连/载荷处理"]
R4["ws/relay_carrier.v<br/>WebSocket载体发送/关闭"]
R5["ws/runtime.v<br/>Hub连接/房间/元数据/队列"]
R6["dispatch/relay.v<br/>中继入站→Exchange"]
end
C1 --> R1
C2 --> R1
C3 --> R1
C4 --> R1
R1 --> R2
R3 --> R2
R4 --> R2
R5 --> R2
R6 --> R2

图表来源 - examples/config/relay-hub-v2.toml:1-25 - examples/config/relay-agent-local-v2.toml:1-29 - examples/config/mcp-relay-public-v2.toml:1-46 - examples/config/mcp-relay-local-v2.toml:1-36 - src/relay/descriptor.v:1-126 - src/relay/runtime.v:1-187 - src/ws/relay_agent.v:1-187 - src/ws/relay_carrier.v:1-70 - src/ws/runtime.v:1-343 - src/dispatch/relay.v:1-60

章节来源 - examples/config/relay-hub-v2.toml:1-25 - examples/config/relay-agent-local-v2.toml:1-29 - examples/config/mcp-relay-public-v2.toml:1-46 - examples/config/mcp-relay-local-v2.toml:1-36 - src/relay/descriptor.v:1-126 - src/relay/runtime.v:1-187 - src/ws/relay_agent.v:1-187 - src/ws/relay_carrier.v:1-70 - src/ws/runtime.v:1-343 - src/dispatch/relay.v:1-60

核心组件

  • 中继描述符(Descriptor):从配置中解析出中继模式(hub/agent)、载体(websocket)、监听器或远端URL、路径、节点ID、令牌、并发与缓冲限制等。包含严格的参数校验。
  • 中继运行时(Runtime):维护 Agent 状态机、通道注册表、会话注册表、载体注册表;提供帧转发、会话路由、载体附加/分离、快照导出等能力。
  • Agent 代理(ws/relay_agent):负责向 Hub 发起握手、处理握手应答、错误帧、以及后续业务帧的收发;封装重连策略与事件字段。
  • 载体(ws/relay_carrier):基于 WebSocket 的载体实现,负责编码/解码帧、发送、关闭通道与连接。
  • Hub 运行时(ws/runtime):管理连接、房间、元数据、消息队列与清理流程。
  • 调度入口(dispatch/relay):将中继入站帧转换为内部 Exchange,注入协议与中继上下文元数据。

章节来源 - src/relay/descriptor.v:1-126 - src/relay/runtime.v:1-187 - src/ws/relay_agent.v:1-187 - src/ws/relay_carrier.v:1-70 - src/ws/runtime.v:1-343 - src/dispatch/relay.v:1-60

架构总览

中继服务采用 Hub-Agent 拓扑: - Hub(中心):暴露 WebSocket 监听器,接收来自多个 Agent 的连接,进行帧转发与会话路由。 - Agent(边缘):以客户端方式连接 Hub,承载本地应用(如 MCP 适配器),将本地请求经 Hub 转发至目标 Agent。

sequenceDiagram
participant Client as "外部客户端"
participant Hub as "Hub(WS监听)"
participant Agent as "Agent(WS客户端)"
participant LocalApp as "本地应用/适配器"
Client->>Hub : "HTTP/WebSocket 请求"
Hub->>Agent : "通过已建立WS连接转发帧"
Agent->>LocalApp : "根据route/协议适配调用"
LocalApp-->>Agent : "响应/流式数据"
Agent-->>Hub : "回写帧"
Hub-->>Client : "返回结果/推送"

图表来源 - examples/config/relay-hub-v2.toml:10-25 - examples/config/relay-agent-local-v2.toml:10-29 - src/ws/relay_agent.v:70-130 - src/ws/relay_carrier.v:27-49 - src/dispatch/relay.v:24-59

详细组件分析

中继节点配置(Hub/Agent)

  • 模式与载体
  • mode:hub 或 agent(支持 server/client 别名)
  • carrier:当前仅支持 websocket
  • Hub 必需项
  • listener:引用一个已定义的监听器资源
  • path:匹配的路径(默认 /vhttpd/relay)
  • Agent 必需项
  • url:Hub 的 ws/wss 地址
  • node_id:节点标识(未显式设置时回退到 relays.
  • 通用参数
  • token:用于握手鉴权
  • max_channels:最大并发通道数
  • channel_buffer:单通道缓冲上限
  • reconnect_delay_ms:初始重连延迟(指数退避由策略计算)

章节来源 - src/relay/descriptor.v:27-90 - examples/config/relay-hub-v2.toml:16-25 - examples/config/relay-agent-local-v2.toml:10-18

节点发现与集群通信

  • 节点发现
  • Hub 侧通过监听器与 path 匹配接入;Agent 侧通过 url 直连。
  • 支持多 relays 定义,按 id 区分不同集群/租户。
  • 集群通信
  • 基于 WebSocket 文本帧承载 WireFrame;Agent 先发送 hello 完成握手,随后进入业务帧阶段。
  • Hub 维护连接、房间与会话,Agent 通过载体发送/关闭通道。
flowchart TD
Start(["启动"]) --> Mode{"mode=hub?"}
Mode --> |是| Listen["监听listener:path"]
Mode --> |否| Connect["连接url并发送hello"]
Listen --> Accept["接受Agent连接"]
Connect --> HelloAck{"收到hello_ack?"}
HelloAck --> |是| Ready["进入业务帧阶段"]
HelloAck --> |否| Backoff["按reconnect_delay_ms重试"]
Ready --> Forward["转发/路由帧"]
Accept --> Forward

图表来源 - src/ws/relay_agent.v:70-130 - src/ws/relay_carrier.v:27-49 - src/ws/runtime.v:24-101

章节来源 - src/ws/relay_agent.v:70-130 - src/ws/runtime.v:24-101

状态同步与会话管理

  • 会话模型
  • SessionRegistry 维护 session_id → endpoints 映射,支持 link_id 聚合与角色过滤。
  • 支持 pending 缓冲与限流,避免背压导致内存膨胀。
  • 生命周期
  • open_endpoint/close_endpoint 增删端点;当无端点且无待处理帧时自动清理会话。
  • 路由
  • route_session_frame 根据 link_id 与 role 选择目标端点,支持广播/定向。
classDiagram
class Runtime {
+descriptors
+agents
+channels
+sessions
+carriers
+open_session_endpoint()
+route_session_frame()
+snapshot()
}
class SessionRegistry {
+open_endpoint()
+close_endpoint()
+targets()
+buffer_pending()
+drain_pending()
}
class RelaySession {
+endpoints
+endpoints_by_link
+pending_by_link
}
class RelayEndpoint {
+id
+channel_id
+session_id
+link_id
+role
+trace_id
}
Runtime --> SessionRegistry : "持有"
SessionRegistry --> RelaySession : "管理"
RelaySession --> RelayEndpoint : "包含"

图表来源 - src/relay/runtime.v:6-41 - src/relay/session.v:3-142

章节来源 - src/relay/runtime.v:112-127 - src/relay/session.v:33-123

会话持久化与故障恢复

  • 持久化
  • 当前实现以进程内内存为主(SessionRegistry、ChannelRegistry、CarrierRegistry)。
  • 可通过 snapshot 导出运行时快照用于观测与诊断。
  • 故障恢复
  • Agent 具备重连策略:mark_failed 后依据 reconnect_policy_from_descriptor 计算下次尝试时间。
  • Hub 侧对连接断开进行清理与元数据回收。

章节来源 - src/relay/runtime.v:72-98 - src/ws/runtime.v:244-257 - src/relay/runtime.v:169-178

负载均衡配置

  • 请求分发
  • 通过 pipelines 将 HTTP 请求路由到 relay-delivery 适配器,再由其写入对应 relay 的载体。
  • 可结合 match.methods/match.paths 做细粒度分流。
  • 健康检查
  • 可在 Agent 侧暴露固定健康接口(fixed-response),供上游探测。
  • 故障转移
  • 若某 Agent 不可用,上层可切换至其他 Agent 实例(多 relays 定义+不同 url)。

章节来源 - examples/config/mcp-relay-public-v2.toml:32-46 - examples/config/relay-agent-local-v2.toml:20-29 - tests/e2e/config_acceptance_test.sh:688-693

协议转换配置

  • 协议适配
  • 使用 adapters.mcp 将中继帧转换为 MCP 协议,交由指定 engine 执行。
  • 数据映射
  • dispatch/relay 将中继帧转为 Exchange,注入 protocol=relay 及中继上下文元数据。
  • 格式转换
  • 载体层统一使用文本帧承载 WireFrame;二进制场景由上层应用自行编解码。

章节来源 - examples/config/mcp-relay-local-v2.toml:28-36 - src/dispatch/relay.v:24-59

安全配置选项

  • 认证授权
  • token:在握手阶段用于鉴权,需确保 Hub 与 Agent 一致。
  • auth:描述符支持可选的 auth 资源引用(可用于扩展鉴权逻辑)。
  • 加密传输
  • 建议 Agent 使用 wss:// 连接 Hub,启用 TLS。
  • 访问控制
  • 通过 listeners.relay.path 限定接入路径;结合上游网关/反向代理做 IP 白名单与速率限制。

章节来源 - src/relay/descriptor.v:10-47 - examples/config/relay-agent-local-v2.toml:13-15 - examples/config/relay-hub-v2.toml:16-22

扩展性配置

  • 水平扩展
  • 多 Agent 实例指向同一 Hub,按业务域拆分 relays.id 与 path/url。
  • 插件机制
  • 通过 adapters.* 组合不同引擎(如 mcp、php-worker),复用 pipeline 编排。
  • 动态加载
  • 运行时通过 descriptors_from_plan 动态构建中继描述符集合,支持热更新(配合配置重载机制)。

章节来源 - examples/config/mcp-relay-local-v2.toml:10-17 - src/relay/descriptor.v:49-57

依赖关系分析

  • 配置到运行时
  • TOML 中的 relays.* 被解析为 RelayDescriptor,再构建 Runtime。
  • 运行时到载体
  • Runtime 通过 CarrierRegistry 绑定具体载体(WebSocket),完成帧发送/关闭。
  • 运行时到调度
  • 入站帧经 receive_from_carrier → handle_inbound_frame → route_session_frame,最终产出 DeliveryOutcome 并由适配器投递。
graph LR
CFG["TOML配置"] --> DESC["RelayDescriptor"]
DESC --> RT["Relay Runtime"]
RT --> REG["CarrierRegistry"]
RT --> CH["ChannelRegistry"]
RT --> SESS["SessionRegistry"]
RT --> OUT["DeliveryOutcome"]
OUT --> ADP["Adapter(如mcp/relay-delivery)"]

图表来源 - src/relay/descriptor.v:49-57 - src/relay/runtime.v:121-135 - src/dispatch/relay.v:24-59

章节来源 - src/relay/descriptor.v:49-57 - src/relay/runtime.v:121-135 - src/dispatch/relay.v:24-59

性能与容量规划

  • 关键参数
  • max_channels:决定 Hub 可同时维护的通道数量,影响内存占用与调度开销。
  • channel_buffer:单通道缓冲上限,过大易造成背压放大。
  • reconnect_delay_ms:初始重连延迟,结合退避策略避免雪崩。
  • 建议
  • 根据峰值 QPS 与平均消息大小估算 max_channels 与 buffer。
  • 在 Agent 侧开启 autostart 并合理设置重连延迟,提升可用性。
  • 使用 wss 并在反向代理层启用连接复用与超时保护。

章节来源 - src/relay/descriptor.v:40-43 - examples/config/relay-agent-local-v2.toml:16-18

故障排查指南

  • 常见问题
  • 握手失败:检查 token 是否一致、url/path 是否正确、TLS 证书是否有效。
  • 频繁重连:观察 reconnect_delay_ms 与网络抖动,必要时调整退避策略。
  • 通道堆积:降低 channel_buffer 或扩容 max_channels,定位慢消费者。
  • 观测手段
  • 使用 observability.event_log 输出事件日志,结合 snapshot 查看运行时状态。
  • 在 Agent 侧暴露 /health 固定响应,便于探针探测。

章节来源 - examples/config/relay-hub-v2.toml:7-8 - examples/config/relay-agent-local-v2.toml:20-29 - src/relay/runtime.v:169-178

结论

中继服务通过 Hub-Agent 拓扑与统一的 WebSocket 载体,实现了跨进程/跨主机的可靠通信与灵活路由。借助描述符驱动的配置模型、会话与通道注册表、以及载体抽象,系统具备良好的可扩展性与可观测性。在生产环境中,建议结合 wss、健康检查与多 Agent 部署,以获得高可用与弹性伸缩能力。

附录:完整配置示例与高可用部署

示例一:Hub 节点(公开接入)

章节来源 - examples/config/relay-hub-v2.toml:10-25 - examples/config/mcp-relay-public-v2.toml:10-31

示例二:Agent 节点(本地应用)

章节来源 - examples/config/relay-agent-local-v2.toml:10-18 - examples/config/mcp-relay-local-v2.toml:18-26

示例三:端到端测试脚本片段

章节来源 - tests/e2e/config_acceptance_test.sh:643-747

高可用部署架构建议

  • 拓扑
  • 多 Hub 实例(可置于不同可用区),前端由负载均衡器按地域就近接入
  • 多 Agent 实例按业务域划分,各自连接就近 Hub
  • 容灾
  • Agent 侧启用 autostart 与合理的重连退避
  • 使用 wss 保障传输安全,结合反向代理的超时与熔断策略
  • 观测
  • 集中采集 observability.event_log,结合 snapshot 监控通道与会话指标

[本节为概念性说明,不直接分析具体文件]