开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架

今天给大家介绍一个比较小众的一个定时任务框架。由于一些历史项目,或者已经上线的项目可能会选型了这个定时任务,据说当时是阿里巴巴的大佬开源的项目,当时还是比较流行的。应该是被最近市面上面比较流行的XXL-Job,Quartz,elastic-job占领,所以这个框架并没有普及开来。我个人猜测的一些原因是:一、因为社区不够活跃,参与贡献的人比较少,二、是网上的资料不多,三、入门的资料比较少,有很多刚刚接触的人不知道从何处入手,或者说不知道如何进行部署以及验证。

但是今天我介绍的并不是以上几种。而是LTS定时任务框架,刚接手的时候也是一脸懵,这是啥框架,好像之前没有怎么听说,也没有用过,问了周围的同学有没有接触,都说只是用过,没有多大深入的了解。我查看了下源码,这个框架看Gitee上面是6年没更新,支持的是Mysql5.7+,但是现在要对这个框架进行升级到支持Mysql8+。想过转换成xxl-job框架,其实就是部署之后,转换以下现有的定时任务到xxl-job上面。但是存在多个项目,不懂后续还是需要比较多的一些工作量,后面看了下lts的源码,升级就修改对应的驱动,好像也还可以,那么只能硬着头皮来从零学习一番了,下面是记录一下学习的过程,让需要的同学少走弯路。

那么本文一起认识这个框架以及着手本地搭建环境来体验一番。

LTS 初步认识

LTS 是什么?

LTS 是啥,不知道描述的是啥,后面查询了下原来是:light-task-scheduler 的缩写。

LTS(light-task-scheduler 的缩写。) 是一个分布式任务调度框架,支持设置节点组搭建多节点集群水平拓展框架架构,提供多种任务类型包括实时任务、定时任务、corn任务的支持, 主要用于系统中的任务调度以及调度信息监控等。有较好的伸缩性,扩展性,健壮稳定性而被多家公司使用。

以下是我部署后,后台截图的节点管理的截图:

开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架


LTS 源码地址

  • github地址: https://github.com/ltsopensource/light-task-scheduler
  • gitee地址: https://gitee.com/hugui/light-task-scheduler
  • lts 使用例子: https://github.com/ltsopensource/lts-examples
  • 开发文档:https://qq254963746.gitbooks.io/lts/content/

LTS 技术架构说明

LTS目前支持四种任务:

  • 实时任务:提交了之后立即就要执行的任务。
  • 定时任务:在指定时间点执行的任务,譬如 今天3点执行(单次)。Cron任务:
  • CronExpression,和quartz类似(但是不是使用quartz实现的)譬如 0 0/1 * ?
  • Repeat任务:譬如每隔5分钟执行一次,重复50次就停止。

架构设计上,LTS框架中包含以下五种类型的节点:

  • JobClient:主要负责提交任务, 并接收任务执行反馈结果。
  • JobTracker:负责接收并分配任务,任务调度。
  • TaskTracker:负责执行任务,执行完反馈给JobTracker。
  • LTS-Monitor :主要负责收集各个节点的监控信息,包括任务监控信息,节点JVM监控信息
  • LTS-Admin:(管理后台)主要负责节点管理,任务队列管理,监控管理等。

LTS的这五种节点都是无状态的,都可以部署多个,动态扩容,来实现负载均衡,实现更大的负载量, 并且框架采用FailStore策略使LTS具有很好的容错能力。

架构图如下:

开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架

  • Registry 注册中心

LTS提供多种实现,目前支持zookeeper(推荐)和redis, 主要用于LTS的节点信息暴露和master节点选举。

  • FailStore 失败存储

主要用于在部分场景远程RPC调用失败的情况,采取现存储本地KV文件系统,待远程通信恢复的时候再进行数据补偿。

目前FailStore场景,主要有RetryJobClient提交任务失败的时候,存储FailStore;TaskTracker返回任务执行结果给JobTracker的失败 时候,FailStore;TaskTracker提交BizLogger的失败的时候,存储FailStore.

目前FailStore有四种实现:leveldb,rocksdb,berkeleydb,mapdb(当然用户也可以实现扩展接口实现自己的FailStore)

  • QueueManager:任务队列

目前提供mysql(推荐)和mongodb两种实现(同样的用户可以自己扩容展示其他的,譬如oracle等),主要存储任务数据和任务执行日志等。

  • RPC:远程RPC通信框架

目前也支持多种实现,LTS自带有netty和mina,用户可以自行选择,或者自己SPI扩展实现其他的。

  • NodeGroup:节点组

