特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过。如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/mao2080/

大家好,通过第一篇的快速使用,大家已经对diamond有了一个基本的了解。本次为大家带来的是diamond核心原理的介绍,主要包括server集群的数据同步、client获取server地址、client从server获取数据、client运行时感知server的数据变化,这四部分。

一、server集群数据同步

diamond-server将数据存储在mysql和本地文件中,mysql是一个中心,diamond认为存储在mysql中的数据绝对正确,除此之外,server会将数据存储在本地文件中。

同步数据有两种方式:

(1)server写数据时,先将数据写入mysql,然后写入本地文件,写入完成后发送一个HTTP请求给集群中的其他server,其他server收到请求,从mysql中dump刚刚写入的数据至本地文件。

(2)server启动后会启动一个定时任务,定时从mysql中dump所有数据至本地文件。

二、client获取server地址

diamond-client在使用时没有指定server地址的代码,地址获取对用户是透明的。

server地址存储在一台具有域名的机器上的HTTPserver中,我们称它为地址服务器,diamond-client使用前需要在本地进行正确的域名绑定,启动时它会根据域名绑定,去对应环境的地址服务器上获取diamond-server地址列表。

获取的地址列表,会保存在client本地,当出现网络异常,无法从网络获取地址列表时,client会使用本地保存的地址列表。

client启动后会启动一个定时任务,定时从HTTPserver上获取地址列表并保存在本地,以保证地址是最新的。

三、client主动获取数据

client调用getAvailableConfigInfomation(),即可获取一份最新的可用的配置数据,获取过程实际上是拼接httpurl,使用http-client调用httpmethod的过程。

为了避免短时间内大量的获取数据请求发向server,client端实现了一个带有过期时间的缓存,client将本次获取到的数据保存在缓存中,在过期时间内的所有请求,都返回缓存内的数据,不向server发出请求。

四、client运行中感知数据变化

这是diamond最为核心的一个功能。

这个特性是通过比较client和server的数据的MD5值实现的。

server在启动时,会将所有数据的MD5加载到内存中(MD5根据某算法得出,保证数据内容不同,MD5不同,MD5存储在mysql中),数据更新时,会更新内存中对应的MD5

client在启动并第一次获取数据后,会将数据的MD5保存在内存中,并且在启动时会启动一个定时任务,定时去server检查数据是否变化。每次检查时,client将MD5传给server,server比较传来的MD5和自身内存中的MD5是否相同,如果相同,说明数据没变,返回一个标示数据不变的字符串给client;如果不同,说明数据变了,返回变化数据的dataId和group给client.client收到变化数据的dataId和group,再去server请求一次数据,拿回数据后回调监听器。

原文地址:http://aliapp.blog.51cto.com/8192229/1328021

最新文章

  1. WindowsAPI调用和OCR图片识别
  2. Eclispe怎么给工作空间下的项目分组
  3. iOS_autoLayout_Masonry
  4. Lintcode: Recover Rotated Sorted Array
  5. PHP 实现多服务器共享 SESSION 数据
  6. Java [leetcode 28]Implement strStr()
  7. jQuery 效果 - 淡入淡出
  8. Android 图片选择器
  9. MarkDown使用 (二)矩阵
  10. Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别
  11. Python 2.7版本与3.6的不同
  12. SPP空间金字塔池化技术的直观理解
  13. MapReduce 踩坑 :Aggregation is not enabled. Try the nodemanager at IP:HOST
  14. 分享我对JS插件开发的一些感想和心得
  15. java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy解决方法
  16. IconFont使用指南
  17. POI中文API文档
  18. 【BZOJ1303】[CQOI2009]中位数图(模拟)
  19. VS2008中MFC对话框界面编程Caption中文乱码的解决办法
  20. windows 7 下安装 vagrant + Oracle VM VirtualBox

热门文章

  1. Elasticsearch入门教程(六):Elasticsearch查询(二)
  2. div+css布局教程(1)
  3. 第四篇 jQuery中的事件与应用
  4. windows下一步到位搭建pycharm的开发环境
  5. Flask与微信小程序登录(后端)
  6. Java---- 静态内部类与非静态内部类的区别
  7. 4G漏洞
  8. CPP标准模板库 随笔
  9. zencart根据configuration_id cID查找站点配置
  10. datax二次开发