📖 本章预览
本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。
第十三章: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 章完整内容 + 持续更新
- ✅ 配套源码 + 实战项目
- ✅ 一对一答疑 + 面试辅导
- ✅ 简历优化 + 内推机会
📚 本章完整目录
以下为本章完整目录结构,加入知识星球即可解锁全部内容。