同一个节点组中的任何节点都是对等的,等效的,对外提供相同的服务。譬如TaskTracker中有10个nodeGroup都是send_msg的节点组,专门执行发送短信的任务。

每个节点组中都有一个master节点,这个master节点是由LTS动态选出来的,当一个master节点挂掉之后,LTS会立马选出另外一个master节点,框架提供API监听接口给用户。

  • ClusterName:LTS集群

LTS集群,就如上图所示,整个图就是一个集群,包含LTS的五种节点。

LTS 功能清单说明

功能 描述
节点管理 节点管理,节点组管理,支持分布式,避免单点故障,支持动态扩容,容错重试,节点监控、多节点任务单一执行、故障转移
任务队列管理 支持任务添加,Cron任务,Repeat任务,查看执行任务日志,暂定任务执行,等待执行任务记录,手动加载任务日志,支持按照条件筛选,支持后台动态添加任务 Spring扩展支持,SpringBoot支持,Spring Quartz Cron任务的无缝接入支持
日志管理 日志列表,支持按照条件查询 ,节点上下线日志
监控报警 JobTracker数据监控,TaskTracker数据监控,JobClient数据监控
开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架

概念说明

节点组

  1. 英文名称 NodeGroup,一个节点组等同于一个小的集群,同一个节点组中的各个节点是对等的,等效的,对外提供相同的服务。
  2. 每个节点组中都有一个master节点,这个master节点是由LTS动态选出来的,当一个master节点挂掉之后,LTS会立马选出另外一个master节点,框架提供API监听接口给用户。

FailStore

  1. 顾名思义,这个主要是用于失败了存储的,主要用于节点容错,当远程数据交互失败之后,存储在本地,等待远程通信恢复的时候,再将数据提交。

  2. FailStore主要用户JobClient的任务提交,TaskTracker的任务反馈,TaskTracker的业务日志传输的场景下。

  3. FailStore目前提供几种实现:leveldb,rocksdb,berkeleydb,mapdb,ltsdb,用于可以自由选择使用哪种,用户也可以采用SPI扩展使用自己的实现。

LTS架构源码目录介绍



lts-core 核心代码,其他的模块依赖的基础包
lts-jobtracker 负责接收并分配任务,任务调度。
lts-tasktracker 负责执行任务,执行完反馈给JobTracker。
lts-jobclient 主要负责提交任务, 并接收任务执行反馈结果
lts-admin (管理后台)主要负责节点管理,任务队列管理,监控管理等。
lts-spring Spring 集成
lts-startup 启动脚本
lts-monitor 数据监控
lts maven 版本依赖

开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架



技术框架

框架 说明 版本
Spring MVC 应用开发框架 4.2.5.RELEASE
MySQL 数据库服务器 5.7
Druid JDBC 连接池、监控组件 1.0.14
Redis key-value 数据库 5.0

LTS 定时任务框架本地环境搭建

基础的软件:需要Java JDK,Maven,Mysql,Zookeeper/Redis,Tomcat。

Java JDK

因为LTS是使用Java语言编写的,所以必须要有个Java编译运行环境,目前LTS支持JDK1.6及以上版本。

Maven

LTS项目是基于Maven做项目依赖管理的,所以用户机器上需要配置Maven环境

Mysql/Mongodb 的安装

LTS目前支持Mysql和mongodb作为任务队列的存储引擎。用户同样的选择其中一个即可。

我这里为了不加大这个部署的难度,选择了已有的Mysql来支持。

Mysql 的安装,选择mysql5.7+,下载地址为:https://dev.mysql.com/downloads/mysql/8.0.html,这个下载后一路安装就好。

Tomcat 安装

下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/ 我目前使用的是 apache-tomcat-8.5.97 解压到对应的文件夹。

删除ROOT下的文件,用于放置lts-admin.war解压的文件。

Zookeeper/Redis 安装

因LTS目前支持Zookeeper和Redis作为注册中心,主要用于节点信息暴露、监听、master节点选举。用于选择其一即可,建议zookeeper。

这个地方安装会遇到比较多的Zookeeper安装问题吧,因为现在线上也是用了Zookeeper,所以这里着重的写一下Zookeeper安装,方便对比。

方式一:本地直接安装

1、下载地址

官方最新下载:https://archive.apache.org/dist/zookeeper/ 国内镜像:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/ 历史版本下载:https://archive.apache.org/dist/zookeeper/ 具体版本:https://archive.apache.org/dist/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz 我目前使用的是3.4.5版本。zookeeper-3.4.5  解压到对应的文件夹。

