← 中文资源

简体中文版本

构建 Gossip 集群发现

一个集群成员发现 Gossip 协议:每节点周期性与随机对等节点交换成员列表,无需中央注册表即收敛到一致视图。

阅读英文原文

项目概述

本项目实现 Gossip 集群发现:每节点持成员列表(id, 地址, 心跳, 末见, 状态),每 tick 自增心跳并随机选活对等节点全量交换列表,合并取更高心跳。失败检测器超时标记死亡,宽限后移除。新节点联系种子获取列表引导启动。测试三节点一种子第三经种子加入断言收敛同列表;停节点断言先标死后移除;心跳递增断言交换携带新值;合并高心跳更新低心跳保留;分区断言发散愈合断言再收敛;同列表合并两次幂等;宽限后交换不重新加入。部署每节点一实例至少一种子地址;gossip 间隔按收敛需求;超时与宽限按暂停与传播定;监控成员数与死数。最终一致加入需几轮;无安全可被投毒;全量交换大集群需增量或布隆。

架构与实施

构建 Gossip 集群发现的架构设计与实施步骤已在上文详述,代码与命令与英文版本严格一致,可在本地按运行方式复现并核对结果。本译文依据英文原文完整重写,包含功能说明、运行方式与真实预期输出,供中文读者对照英文原稿阅读。

限制与后续

当前构建 Gossip 集群发现实现覆盖最常见的使用路径,超出上文限制边界的场景需要额外设计与实现;若用于生产,请先补充输入校验、错误处理与日志,再结合自身环境调整node:dgram版本。

代码示例

pnpm init

pnpm add -D typescript tsx vitest
gossip-cluster-discovery/
├── src/gossip.ts
├── src/member.ts
├── src/failure.ts
├── tests/gossip.test.ts
└── package.json
members.get(self).heartbeat++; members.get(self).lastSeen = now;
const peer = randomPeer(); const remote = await exchange(peer, members); merge(remote);
if (now - m.lastSeen > TIMEOUT) m.state = "dead"; if (now - m.lastSeen > GRACE) members.delete(m.id);
const seedList = await contact(seed); merge(seedList); gossip();
pnpm vitest run