统一配置中心实现系列-定时任务

目录

一、前言

二、方案汇总

三、基于定时任务的实现

1、基于传统数据库(MySQL)

2、基于分布式数据库(Redis)

3、方案对比

四、惯例


一、前言

之前在介绍"如何实现Log4j在线修改日志级别"的时候,提到了统一配置中心。想必很多在互联网公司的同学们都有使用过统一配置中心。如果是大公司一般都会开发自己专属的统一配置中心,如果是小公司则通常使用开源的。目前来看开源的统一配置中心有很多,比如spring-cloud-config、ctrip apollo、disconf等。然而本系列文章并不打算介绍这些开源的项目,也不打算对其进行对比,而是打算和大家探讨下统一配置中心实现的一些思路和方案。

PS:在小型集群中(如10来台机器),还不如自己实现一个简化版的统一配置中心。方便维护、管理,可以随意定制。

 

二、方案汇总

其实一般业界的统一配置中心不外乎就是下面几种实现方案。

  1. 基于定时任务实现(MySQL or Redis)

  2. 基于 Zookeeper实现(如disconf)

  3. 基于长轮询实现(Netty or Servlet3.0)

  4. 基于Apache Ignite实现(分布式缓存)

     

今天我们先介绍其中最简单的一种:基于定时任务的实现方案。

 

三、基于定时任务的实现

这种方案的思路比较简单,根据不同的介质有两种实现方案:基于传统数据库实现(尽量不高并发),基于分布式数据库(支持高并发,其实这里无需定时任务);

1、基于传统数据库(MySQL)

这几乎是最最最最简单的一种实现了。其不依赖于任何三方组件(当然需要依赖存储介质如MySQL),直接在每台机器上启动一个定时任务(如每5秒执行一次,具体可以根据实际情况配置),然后不断的去拉取数据库中配置的新版本数据,并写入到本地内存即可。与此同时业务代码只需要从本地内存拉取相应的配置数据即可。其具体大致实现流程图如下:

统一配置中心实现系列-定时任务

为了避免每次都拉取所有配置,然后与本地缓存对比,建议配置项新增一个版本号,每次拉取最新的版本号即可

 

2、基于分布式数据库(Redis)

在引入Redis之后,实现就比较简单了,由于Redis能够支持高并发,所以我们完全可以直接将配置放到Redis中,增删改都直接操作Redis中的数据即可。同时机器节点端则可以无需本地缓存,每次读取配置数据的时候直接从Redis读取即可。实现流程图如下:

统一配置中心实现系列-定时任务

这种方案就无需添加版本号。

当然,如果想缓解Redis的压力,也可以像第一种方案一样,使用定时任务从Redis中将新的配置数据拉取到本地内存,然后业务直接从本地内存读取即可。该方法流程图如下:

统一配置中心实现系列-定时任务

 

3、方案对比

第一种方案:无需引入其他三方组件,直接在咱们的Web工程中就可以编码实现。部署维护都很简单,但需要自己实现Timer定时去数据库拉取配置数据,然后再更新到本地缓存,开发相对复杂。

第二种方案:需要引入第三方组件Redis,部署维护相对比较麻烦,但是代码实现比较简单。(如果是其中的Timer方案,是最复杂的实现了。​)

 

四、惯例

如果你对本文有任何疑问或者高见,欢迎添加公众号共同交流探讨(添加公众号可以获得”Java高级架构“上10G的视频和图文资料哦)。

统一配置中心实现系列-定时任务