GitHub - ihaolin/antares: 分布式任务调度平台(Distributed Job Schedule Platform)

标签: | 发表时间:2018-09-04 14:38 | 作者:
出处:https://github.com

分布式任务调度平台(Distributed Job Schedule Platform) Build Status

Antares特性

基于Quartz的分布式调度

  • 一个任务仅会被服务器集群中的某个节点调度,调度机制基于成熟的 Quartz,antares内部会重写执行逻辑;

并行执行

  • 用户可通过对任务预分片,有效提升任务执行效率;

失效转移

  • 客户端实效转移:当某个客户端实例在执行任务中宕机时,其正在执行的分片将重新由其他客户端实例执行;

  • 服务器失效转移:当服务器集群中某个节点宕机时,其正在调度的任务将转移到其他节点去调度;

弹性扩容

  • 客户端扩容:客户端可通过增加应用实例,提升任务执行的效率;
  • 服务器扩容:服务器集群可通过增加节点,提升集群任务调度的服务能力;

进程级的应用实例

  • antares通过ip+进程号标识客户端应用实例,因此支持单机多应用实例部署;

任务依赖

  • antares支持树形任务依赖,当某任务执行完成后,会通知其后置任务执行;

任务报警

  • antares支持基本的任务超时报警,失败报警等;

管理控制台

  • 用户可通过控制台antares-tower对任务进行基本操作,如触发,暂停,监控等。

Demo

在线Demo(用户名/密码:admin/admin123)。

名称术语

  • 应用(App)

    用于标识或分组,如用户服务,订单服务等;

  • 应用实例(App Instance)

    某应用下的客户端实例,即某个进程实例;

  • 任务(Job)

    即被调度的实体,仅会由某一服务器节点调度;

  • 任务实例(Job Instance)

    每当任务被触发时,则会生产一个任务实例,执行完成后,则为任务历史;

  • 任务分片(Job Instance Shard)

    即任务的预分片配置,包含分片数和分片参数,用户可通过客户端实例执行任务时被分配的分片项及其分片参数,自己实现分片逻辑;

  • 分片项(shardItem)、分片参数(shardParam)

    分片项(shardItem),即当应用实例任务执行时,被分配的任务下标,从0开始;分片参数,即任务下标对应的配置参数。

应用场景

通常,对于有以下场景或需求时,可以考虑使用分布式任务调度:

  • 需要保证任务执行的高可用性:即当执行任务的应用实例崩溃后,其他应用实例可以继续执行该任务;

  • 要求任务执行效率足够高:在业务数据量级比较大时,可以使用预分片配置来将数据进行逻辑分片,使得多个应用实例能并行执行任务分片,以提升任务的执行效率。

Antares架构

Antares整体架构

antares-arch.png

Antares中的任务状态机

job-state-machine.png

快速开始

环境准备

编译打包

  • 下载最新的压缩包;

  • 或者通过源码构建:

     mvn clean package -DskipTests -Prelease

安装服务器( antares-server)

  • 解压安装包:

     tar zxf antares-server-{version}.tar.gz
     ll antares-server-{version}
     bin		# 执行脚本
     conf	# 配置目录
     lib		# 依赖包
  • 编辑配置文件 antares.conf

     # 服务器绑定的IP
     BIND_ADDR=127.0.0.1
     
     # 服务器的监听端口
     LISTEN_PORT=22122
     
     # Redis主机地址
     REDIS_HOST=127.0.0.1
     
     # Redis主机端口
     REDIS_PORT=6379
     
     # Redis的数据键前缀
     REDIS_NAMESPACE=ats
     
     # 日志目录,相对或绝对路径
     LOG_PATH=./logs
     
     # Zookeeper地址
     ZK_SERVERS=127.0.0.1:2181
     
     # Zookeeper命名空间
     ZK_NAMESPACE=ats
     
     # 服务器宕机后,启动Failover前的等待时间(单位为秒,通常大于服务器正常重启的时间,避免因为重启服务器,导致不必要的Failover)
     SERVER_FAILOVER_WAIT_TIME=30
     
     # 调度器的线程数
     SCHEDULE_THREAD_COUNT=32
     
     # JVM堆参数
     JAVA_HEAP_OPTS="-Xms512m -Xmx512m -XX:MaxNewSize=256m"
  • 启动/关闭/重启服务器:

     ./bin/antares.sh start
     ./bin/antares.sh stop
     ./bin/antares.sh restart

