Diamond架构解析

Diamond主要提供持久配置的发布和订阅服务,最大特点是结构简单,稳定可靠。主要的使用场景:TDDL使用Diamond动态切换数据库,动态扩容等;业务使用Diamond推送系统开关配置。Diamond产品专注于高可用性,基于此在架构、容灾机制、数据获取模型上有一些与同类产品的不同之处——阿里巴巴Diamond介绍

diamond架构图

无标题2.png

配置信息存放在哪里

无标题3.png

gourp_info表存组的信息,组的概念是用来区分不同环境的(奇怪的是,阿里开源出来的Diamond并未使用到这个表~~)
config_info表用来存放具体的配置信息

数据保存逻辑

diamond3.png

对应的AdminController的postConfig方法,保存顺序:数据库->更新md5cache->本地磁盘->通知其他节点更新;

md5cache是用ConcurrentHashMap存储的,key是group/dataId,
value是content的md5字符串,MD5类是单例的,对数据进行md5的算法加了锁。客户端来请求配置信息(带着group和dataId),服务端会查看内存中的md5cache是否有对应的配置信息(内存中取值,速度快)

通知其他节点更新的方式:首先获取node.properties保存的地址,然后通过http方式发送请求。
其它节点从数据库获取最新配置信息然后保存到本机磁盘上

客户端和服务端如何交互

diamond4.png
diamond5.png

  • 利用工厂类DiamondClientFactory创建单例订阅者类。
  • 将客户端创建的侦听器类添加到侦听器管理list中并注入到新创建的订阅者类中。
  • 为订阅者设置dataId和groupId。
  • 启动订阅者线程,开始轮询消息。

配置变更客户端如何感知

diamond6.png

  • 方法内部启动一个定时线程,客户端第一次启动60秒后执行一次获取最新配置信息,后续默认每隔15秒执行一次
  • 方法内部实际上三个主方法分别是:

    checkLocalConfigInfo:主要是检查本地数据是否有更新,如果没有则返回,有则返回最新数据,并通知客户端配置的listener。

    checkDiamondServerConfigInfo:远程调用服务端,获取最新修改的配置数据并通知客户端listener。

    checkSnapshot:主要是持久化数据信息用的方法。

Diamond缺陷及改进思路

  • 界面过于简单、不够美观
  • 权限控制不够精细
  • 没有灰度发布功能
  • 配置信息变更无法及时生效