一、Diamond介绍

Diamond主要提供持久配置的发布和订阅服务,最大特点是结构简单,稳定可靠。

主要的使用场景:TDDL使用Diamond动态切换数据库,动态扩容等;业务使用Diamond推送系统开关配置。

架构如下:

发布或者更新配置数据时,步骤如下:

  • 写入MySql数据库
  • 写本地磁盘
  • 通知集群其他机器去数据库dump更新的数据

订阅方获取配置数据时,直接读取服务端本地磁盘文件,尽量减少对数据库压力。 这种架构用短暂的延时换取最大的性能和一致性,一些配置不能接受延时的情况下,通过API可以获取数据库中的最新配置。

数据获取模型:

客户端采用推拉结合的策略在长连接和短连接之间取得一个平衡,让服务端不用太关注连接的管理,又可以获得长连接的及时性。

  • 客户端发起一个对比请求到服务端,请求中包含客户端订阅的数据的指纹
  • 服务端检查客户端的指纹是否与最新数据匹配
    • 如果匹配,服务端持有连接
    • 如果30秒内没有相关数据变化,服务端持有连接30秒后释放
    • 如果30秒内有相关数据变化,服务端立即返回变化数据的ID
  • 如果不匹配,立即返回变化数据的ID
  • 客户端根据变化数据的ID去服务端获取最新的内容

Diamond通过这种推拉结合的方式,让客户端逻辑尽量简单,而且高效。

二、Diamond和DTS接入

接入步骤:

0.生成dts的groupId

在[国内测试集群] 日常、二套:http://ops.jm.taobao.net/dts-console/中创建dts分组

1.引入diamond-client和dts-client的maven依赖

 <dependency>
<groupId>com.taobao.diamond</groupId>
<artifactId>diamond-client</artifactId>
<version>3.6.9.2</version>
</dependency> <dependency>
<groupId>com.alibaba.dts</groupId>
<artifactId>dts-client</artifactId>
<version>0.0.3.9</version>
</dependency>

2.spring中配置Diamond

 <bean id="jobSwitch" class="com.taobao.cun.item.diamond.JobSwitch"></bean>
<!-- diamond配置 -->
<bean id="deleteLogConfigManager" class="com.taobao.cun.item.diamond.ConfigManager"
init-method="init">
<property name="dataId" value="cuntaoic-timer-configure"></property>
<property name="groupId" value="timer-group"></property>
<property name="receivers">
<map>
<entry key="allSellerCheckOpen" value-ref="jobSwitch"></entry>
<entry key="pullDownAllProductOpen" value-ref="jobSwitch"></entry>
</map>
</property>
</bean>

初始化SpringContext时,执行ConfigManager的init方法初始化Diamond,通过Diamond.addListener(dataId, groupId, managerListener)注册监听器,监听器的作用是用于监听服务端数据的变化,client端会定时的向服务端检测数据的变化,当数据变化时,会及时返回给client。监听器中,提供了处理新数据的回调方法receiveConfigInfo。

 Diamond.addListener(dataId, groupId, new ManagerListener() {
public void receiveConfigInfo(String configInfo) {
try {
processConfig(configInfo);
} catch (IOException e) {
log.error("processConfig error", e);
}
} public Executor getExecutor() {
return null;
}
});
processConfig(configInfo)方法处理配置服务中心更新的配置信息,这里获取的是作业开关的关闭状态

3.spring中配置DTS任务调度框架

 <bean id="dtsClient" class="com.alibaba.dts.client.DtsClient"
init-method="init">
<property name="groupId">
<value>${cuntao.ic.timer.dts.group.id}</value><!--此处填写控制台创建分组后生成的分组ID -->
</property>
</bean>

三、Job任务开发

1.在这里定时钟任务开发只需实现SimpleJobProcessor接口,如下文的删除日志Job

 public class DeleteLogJob implements SimpleJobProcessor {

     public ProcessResult process(SimpleJobContext context) {
try {
Runtime.getRuntime().exec("rm -rf /home/admin/logs/*.log");
} catch (IOException e) {
e.printStackTrace();
}
return new ProcessResult(true);//true表示执行成功,false表示失败
} }

2.在后台进行Job配置

在定时表达式中输入:0 0 1 * * ?,这样就可以在每天的凌晨1点执行删除任务了

四、测试与发布

参照杨威的文档cuntaoic定时钟开发规范

