zoukankan      html  css  js  c++  java
  • 对Item中定时器的理解

    一、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依赖

     1 <dependency>
     2    <groupId>com.taobao.diamond</groupId>
     3    <artifactId>diamond-client</artifactId>
     4    <version>3.6.9.2</version>
     5 </dependency>
     6 
     7 <dependency>
     8   <groupId>com.alibaba.dts</groupId>
     9   <artifactId>dts-client</artifactId>
    10   <version>0.0.3.9</version>
    11 </dependency>

    2.spring中配置Diamond

     1 <bean id="jobSwitch" class="com.taobao.cun.item.diamond.JobSwitch"></bean>
     2 <!-- diamond配置 -->
     3 <bean id="deleteLogConfigManager" class="com.taobao.cun.item.diamond.ConfigManager"
     4         init-method="init">
     5         <property name="dataId" value="cuntaoic-timer-configure"></property>
     6         <property name="groupId" value="timer-group"></property>
     7         <property name="receivers">
     8             <map>
     9                 <entry key="allSellerCheckOpen" value-ref="jobSwitch"></entry>
    10                 <entry key="pullDownAllProductOpen" value-ref="jobSwitch"></entry>
    11             </map>
    12         </property>
    13 </bean>

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

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

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

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

    三、Job任务开发

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

     1 public class DeleteLogJob implements SimpleJobProcessor {
     2 
     3     public ProcessResult process(SimpleJobContext context) {
     4         try {
     5             Runtime.getRuntime().exec("rm -rf /home/admin/logs/*.log");
     6         } catch (IOException e) {
     7             e.printStackTrace();
     8         }
     9         return new ProcessResult(true);//true表示执行成功,false表示失败
    10     }
    11 
    12 }

    2.在后台进行Job配置

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

    四、测试与发布

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

  • 相关阅读:
    python之os模块
    python之字符串
    python之爬虫(beautifulsoup)
    python之常见算法
    python之装饰器(类装饰器,函数装饰器)
    python之mock使用,基于unittest
    python之定时器
    python基础语法随记
    redis基础
    移动端页面开发(二)
  • 原文地址:https://www.cnblogs.com/cloudml/p/4721395.html
Copyright © 2011-2022 走看看