📖 本章预览
本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。
第十二章:Config 存储与 Dump 同步
Dump 机制是配置中心"DB → 内存 → 推送"三级流水线的核心环节。没有 Dump,配置查询就要直接查 DB,推送也无从触发。
12.1 Dump 机制的本质
Dump
DB(MySQL/Derby) ─────────→ 内存(CacheItem) ─────→ 磁盘缓存
│ │
│ 配置发布写入 │ MD5 + lastModified
│ │
│ │ MD5 变更时:
│ │ 发布 LocalDataChangeEvent
│ │ → 触发 gRPC 推送
│ │ → 触发长轮询唤醒
Dump 的本质:将 DB 中的配置数据同步到内存 CacheItem 和磁盘缓存。
为什么不直接查 DB?
- 性能:配置查询直接读内存/磁盘,QPS 可以非常高
- 推送驱动:通过 MD5 比对判断配置是否变更,变更才推送
- 集群一致:所有节点共享 MySQL,Dump 保证各节点缓存与 DB 一致
12.2 DumpService — 核心抽象类
12.2.1 构造函数 — 初始化任务管理器
public abstract class DumpService {
private TaskManager dumpTaskMgr;
private TaskManager dumpAllTaskMgr;
public DumpService(...) {
this.processor = new DumpProcessor(configInfoPersistService,
configInfoGrayPersistService);
this.dumpAllProcessor = new DumpAllProcessor(configInfoPersistService);
this.dumpTaskMgr = new TaskManager("com.alibaba.nacos.server.DumpTaskManager");
this.dumpTaskMgr.setDefaultTaskProcessor(processor);
// 监听 ConfigDataChangeEvent → 触发增量 Dump
NotifyCenter.registerSubscriber(new Subscriber() {
@Override
public void onEvent(Event event) {
if (event instanceof ConfigDataChangeEvent) {
ConfigDataChangeEvent evt = (ConfigDataChangeEvent) event;
DumpRequest dumpRequest = DumpRequest.create(
evt.dataId, evt.group, evt.tenant,
evt.lastModifiedTs, NetUtils.localIp());
dumpRequest.setGrayName(evt.grayName);
dump(dumpRequest);
}
}
});
}
}
12.2.2 dumpOperate() — 启动时的核心流程
protected void dumpOperate() throws NacosException {
// ① 启动时全量 Dump 所有正式配置
dumpAllConfigInfoOnStartup(dumpAllProcessor);
// ② 启动时全量 Dump 所有灰度配置
dumpAllGrayConfigInfoOnStartup(dumpAllGrayProcessor);
// ③ 非单机模式下,启动定时任务
if (!EnvUtil.getStandaloneMode()) {
// 定时全量 Dump(每 6 小时一次,兜底防止增量遗漏)
// 定时增量 Dump(只处理最近变更的配置)
}
}
🔒 解锁完整内容
本章剩余内容需要解锁后查看
以上仅为本章部分预览内容,完整内容包含更多深度源码解析、实战代码和面试要点。
加入知识星球你将获得:
- ✅ 全部 17 章完整内容 + 持续更新
- ✅ 配套源码 + 实战项目
- ✅ 一对一答疑 + 面试辅导
- ✅ 简历优化 + 内推机会
📚 本章完整目录
以下为本章完整目录结构,加入知识星球即可解锁全部内容。