对Item中定时器的理解的更多相关文章

  1. Scrapy基础(十)———同步机制将Item中的数据写在Mysql

      前面讲解到将Item中的所有字段都已经填写完成,那么接下来就是将他们存储到mysql数据库中,那就用到了pipeline项目管道了:  对项目管道的理解:做一个比喻,爬取好比是开采石油,Item装 ...

  2. Scrapy基础(九)————将不定长度的URL进行固定长度写入Item中

    前面讲到将每篇文章的URL写入Item,但是每个url的长度是不同的,可以在Item中设置一个字段怎样使得每个URL的长度相同,这就需要对每个URL进行md5运算,使得长度统一,再加入到设定的Item ...

  3. Java中hashcode的理解

    Java中hashcode的理解 原文链接http://blog.csdn.net/chinayuan/article/details/3345559 怎样理解hashCode的作用: 以 java. ...

  4. Java中定时器Timer致命缺点(附学习方法)

    简介 这篇文章我一直在纠结到底要不要写,不想写一来因为定时器用法比较简单,二来是面试中也不常问.后来还是决定写了主要是想把自己分析问题思路分享给大家,让大家在学习过程中能够参考,学习态度我相信大部分人 ...

  5. Fouandation(NSString ,NSArray,NSDictionary,NSSet) 中常见的理解错误区

    Fouandation 中常见的理解错误区 1.NSString //快速创建(实例和类方法) 存放的地址是 常量区 NSString * string1 = [NSString alloc]init ...

  6. linux中socket的理解

    对linux中socket的理解 一.socket 一般来说socket有一个别名也叫做套接字. socket起源于Unix,都可以用“打开open –> 读写write/read –> ...

  7. Unity3D中定时器的使用

    源地址:http://unity3d.9tech.cn/news/2014/0402/40149.html 在游戏设计过程中定时器是必不可少的工具,我们知道update方法是MonoBehavior中 ...

  8. ListView item 中TextView 如何获取长按事件

    昨天晚上小伙伴突然来信, ListView item中嵌套的TextView 无法获取长按事件 从前从来没有仔细留意过, coding后发现...果然没什么动静 而且没有合适的API让我调用获取Tex ...

  9. 谈谈我对Java中CallBack的理解

    谈谈我对Java中CallBack的理解 http://www.cnblogs.com/codingmyworld/archive/2011/07/22/2113514.html CallBack是回 ...

随机推荐

  1. Java基础---IO(一)---IO流概述、字符流、字节流、流操作规律

    第一讲     IO概述 概述 1.IO流:即InputOutput的缩写. 2.特点: 1)IO流用来处理设备间的数据传输. 2)Java对数据的操作是通过流的方式. 3)Java用于操作流的对象都 ...

  2. .NET CORE 学习笔记之安装EF【Microsoft.EntityFrameworkCore】扩展报错

    最近在学习.NET CORE ,刚开始就遇到问题了. 安装EF框架的试试就报错, 报错如下: 错误 程序包还原失败.正在回滚“XXX”的程序包更改. 找了好久的方案,网上也没搜到对应的问题和方案,然而 ...

  3. Redis集群的相关概念

    1.1 redis-cluster架构图 架构细节: (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽. (2)节点的fail是通过集群中超过半数的节 ...

  4. OCUpload的简单介绍与使用

     OCUpload (One Click Upload)译成中文就是一键上传的意思.它是JQuery的一个插件.   对于传统的文件上传,只能通过form表单,将enctype设置为multipart ...

  5. jQuery控制a标签不可点击 不跳转

    jquery禁用a标签方法1 01 02 03 04 05 06 07 08 09 10 11 12 $(document).ready(function () {         $("a ...

  6. chrome开发工具指南(四)

    Sources 面板中 代码段是您可以从任何页面运行的小脚本(类似于小书签). 使用"Evaluate in Console"功能可以在控制台中运行部分代码段. 请注意,Sourc ...

  7. Windows 2012建立域控(AD DS)详解

    Active Directory概述:          使用 Active Directory(R) 域服务 (AD DS) 服务器角色,可以创建用于用户和资源管理的可伸缩.安全及可管理的基础机构, ...

  8. JAVA基础-集合(一)

    一.结构 Collection接口为一些单列集合的根接口,其常用子接口为List接口.Set接口.List接口常用实现子类为ArrayList(数组)LinkedList(链表).Set接口常用实现子 ...

  9. webStrom2017.1版本如何添加vue.js插件

    第一步:打开webStrom-setting 第二步:选择File and Code Templates--点击左上角"+"号 第三步:在Name:vue File    Exte ...

  10. Linux — 用户组、权限

    Linux 用户组分为:所有者.所在组.其他组 所有者:谁创建,谁是所有者.命令:ls -al 所在组:当创建文件或者文件夹时,这个文件或者文件夹所分配到的用户组,这样就会有效地隔离文件. 其他组:和 ...