架构设计
Diamond架构由三部分组成:ConfigServer、DataServer和MySql存储,如下图所示:
ConfigServer:管理DataServer集群,将客户端与DataServer集群解耦,上下线、扩容对客户端不感知;
DataServer:提供配置的持久化管理、动态推送等服务;
MySql存储:配置数据的持久化存储,采用一主两备的部署方式保障数据的安全;
Write流程
DataServer接受到写请求后,首先将配置数据持久化到DB,然后将配置数据变更事件异步广播到集群所有机器,包括自己在内,如下图所示:
注意:主备切换期间,写服务不可用;
Read流程
高可靠性:完善的容灾机制
- DB主备容灾,Master挂掉后自动切换到备库,继续提供读写服务;
- DB主备全部挂掉后,通过服务端本地缓存,仍可提供读服务;
- DB和服务端全部挂掉后,通过客户端容灾目录下的缓存,仍可提供读服务;
高性能
1. 高吞吐量
思路:本地缓存+Zero Copy。首先,每台服务器以本地磁盘文件的形式缓存全量配置数据;这样每次读请求就是一次静态文件请求,使用Zero Copy提高吞吐量,伪代码如下所示:
//本地缓存配置文件
FileInputStream fis = new FileInputStream(file);
//使用Zero Copy将文件写入response
fis.getChannel().transferTo(0L, fis.getChannel().size(),
Channels.newChannel(response.getOutputStream()));
2. 实时推送
采用长轮询方式实现配置数据的实时推送,原理与DPS方案相似,如下图所示:
疑问
- 为什么没采用长连接的方式实现实时推送?;
- 数据库为什么采用一主两备部署方式?
- 数据库主备间的同步方式(全异步、半同步和全同步)?如果采用全异步方式,如何避免数据丢失?