跳到主要内容
📖 本章预览

本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。

第十三章:Config 集群同步与通知

配置发布在一个节点上,如何同步到集群所有节点?

集群同步全景

13.1 集群同步全景

Node A(配置发布节点)                    Node B / Node C
│ │
├─① 写入 MySQL │
├─② 本地 Dump(更新 CacheItem) │
├─③ 发布 ConfigDataChangeEvent │
│ │ │
│ ▼ │
│ AsyncNotifyService │
│ │ 为每个节点创建通知任务 │
│ ▼ │
│ NotifySingleRpcTask ──gRPC──→ │
│ ├─ ConfigChangeClusterSyncRequestHandler
│ │ ▼
│ ├─ DumpService.dump()
│ │ │ 从 MySQL 读取最新配置
│ │ │ 更新本地 CacheItem
│ │ │ MD5 变更 → 推送给本节点客户端
│ │ ▼
│ └─ 本节点客户端收到推送

关键点:Config 集群同步不是直接传输配置内容,而是通知其他节点去 Dump。因为所有节点共享同一个 MySQL,通知后各节点自己从 DB 读取最新数据。

13.2 AsyncNotifyService — 异步通知

@Service
public class AsyncNotifyService {

void handleConfigDataChangeEvent(Event event) {
ConfigDataChangeEvent evt = (ConfigDataChangeEvent) event;

Queue<NotifySingleRpcTask> rpcQueue = new LinkedList<>();
for (Member member : memberManager.allMembersWithoutSelf()) {
if (isUnHealthy(member.getAddress())) {
continue;
}
rpcQueue.add(generateTask(evt, member));
}
executeAsyncRpcTask(rpcQueue);
}
}

13.2.1 通知任务

class NotifySingleRpcTask {
String dataId;
String group;
String tenant;
String grayName;
long lastModified;
int failCount; // 失败次数(用于重试退避)
}

13.2.2 通知回调与重试

class AsyncRpcNotifyCallBack extends AbstractPushCallBack {
@Override
public void onFail(Throwable e) {
task.setFailCount(task.getFailCount() + 1);
int delay = getDelayTime(task); // 根据 failCount 计算延迟
ConfigExecutor.scheduleAsyncNotify(retryTask, delay, TimeUnit.MILLISECONDS);
}
}

🔒 解锁完整内容

本章剩余内容需要解锁后查看

以上仅为本章部分预览内容,完整内容包含更多深度源码解析、实战代码和面试要点。

加入知识星球你将获得:

  • ✅ 全部 17 章完整内容 + 持续更新
  • ✅ 配套源码 + 实战项目
  • ✅ 一对一答疑 + 面试辅导
  • ✅ 简历优化 + 内推机会

📚 本章完整目录

以下为本章完整目录结构,加入知识星球即可解锁全部内容。

13.3 ConfigChangeClusterSyncRequestHandler — 接收端

13.4 ConfigChangePublisher — 变更事件发布

13.5 与 Naming 集群同步的对比

13.6 面试热点