ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

规模化联邦方案(去火管化:每群/频道独立主题 + DHT/见证发现 + 真 nm-federation + NAT 直投 + E2E 配对)

2026/10/5 4:55:17 拓冰建站 浏览量
规模化联邦方案(去火管化:每群/频道独立主题 + DHT/见证发现 + 真 nm-federation + NAT 直投 + E2E 配对) 规模化联邦方案去火管化每群/频道独立主题 DHT/见证发现 真 nm-federation NAT 直投 E2E 配对现有联邦靠一条 gossip 主题全量广播所有群/频道/私聊/命名nm-federation仍是 16 行桩。目标按主题订阅——流量与可见性收敛到相关方可扩展、无单点、为 E2E 预留。这是一条纯后端 crate 线crates/nm-federation/nm-gossip/nm-node惠及桌面移动不碰clients/app与clients/mobile可与移动端并行。基线见CURRENT_STATE_ANALYSIS.md。本文为方案稿评审后动手。0. 背景与「火管」三宗罪当前跨节点收敛群/频道/私聊/命名统一走一个联邦级 gossip 主题nmspace-groups:fed承载GroupGossip{ Group announce | Gram msg | Gram direct | NameRecord }全量广播给联邦内每个节点各记录按origin去自环、LWW/墓碑合并。它当初是为绕开「跨 NAT s2s 直拨超时」而快速打通的权宜之计但隐私非成员节点也收到所有群/频道/私聊的元数据与明文E2E 未接。规模带宽/存储 ∝O(节点数 × 全量消息)——联邦越大越不可持续。架构债nm-federation是桩真正的收敛逻辑散在nm-node的 gossip hack 里难演进。1. 设计目标与原则最小可见性一条消息只到达它该到的成员/订阅者。可扩展单节点开销随其实际所在的群/频道数而非联邦规模。无单点、可自托管发现可去中心DHT弱锚见证节点仅做 bootstrap。兼容既有复用 dial-by-key、GroupGossip信封、LWW/墓碑、content_hash去重。平滑迁移灰度双写、版本协商不停机切换。为 E2E 预留主题边界 ↔ 加密群边界MLS天然对齐。2. 架构总览3. 主题模型Topic Model对象主题谁 join收敛群nmspace-group:gid群成员消息gossip成员/元信息iroh-docs频道nmspace-channel:cid订阅者同上频道现为内存态顺带持久化命名nmspace-names:domain关心该域的节点NameRecord LWW/墓碑见 §7私聊不上广播主题——直投 / 收件箱主题见 §6GroupGossip信封基本复用但按 topic 隔离origin去自环、content_hash去重照旧。一个节点可同时在很多主题里由nm-federation统一管理其订阅集与生命周期。4. 发现与引导Discovery Bootstrap症结iroh-gossipjoin 一个主题需要已知 bootstrap peer而非成员根本不在主题里无从得知第一个 peer。方案 ADHT / pkarr把群公钥 → {topic, 种子 peer 列表, 成员根哈希}发布到 iroh/pkarr 的 DHT键群公钥新成员查询即得 bootstrap。去中心、无锚。方案 B见证/锚定节点 witness/anchor每群指定少量锚定节点创建者 home 若干可轮换常驻该主题、对外 dial-by-key 可达充当稳定 bootstrap 成员目录。弱锚、可多副本。推荐 AB 混合锚定节点给稳定冷启动DHT 做无锚兜底群公钥不可枚举避免群被遍历发现。5. nm-federation 真实化从桩到模块把散落在nm-node的 gossip 收敛逻辑收敛进crates/nm-federation职责分层传输/实时iroh-gossip每主题一个GossipTopic——低延迟消息广播。状态/收敛iroh-docs每群一个复制文档成员集、角色、群资料、墓碑只在成员间同步——强收敛、可回放。订阅生命周期join/leave/rejoin、announce 心跳、peer 采样与重连、主题 GC。API 草图pubtraitFederation{asyncfnjoin_group(self,gid:GroupId)-ResultGroupHandle;asyncfnleave_group(self,gid:GroupId)-Result();asyncfnpublish(self,gid:GroupId,env:GroupGossip)-Result();fnsubscribe(self,gid:GroupId)-implStreamItemGroupGossip;asyncfnmembers(self,gid:GroupId)-ResultMemberSet;// 来自 iroh-docs}注意版本对齐iroh 1.2与iroh-gossip/iroh-docs 0.10x的兼容是前置工作分析里已标记。6. 私聊与 NAT 直投症结根因私聊被塞进火管是因为跨 NAT 的 s2s 直拨当初超时fed sync failed: s2s request timed out。去火管的前提是恢复 NAT 健壮的直投。路径2首选修好 irohrelay holepunch 连接复用收件人在线→直投离线→入其home node 的 redb inbox补投home 经 relay 稳定可达。第一要务是定位当初超时真因relay url 未配 / ALPN 不符 / 每次新建连接未复用 / dial 目标是节点而非其 home。路径3兜底nmspace-inbox:recipient_pub每收件人一主题仅收件人与其 home join发件方 publish。避免全广播又不依赖直拨元数据仅对 join 者可见配 E2E 缓解。7. 命名去火管化现NameRecord走火管。目标按域主题nmspace-names:domain只有关心该域的节点 join或并入 DHTdomain→node本就经 nm-domain/pkarr 发现。LWW 墓碑空client_pubkey 更高 serial语义不变home_node自签名不变。8. E2EMLS配对每群一主题 ↔ 每群一个 MLS 群预留的 openmls 终于可接。主题传输密文 MLS 握手Welcome/Commit成员增减 ↔ MLS add/remove与 §5 的成员文档联动。私聊用 1:1 MLS 或 X25519 封装。去火管 E2E 一起才真正消除「明文广播全联邦」。9. 迁移与兼容灰度不停机双写节点同时在火管 新 per-topic 发收端按content_hash去重。协商announce带supports_per_topicfeature flag混合网络平滑过渡。切流成员/订阅迁到新主题后发端停火管、仅新主题。退役联邦主题仅作「发现兜底 / 老节点兼容」保留一段时间后移除。10. 分阶段路线每阶段可跨网验证F0 · nm-federation 骨架topic 注册表 订阅 API 单测内部仍走火管线上行为不变。F1 · 群/频道切 per-topic成员 join 自己群主题双写 去重锚定节点 bootstrap。F2 · DHT/pkarr 发现无锚也能 join群公钥不可枚举。F3 · 私聊去火管定位并修 NAT 直投inbox 主题兜底。F4 · 命名去火管按域主题 / DHT。F5 · E2E 退役火管每群 MLS 接入联邦火管下线。里程碑沿用现有多 seed 集成测试 跨网真机见 memoryseed-deploy-pipeline/federation-delivery-mechanisms。11. 风险与开放问题多主题开销节点在大量群时N 个 gossip 主题的连接/采样/内存——需 peer 采样上限与懒 join。iroh-docs × iroh 1.2 版本对齐前置。NAT 直投真因未定位F3 前必须用真机 relay 实测复现。见证节点信任/激励谁当锚、下线与轮换、防女巫。DHT 隐私/可用性发现延迟、群枚举靠不可枚举群公钥缓解。墓碑/LWW GCper-topic 下的垃圾回收与存储增长。开放问题频道是否也要成员鉴权公开频道 vs 私有频道的主题可见性私聊兜底选「直投为主」还是「inbox 主题为主」取决于 relay 实测结论。E2E 先上私聊还是先上群群的成员变更MLS 更复杂是否顺带把频道做持久化现为内存态重启丢。