一、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开发相关命名规范

    JAVA文件命名规范 1.类命名 抽象类以 Abstract 或者 Base 开头.异常类以 Exception 作为后缀.枚举类以 Enum 作为后缀.工具类以 Utils 作为后缀(相应的包名最后 ...

  2. CSS边框外的小三角形+阴影效果的实现。

    ...虽然是一个很小的问题,但其实还是挺实用的. 实现一个边框外的角. 用纯CSS来写. 一开始实现的效果是这个样子的. 但是这个效果没有办法给他附带阴影,所以换了一种写法.实现成了这个样子 想要实现 ...

  3. Bash脚本编写初体验

    上周例会的时候,冷不丁的接到了维护原有的安装脚本和编写升级.卸载脚本的任务,PM和几个同事一本正经的说,一天甚至30分钟就可以精通shell脚本编写,哪怕没有语言基础也可以. 当然,作为有着C++.P ...

  4. linux ls 命令

    ls 命令是 Linux 下最常用的命令之一,用来查询目录下的内容(list directory contents).本文将介绍其基本的用法和一些典型的用例.笔者使用的测试环境为 ubuntu 16. ...

  5. mysql转ElasticSearch的案例分析

    前言 最近工作中在进行一些技术优化,为了减少对数据库的压力,对于只读操作,在程序与db之间加了一层-ElasticSearch.具体实现是db与es通过bin-log进行同步,保证数据一致性,代码调用 ...

  6. Junit单元测试实例

    1.非注解 public class Test { @org.junit.Test public void testPrice() { ClassPathXmlApplicationContext b ...

  7. ios 初体验<窗口的创建>

    1. 创建工程,这步很简单,百度下即可,在info.plist 里面 去掉 Main 的 ,便于新手练习ios,创建ios工程后,在AppDelegate.m,里面的方法application 加上几 ...

  8. window.onerror 应用实例

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp75   window.onerror = function(sMessa ...

  9. 实现Spring RESTful服务的SSL

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt386 本文介绍如何让基于Spring的REST服务变得SSL/TSL化. 首 ...

  10. asp.net core 2.0 web api基于JWT自定义策略授权

    JWT(json web token)是一种基于json的身份验证机制,流程如下: 通过登录,来获取Token,再在之后每次请求的Header中追加Authorization为Token的凭据,服务端 ...