2、进入zookeeper文件夹

D:LenovoSoftstorezookeeperzookeeper-3.4.5conf

3、修改配置文件

修改配置文件zoo_sample.cfg 重命名 为zoo.cfg。

4、修改dataDir目录默认data放在Linux的tmp路径下,会被系统定期清理。

dataDir=/tmp/zookeeper 修改成以下配置:

dataDir=D:\LenovoSoftstore\zookeeper\apache-zookeeper-3.4.5\data
dataLogDir=D:\LenovoSoftstore\zookeeper\apache-zookeeper-3.4.5\log
admin.serverPort=8082

指定dataDir路径,需要根据你的zookeeper安装路径来决定,输入完成后保存退出

配置文件参数额外说明:

  • tickTime :ZooKeeper 使用的基本时间单位(以毫秒为单位)。它用于执行心跳,最小会话超时将是 tickTime 的两倍。
  • dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
  • clientPort:clientPort:客户端连接zookeeper服务器的端口,zookeeper会监听这个端口,默认2181
  • initLimit:集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)
  • syncLimit:集群中flower服务器(F)跟leader(L)服务器之间的请求和答应最多能容忍的心跳数

5、如果报JAVA_HOME未配置,需要修改 binzkEnv.cmd文件 ,配置JAVA_HOME路径。

set JAVA_HOME="D:workJavajdk1.8.0_202" 

6、.启动zookeeper,在/bin目录下打开cmd窗口,并执行命令 zkServer.cmd。默认启动在8080端口

7、判断 zookeeper 是否启动成功

  • 打开cmd窗口 执行jps -l -v 命令会在窗口看到有如下输出 org.apache.zookeeper.server.quorum.QuorumPeerMain,表示zookeeper启动成功  。
  • 查看是不是有需要2181 端口 打开cmd窗口 执行 netstat -ano | findstr 2181 命令

方式二:docker 安装测试

docker pull zookeeper
 
docker run -d -e TZ="Asia/Shanghai" -p 2181:2181 -v $PWD/data:/data --name zookeeper --restart always zookeeper

lts-admin 定时任务后台安装与部署

这里有几种方式,可以方便有需要的同学选择。方式一是传统的war包部署的方式,通过maven命令行编译源码,把war包放到tomcat里面即可,适合无界面的服务器方式进行的。方式二是通过idea自带的maven插件,通过packe方式

注意开始以下方式之前,需要修改下对应的配置。

开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架

开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架


方式一:手动部署的方式,方便上服务器部署。

开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架


1、通过mvn clean install -Dmaven.test.skip=true 进行打包

2、把lts-admin-{version}.war包放到tomcat下的webapp目录的ROOT下,这个是没有访问前缀。或者将 War 包放在 Tomcat 容器的 webapps 目录下,启动 Tomcat 服务后,即可运行该项目,Tomcat 服务器能够自动识别该 War 包并自动解压出一个同名的文件夹。这个是以文件夹为前缀的访问方式。

3、也可以通过idea中的maven package 插件打包,然后复制对应的war包到tomcat进行部署即可。

4、如何解决Tomcat 控制台乱码的问题

要解决启动Tomcat控制台中文乱码解决,需要调整logging.properties配置文件里面日志的编码。参考以下步骤:

(1)、中文乱码原因基本上大家安装的windows系统本地语言都是选择中文,默认是GBK编码,而IDEA或者Tomcat日志使用的是UTF-8编码,这就导致了中文显示乱码。

(2)、启动Tomcat中文乱码解决首先:找到Tomcat日志配置文件(自己的)打开。

开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架


解决控制台3个标签页的乱码问题

1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
# 1catalina.org.apache.juli.AsyncFileHandler.encoding = UTF-8
1catalina.org.apache.juli.AsyncFileHandler.encoding = GBK


2localhost.org.apache.juli.AsyncFileHandler.level = FINE
2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost.
# 2localhost.org.apache.juli.AsyncFileHandler.encoding = UTF-8
2localhost.org.apache.juli.AsyncFileHandler.encoding = GBK


3manager.org.apache.juli.AsyncFileHandler.level = FINE
3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.AsyncFileHandler.prefix = manager.
# 3manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8
3manager.org.apache.juli.AsyncFileHandler.encoding = GBK


4host-manager.org.apache.juli.AsyncFileHandler.level = FINE
4host-manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager.
4host-manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8


java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
# java.util.logging.ConsoleHandler.encoding = UTF-8
java.util.logging.ConsoleHandler.encoding = GBK