安装控制台( antares-tower)

  • 解压安装包:

     tar zxf antares-tower-{version}.tar.gz
     ll antares-tower-{version}
     bin		# 执行脚本
     conf	# 配置目录
     lib		# 依赖包
  • 编辑配置文件 antares.conf

     # 控制台绑定的IP
     BIND_ADDR=127.0.0.1
     
     # 控制台的监听端口
     LISTEN_PORT=22111
     
     # Redis的主机地址
     REDIS_HOST=127.0.0.1
     
     # Redis的端口
     REDIS_PORT=6379
     
     # Redis的数据键前缀
     REDIS_NAMESPACE=ats
     
     # 日志目录,相对或绝对路径
     LOG_PATH=./logs
     
     # Zookeeper地址127.0.0.1
     ZK_SERVERS=127.0.0.1:2181
     
     # Zookeeper命名空间
     ZK_NAMESPACE=ats
     
     # 控制台用户名
     TOWER_USER=admin
     
     # 控制台密码
     TOWER_PASS=admin
     
     # JVM堆参数配置
     JAVA_HEAP_OPTS="-Xms512m -Xmx512m -XX:MaxNewSize=256m"
     
     # 是否开启报警
     ALARM_ENABLE=false
     
     ## 若ALARM_ENABLE=false,下面的配置可以忽略
     
     # 通知类型(暂仅支持邮件)
     # 1:邮件
     ALARM_NOTIFY_TYPE=1
     
     # 报警标题
     ALARM_SUBJECT=Antares任务报警
     
     # 任务超时报警模版,以下四个变量可用,使用{}开头结尾
     ALARM_TEMPLATE_JOB_TIMEOUT=应用【{appName}】的任务【{jobClass}】执行超时,调度服务器为【{scheduler}】:{detail}.
     
     # 任务失败报警模版,以下四个变量可用,使用{}开头结尾
     ALARM_TEMPLATE_JOB_FAILED=应用【{appName}】的任务【{jobClass}】执行失败,调度服务器为【{scheduler}】:{detail}.
     
     ### 邮件配置
     # 邮箱主机
     MAIL_HOST=192.168.0.1
     
     # 发件人邮箱
     [email protected]
     
     # 发件人用户名
     MAIL_FROM_USER=haolin.h0
     
     # 发件人密码
     MAIL_FROM_PASS=123456
     
     # 收件人列表,逗号隔开
     [email protected]
  • 启动/关闭/重启控制台:

     ./bin/antares.sh start
     ./bin/antares.sh stop
     ./bin/antares.sh restart
  • 这样便可以进入控制台(如 http://127.0.0.1:22111),在控制台事先添加应用及任务:

    • 编辑应用:

      app_edit.png

    • 编辑任务:

      job_edit.png

客户端使用

基础知识

  • Job类型:antares支持两种Job类型, DefaultJobScriptJob:

    • DefaultJob为最常用的Job类型,开发人员只需要实现该接口即可,如:

       public class DemoJob implements DefaultJob {
       
           @Override
           public JobResult execute(JobContext context) {
               
               // 可以获取到当前应用实例被分配的分片信息
               // 分片号,从0开始
               context.getShardItem(); 
               // 分片号对应的分片参数
               context.getShardParam();
               
               // 执行任务逻辑...
               // 如有需要,可通过分片信息处理不同的数据集
               // 注意catch异常
               		    
               return JobResult;
           }
       }
    • 实现 DefaultJob的任务类的返回结果有三种类型:

      • JobResult.SUCCESS:分片执行成功;

      • JobResult.FAIL:分片执行失败,可以通过 JobResult.failed(error)返回,可记录对应的错误信息,便于排查问题;

      • JobResult.LATER:重新分配,这将使得当前分片会重新被分配执行。

    • ScriptJob为脚本任务,开发人员只需要继承该类,不需要具体的实现代码,然后配置Job的自定义参数,即为需要执行的命令,如:

       /**
        * 只需继承ScriptJob即可
        */
       public class MyScriptJob extends ScriptJob {
       
       }

      script_job_edit.gif

  • Job分片配置:Job分片配置,主要用于将业务数据进行逻辑分片,需要开发人员自行实现分片逻辑,分片配置只是协助开发人员进行分片,这些配置通常比较有规律,同一应用实例同一时刻只会分配到其中一片,执行完,再拉取其他剩余的任务分片,直到任务执行完成,如:

    job_shard_edit.png

    分片参数由分号隔开,从0开始,每个参数可以是数字,字母或是JSON字符串,比如上面将任务分为3片,这3片对应的参数为0,1,2,我们可以假定将业务数据分为三份,第1份表示记录id % 3 = 0的数据,第2份为记录id % 3 = 1的数据,第3份为记录id % 3 = 2的数据。更常见的场景可能是在分库分表时,同分片参数去划分不同的库或表,当然,如果数据量不大或任务执行的时间可接受,也不用分片。

客户端使用(编程模式)

  • 引入maven包:

     <dependency>
         <groupId>me.hao0</groupId>
         <artifactId>antares-client</artifactId>
         <version>1.4.0</version>
     </dependency>
  • antares-client日志处理使用的是slf4j-api,开发人员只需额外引入其实现即可,如log4j,log4j2,logback等,zookeeper操作主要依赖curator,若有版本冲突,注意解决。

  • 启动SimpleAntaresClient:

     SimpleAntaresClient client = 
     		new SimpleAntaresClient(
     			"dev_app", 			// 应用名称
     			"123456", 			// 应用密钥
     			"127.0.0.1:2181",	// zookeeper地址 
     			"ats"               // zookeeper命名空间
     		);				
     
     // 执行任务的线程数
     client.setExecutorThreadCount(32);
     
     // 启动客户端			
     client.start();
     
     // 创建job实例,需要实现DefaultJob或ScriptJob
     DemoJob demoJob = new DemoJob();
     
     // 注册job
     client.registerJob(demoJob);
     
  • 具体可见 单元测试

客户端使用(Spring模式)

  • 引入maven包:

     <dependency>
         <groupId>me.hao0</groupId>
         <artifactId>antares-client-spring</artifactId>
         <version>1.4.0</version>
     </dependency>
  • 在Spring上下文配置SpringAntaresClient,及其Job实例即可:

     <!-- Spring Antares Client -->
     <bean class="me.hao0.antares.client.core.SpringAntaresClient">
     	<!-- 应用名称 -->
     	<constructor-arg index="0" value="dev_app" />
     	<!-- 应用密钥 -->
     	<constructor-arg index="1" value="123456" />
     	<!-- zookeeper地址 -->
     	<constructor-arg index="2" value="127.0.0.1:2181" />
     	<!-- zookeeper命名空间 -->
     	<constructor-arg index="3" value="ats" />
     	<!-- 执行job的线程数 -->
     	<property name="executorThreadCount" value="32" />
     </bean>
    
     <!-- Job实例 -->
     <bean class="me.hao0.antares.demo.jobs.DemoJob" />
     
     <!-- ... -->
     
  • 具体可见 单元测试

客户端使用(Spring Boot Starter模式)

  • 引入maven包:

     <dependency>
         <groupId>me.hao0</groupId>
         <artifactId>antares-client-spring-starter</artifactId>
         <version>1.4.0</version><!-- 1.3.0+ -->
     </dependency>
  • 在application.yml中引入antares相关配置即可:

     antares:
       appName: myapp
       appSecret: 123456
       zkServers: localhost:2181
       zkNamespace: ats
       executorThreadCount: 32
  • 具体参考可见 antares-demo-spring-starter

Job监听

  • 对于想做一些任务监听的操作,开发人员可选择实现 JobListenerJobResultListner,如:

     public class DemoJob implements DefaultJob, JobListener, JobResultListener {
     	
     	@Override
     	public JobResult execute(JobContext context) {
            return ...
     	}
    
         @Override
         public void onBefore(JobContext context) {
             // 任务执行前调用
         }
         
         @Override
         public void onAfter(JobContext context, JobResult res) {
     	     // 任务执行后调用
         }
     
         @Override
         public void onSuccess() {
             // 任务执行成功后调用
         }
     
         @Override
         public void onFail() {
             // 任务执行失败后调用
         }
     }

使用控制台

应用运行过程中,开发人员便可通过控制台作一些基本操作,如:

  • 应用管理:

  • 任务配置:

  • 任务依赖:

  • 任务管控:

  • 任务历史:

  • 集群管理:

最佳实践

  • 应将任务应用与业务应用独立部署,这两类系统不应相互影响,无论从其属性还是运行环境(如GC)都是有区别的;

  • 对任务配置合理的cron表达式,应保证任务执行的间隔时间大于任务执行的总时间,以免同一时刻同一任务发生多次触发执行(antares同一任务同一时刻,只会有一个实例在执行),其余情况将取决于 Quartz的misfire机制

  • 为了防止任务分片重复执行,应用应尽量保证幂等性;

  • 合理划分应用,单个任务应用的任务数量不宜太多(如2 * executorThreadCount),防止单个应用实例执行任务太多,影响任务执行效率。

相关 [github ihaolin antares] 推荐:

GitHub - ihaolin/antares: 分布式任务调度平台(Distributed Job Schedule Platform)

- -
分布式任务调度平台(Distributed Job Schedule Platform). 基于Quartz的分布式调度. 一个任务仅会被服务器集群中的某个节点调度,调度机制基于成熟的 Quartz,antares内部会重写执行逻辑;. 用户可通过对任务预分片,有效提升任务执行效率;. 客户端实效转移:当某个客户端实例在执行任务中宕机时,其正在执行的分片将重新由其他客户端实例执行;.

Home · JohnLangford/vowpal_wabbit Wiki · GitHub

- -
There are two ways to have a fast learning algorithm: (a) start with a slow algorithm and speed it up, or (b) build an intrinsically fast learning algorithm.

GitHub - jgraph/drawio: Source to www.draw.io

- -
draw.io supports IE 11, Chrome 32+, Firefox 38+, Safari 9.1.x, 10.1.x and 11.0.x, Opera 20+, Native Android browser 5.1.x+, the default browser in the current and previous major iOS versions (e.g.

git和github简介(上)

- linyehui - 没做完,没准备好
在此贴上本人在Web标准化交流会6月25日北京站的主题分享. 在线PPT:http://jinjiang.github.com/slides/learning-git/. PPT源码:https://github.com/Jinjiang/slides/tree/gh-pages/learning-git.

Github使用指南(转)

- - CSDN博客推荐文章
来自:https://github.com/neuola/neuola-legacy/wiki/github%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97. 如果你只是想了解 github 的使用,请跳到 Github 简介一节. 作为程序员大军之一,想必大家有这样的经历吧.

github 上的好东西

- - 收集分享互联网资源
基于HTML5的专业级图像处理开源引擎.

Windows 下 使用TortoiseGit GitHub

- - CSDN博客研发管理推荐文章
TortoiseGit依赖msysgit,首先下载: http://code.google.com/p/msysgit/downloads/detail?name=msysGit-fullinstall-1.8.1.2-preview20130201.exe&can=2&q=. 再下载TortoiseGit: http://code.google.com/p/tortoisegit/wiki/Download?tm=2.

一个 GitHub Trending 小工具

- - IT瘾-dev
Github Trending基本上是我每天都会浏览的网页,上面会及时发布一些GIthub上比较有潜力的项目,或者说每日Star数增量排行榜. 不过由于Github Trending经常会实时更新,即使你访问得再勤,难免还是会错过一些你感兴趣的项目,为此不少人都想出了自己的解决办法,例如. josephyzhou,他的 github-trending项目得到了众多人的青睐,我仔细阅读了他的源码 (Go),发现实现也较为简单, 就用Python 重写了一下,发现代码少了好多,详见 我的 github-trending.

blong/clickhouse .md at master · xingxing9688/blong · GitHub

- -
https://clickhouse.yandex/tutorial.html快速搭建集群参考. https://clickhouse.yandex/reference_en.html官网文档. https://habrahabr.ru/company/smi2/blog/317682/关于集群配置参考.

GitHub 和 GitLab 的故事

- - 胡涂说
2005年,因为 Linux 社区被商业公司撤回了免费试用源码配置管理工具的权利,Linus Torvalds 一怒之下自己花了十天时间开发并发布了分布式源码配置管理工具Git, 虽然当时 Linus 只是想着给 Linux 社区小伙伴们开发个顺手的协作工具,但没想到这款工具将席卷全球,并改变了软件世界.