Nacos Config 模块启动做的事情
Nacos Config
模块有一个特点,会将数据库中的配置信息,dump
成文件,通过直接文件读取的方式,替代直接读取数据库,降低数据库的压力,是的数据库可以更好的处理写操作
1 |
|
举一个Dump
操作的任务——dumpConfigInfo(dumpAllProcessor)
1 | private void dumpConfigInfo(DumpAllProcessor dumpAllProcessor) |
在上面的代码中,看到了这段代码
1 | DumpChangeProcessor dumpChangeProcessor = new DumpChangeProcessor(this, beforeTimeStamp, TimeUtils.getCurrentTime()); |
这段代码和nacos config
模块的快速启动机制有关,来看下这个处理器具体做了什么
1 |
|
来看看这个dumpChange(...)做了什么事情
1 | static public boolean dumpChange(String dataId, String group, String tenant, String content, long lastModifiedTs) { |
为什么执行一次这个ConfigService.reloadConfig()
操作?
其实这一块,是nacos config
模块自己采用配置管理的功能的体现,通过将一些配置进行管理,使得nacos config
模块的内部一些功能可以根据用户设置的参数动态变化
1 | static public void reloadConfig() { |
为什么要Dump
配置成文件
数据库其实是config manager
组件的瓶颈,数据库最大并发程度,限制了配置管理组件能够承担的最大客户端查询配置并发度,因此,需要采取一定的缓存策略,降低查询直接打在数据库上,提高数据库的可用性
直接存在内存 Map 中可不可以?
如果说配置文件信息很小以及配置文件数量很少的情况下,可以考虑直接缓存在内存的 Map 数据结构中,但是当配置文件信息内容太大时,这个时候,就不适合放在内存的 Map 中了,而是需要考虑采用外部存储来缓存起来,但是本着稳定的原则,能不依赖外部组件就不依赖外部组件,因此,nacos
采取了磁盘文件缓存的方式,同时内存 Map 负责存储每个配置文件的元数据信息,
Apollo 的不足
1 | public ConfigFileController( |
Apollo
的缓存策略,是采取了guava
的Cache
的实现,本质还是一个内存的Map
,只是多了过期算法,使得缓存能够稳定在某个具体的内存占用上限,但是也有相应的缺陷,由于是采用内存过期存储Map
+ 数据库直查的方式,容易出现大量的缓存失效时,大量的数据查询操作直接打在数据库上,有可能