5、浏览器访问验证

http://localhost:8080/lts-admin/
方式二:开发环境通过IDEA,挂载tomcat,方便开发做调试。

开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架


1、克隆源码,导入Idea软件

git clone https://gitee.com/hugui/light-task-scheduler.git

2、编译,添加到tomcat进行部署。

配置idea外部tomcat插件

开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架


选择对应的war包进行部署

开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架


idea 选择对应的tomcat外部文件。

开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架


3、注意修改访问路径,选择自己设定的路径进行访问。

开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架


4、浏览器访问验证

http://localhost:8080/lts-admin/
方式三:直接通过源码配置的maven tomcat 插件进行运行,很方便。

1、源码配置位置

开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架


2、关键源码配置


<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <path>/</path>
                <port>8081</port>
                <server>tomcat</server>
                <warFile>lts-admin.war</warFile>
                <uriEncoding>utf-8</uriEncoding>
            </configuration>
        </plugin>
    </plugins>
</build>

3、运行maven tomcat 插件,然后浏览器访问即可。

http://localhost:8080/lts-admin/

lts定时任务操作

1、下载对应的客户端代码

git clone https://github.com/ltsopensource/lts-examples.git

打开idea,导入对应的源码

开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架


2、对应任务提交方式

实时任务
private static void submitRealtimeJob(JobClient jobClient) {
    Job job = new Job();
    job.setTaskId("t_realtime_555");
    job.setParam("shopId""1122222221");
    job.setTaskTrackerNodeGroup("test_trade_TaskTracker");
    job.setNeedFeedback(true);
    job.setReplaceOnExist(true);        // 当任务队列中存在这个任务的时候,是否替换更新
    Response response = jobClient.submitJob(job);
    System.out.println(response);
}
定时任务
private static void submitTriggerTimeJob(JobClient jobClient) {
    Job job = new Job();
    job.setTaskId("t_trigger_time_555");
    job.setParam("shopId""1122222221");
    job.setTaskTrackerNodeGroup("test_trade_TaskTracker");
    job.setNeedFeedback(true);
    job.setReplaceOnExist(true);        // 当任务队列中存在这个任务的时候,是否替换更新
    job.setTriggerTime(DateUtils.addHour(new Date(), 1).getTime());   // 1 小时之后执行
    Response response = jobClient.submitJob(job);
    System.out.println(response);
}
Cron任务

private static void submitCronJob(JobClient jobClient) {
    Job job = new Job();
    job.setTaskId("t_cron_555");
    job.setParam("shopId""1122222221");
    job.setTaskTrackerNodeGroup("test_trade_TaskTracker");      // 执行要执行该任务的taskTracker的节点组名称
    job.setNeedFeedback(true);
    job.setReplaceOnExist(true);        // 当任务队列中存在这个任务的时候,是否替换更新
    job.setCronExpression("0 0/1 * * * ?");
    Response response = jobClient.submitJob(job);
    System.out.println(response);
}

Repeat任务
private static void submitRepeatJob(JobClient jobClient) {
    Job job = new Job();
    job.setTaskId("t_repeat_555");
    job.setParam("shopId""1122222221");
    job.setTaskTrackerNodeGroup("test_trade_TaskTracker");
    job.setNeedFeedback(true);
    job.setReplaceOnExist(true);        // 当任务队列中存在这个任务的时候,是否替换更新
    job.setRepeatCount(50);             // 一共执行50次
    job.setRepeatInterval(50 * 1000L);  // 50s 执行一次
    Response response = jobClient.submitJob(job);
    System.out.println(response);
}

数据监控

JobClient数据监控

JobClient数据监控

开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架


TaskTracker数据监控

TaskTracker数据监控

开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架


JobTracker数据监控

JobTracker数据监控

开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架


很有很多地方还没有深入的去研究,这个可以运行示例来看看对应的方法,再做一下深入的。如果大家有兴趣的话,可以点赞和留言,怎么更新Mysql5.7+升级到Mysql 8+ 。

最后

一个致力于分享技术、职场技能和创业经验方面的知识和经验,内容包括但不限于Java技术、技术趋势、开源项目和技术架构公众号。持续关注互联网和科技的发展,分享人工智能和其他前沿技术的信息,陪你一起成长。

欢迎关注,星标,以及收藏,防止想用的时候没有找到。这样每次新文章推送才会第一时间出现在你的订阅列表里。 世间千变万化,我们才不会擦肩而过……

原文始发于微信公众号(souvc):开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/205988.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!