17 · Relay Mesh 与共享算力
buzz-relay-mesh 为需要会话归属和跨节点数据通道的能力提供底座:Iroh/QUIC 传输、签名节点身份、Redis readiness directory、租约与 generation fence、可靠 tunnel。当前 Huddle 和部分 Desktop mesh LLM 已接线;更完整的跨 Relay Agent/算力市场仍应视为愿景。
1. 为什么普通 PubSub 不够
Redis PubSub 适合广播事件,不适合“某个有状态 session 只能由一个 runtime 持有”:
- 音频房间有 peer/jitter/codec 状态。
- 模型推理有 KV cache、上下文与资源占用。
- 长连接 tunnel 需要明确 owner 与失败切换。
Mesh 增加了 identity、directory、lease、fence 与 point-to-point transport。
2. 传输层
核心参数:
- Iroh/QUIC。
- ALPN
buzz/mesh/1。 - wire version
1。 - 单 stream/payload 有边界(可靠 tunnel 消息约 1 MiB,底层 stream 总体上限更高)。
- 大消息分块,避免一次分配任意长度。
QUIC 提供加密、stream 与 NAT 友好的连接;应用层仍要验证 peer identity、community/session 和 generation。
3. 节点身份与 readiness
每个 mesh runtime 有签名身份和 runtime ID,周期发布 readiness:
readiness record {
node/runtime id,
endpoint/address,
capabilities/profile,
timestamp/expiry,
signature
}默认约 15 秒刷新,过期窗口约 3 倍。消费者验证 Relay/节点签名并丢弃过期记录;Redis key 只是发现渠道,不自动可信。
4. Membership 与 failure detection
节点之间维护 membership/gossip,并用 phi accrual suspicion(阈值约 8)判断对端可能失效。phi 不是绝对死亡证明:网络抖动会造成怀疑,因此真正的 session takeover 仍依赖租约过期和 generation,而不是单凭 gossip 删除 owner。
并发双向建连用确定性 tie-break,避免两个节点各保留一条重复连接。
5. Session directory
Redis directory key 按 (community, session) 作用域,记录:
- owner runtime。
- lease expiry。
- monotonic generation。
- 可选 profile/endpoint。
状态转移:
Absent --acquire--> Owned(node A, gen 1)
Owned --renew-----> Owned(node A, gen 1)
Owned --expire/takeover--> Owned(node B, gen 2)
late A renew/send --fence--> Rejectedcommunity 进入 key 和签名上下文,防相同 session UUID 跨租户冲突。
6. Fencing token
只用 TTL 有一个经典漏洞:A 的租约实际过期,但 A 因 GC pause/网络分区不知道;B 接管后 A 恢复并继续写。generation 使下游能比较:
- B 使用 gen 2。
- A 的 gen 1 请求被拒绝。
Fence 必须在实际副作用点检查,而不只在 acquire 时检查。Huddle mesh send/renew 代码显式传播 FenceVerdict。
7. Reliable tunnel
Tunnel 为跨节点 session 数据提供 request/stream 通道:
- frame/payload length bound。
- chunking/reassembly bound。
- request correlation。
- lease renewer 监测所有权丢失。
- cancellation/connection close 传播。
“reliable”指建立在 QUIC stream 上的有序可靠传输,不代表业务操作 exactly-once。断线重试仍需 request ID/幂等语义。
8. Huddle 接线
任意 Relay 接到 join 后查 directory:
- 若本 node owner,进入本地 room。
- 若其他 node owner,经 mesh tunnel 转发。
- owner 失效时申请更高 generation 接管。
- 旧 node 晚到数据被 fence。
这使客户端不必预先知道房间在哪个 pod,也无需 sticky load balancer 承担唯一正确性。
9. Mesh LLM
Desktop mesh_llm 有 catalog、discovery、coordinator、identity、progress、recovery、transport policy 与 usage 模块;Rust feature mesh-llm 默认关闭,因为会引入 llama.cpp/native 依赖和大量额外 crate。
当前更适合描述为共享计算基础设施与本地试验接线:已有 discovery/transport/recovery 结构,但生产级调度仍需资源证明、模型兼容、隐私、计费、恶意节点、数据驻留和结果验证。
10. 实现、部分实现与愿景
| 能力 | 状态 |
|---|---|
| 节点身份、QUIC transport、readiness、membership | 已实现基础设施 |
| session lease/generation/fence、reliable tunnel | 已实现基础设施 |
| Huddle 跨节点 ownership | 已接线,需规模化运维验证 |
| Desktop mesh LLM | feature-gated / 部分实现 |
| 任意 Agent 跨 Relay 市场化调度 | 愿景 |
11. 安全边界
- Redis readiness 记录必须验签、验时效。
- QUIC peer identity 与应用 Relay identity 必须绑定。
- tunnel frame 必须含 tenant/session/generation 并做长度限制。
- 远端模型节点看到的 prompt/上下文是高敏数据,传输加密不等于节点可信。
- takeover 要以 lease + fence 为准,不以网络猜测为准。
12. 源码入口
crates/buzz-relay-mesh/src/:transport、identity、membership、directory 与 tunnel。crates/buzz-relay/src/mesh_boot.rs:Relay boot/dispatcher 接线。crates/buzz-relay/src/audio/mesh.rs:Huddle owner directory 与 fence。desktop/src-tauri/src/mesh_llm/:Desktop 共享推理探索。docs/formal/STATEFUL_GATEWAY.md:stateful gateway 不变量概览。Justfile:mesh=1feature-gated build 口径。