LTS原理分析(version:1.6.9)

摘要:
具体而言,[JOB_PULL]命令通过JobPullMachine发送到默认频率1s;收到[JOB_PULL]指令后,2.2 JobPullProcessor通过JobPusher#push()访问MySQL中要执行的作业记录,并将[PPUSH_JOB]指令发送到检索逻辑以push要执行的任务记录:检索要执行的小于或等于前一次的作业记录2.3通过JobPushProcessor处理[push_JOB]指令,最后,JobRunnerDelegate被委托执行作业示意图:附件:JobClient和TaskTracker是一起部署的指令集:com。github。ltsopensource公司。果心协议作业协议。请求代码。javacom上。github。ltsopensource公司。果心协议作业协议。响应代码。javacom上。github。ltsopensource公司。果心命令。HttpCmdNames。java中的Rpc指令由RemotingProcessor.com处理。github。ltsopensource公司。jobtracker。加工机远程IngDispatcher#Map处理器将任务预加载到内存中:Listcom。github。ltsopensource公司。队列AbstractPreLoader#loadJobClient#start()将连接ZK并监视节点更改架构图:官方架构图:在LTS框架中构建了许多轮子,该架构以Hadoop作业的方式实现。

LTS做到分布式唯一执行的原理:
LTS采用类似Hadoop作业提交的方式,由JobClient submit作业任务给JobTracker,然后JobTracker会预生成一批作业任务的执行时间记录(落地到MySQL),等到TaskTracker来询问待作业的任务时,将当前待执行的作业任务push到TaskTracker,最后由TaskTracker去执行作业任务。

那么它是如何来保证分布式环境下作业任务的不重不漏呢?
它是借助负载均衡的方式来做的。
JobClient 和 TaskTracker会随机连接JobTracker节点组中的一个节点,实现JobTracker负载均衡。
JobTracker 分发任务时,是优先分配给最空闲的一个TaskTracker节点,实现TaskTracker节点的负载均衡。
这样就保证了待执行的任务在分布式环境下不会重复执行。

LTS任务执行流程:
1.1 【JobClient】submit()发起[SUBMIT_JOB]指令给【JobTracker】

1.2 【JobTracker】通过JobReceiver#addJob()将提交的任务添加到数据库。
这个方法是幂等的,所以多个JVM中的JobClient提交任务只会产生一个。
添加到数据库中的数据是job信息与待执行的时间。
Corn Job存放在lts_cron_job_queue表中;Repeat Job的存放在lts_repeat_job_queue中


2.1 【TaskTracker】通过JobPullMachine#ScheduledExecutorService executorService来定时去【JobTracker】中去取待执行的任务。
具体是通过JobPullMachine去发送[JOB_PULL]指令到【JobTracker】
默认频率为:1s;

2.2 【JobTracker】的JobPullProcessor接收到[JOB_PULL]指令后,通过JobPusher#push()去MySQL中取待执行的job记录,并发送[PUSH_JOB]指令将待执行的job记录推送给【TaskTracker】
取数逻辑为:取小于等于前时间的待待执行作业记录

2.3 【TaskTracker】通过JobPushProcessor来处理[PUSH_JOB]指令,最后委托JobRunnerDelegate去执行job

原理图:

LTS原理分析(version:1.6.9)第1张

附:

JobClient和TaskTracker是部署在一起的

指令集:
com.github.ltsopensource.core.protocol.JobProtos.RequestCode.java
com.github.ltsopensource.core.protocol.JobProtos.ResponseCode.java
com.github.ltsopensource.core.cmd.HttpCmdNames.java

【JobTracker】中的Rpc指令都通过RemotingProcessor来处理:
com.github.ltsopensource.jobtracker.processor.RemotingDispatcher#Map<RequestCode, RemotingProcessor> processors

预加载任务到内存:
List<JobPo> com.github.ltsopensource.queue.AbstractPreLoader#load(String loadTaskTrackerNodeGroup, int loadSize)

JobClient#start()会去连ZK,监测节点变化

架构图:(http://www.tuicool.com/articles/iYr2u2R

LTS原理分析(version:1.6.9)第2张

官方架构图:

LTS原理分析(version:1.6.9)第3张

LTS框架内部自己造了很多轮子,采用Hadoop作业的方式去架构的。

代码整洁、封装优雅,值得一看。

但原理比较复杂,如果框架本身出问题了不好定位,不太推荐使用。

备选方案:Elastic-Job、xxl-job

LTS文档及相关文章:

https://my.oschina.net/itnms/blog/631216

http://www.tuicool.com/articles/iYr2u2R

http://www.open-open.com/lib/view/open1414241431434.html

免责声明:文章转载自《LTS原理分析(version:1.6.9)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Windows下MySQL5.7版本中修改编码为utf-8将日期转换为指定的格式:比如转换成 年月日时分秒 这种格式:yyyy-MM-dd hh:mm:ss 或者 yyyy-MM-dd。总结下。下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Ubuntu 16.04 LTS 安装 Nginx/PHP 5.6/MySQL 5.7 (LNMP) 与Laravel

Ubuntu 16.04 LTS 安装 Nginx/PHP 5.6/MySQL 5.7 (LNMP) 与Laravel 1、MySQL安装【安装 MariaDB】MariaDB是MySQL的一个分支首先,更新升级系统$ sudo apt update$ sudo apt upgrade安装MariaDB:$ sudo apt install mariadb...

安装Ubuntu 20.04 LTS服务器系统

今天,我们将通过图文向您展示如何安装Ubuntu 20.04 LTS服务器。如果您的系统上已经有Ubuntu 18.04 LTS服务器,则只需将其升级到Ubuntu 20.04 LTS服务器。如果您不想升级,但希望在计算机上全新安装Ubuntu 20.04 LTS服务器,则本指南适合您! 首先,下载最新的Ubuntu 20.04 LTS服务器版本,制作成可...

JDK的第三个LTS版本JDK17来了

目录 简介 JDK17中的新特性 语言上的新特性 核心库的优化 支持新的平台 预览特性 其他改动 总结 简介 2021年9月JDK17发布了,JDK17是最新的一个LTS版本。所谓LTS版本就是可以得到至少八年产品支持的版本。从2014年的JDK8,到2018年的JDK11,再到2021年的JDK17。 同时Oracle也调整了LTS版本...

如何在Ubuntu 20.04 LTS Focal Fossa上安装Grafana

步骤1.首先,通过apt在终端中运行以下以下命令,确保所有系统软件包都是最新的。sudo apt updatesudo apt upgrade第2步。在Ubuntu 20.04上安装Grafana。添加Grafana GPG密钥,该密钥可让您安装已签名的软件包:sudo apt-get install -y gnupg2 curl software-pro...

在Ubuntu 20.04 LTS Focal Fossa上安装Deluge

步骤1、首先,通过apt在终端中运行以下以下命令,确保所有系统软件包都是最新的。sudo apt updatesudo apt upgrade步骤2、在Ubuntu 20.04上安装Deluge。Deluge已在Ubuntu官方Ubuntu存储库中提供。要使用以下命令安装在Deluge PPA上发布的最新版本:sudo add-apt-repository...

Linux服务器安装tomcat、JDK、SVN等常用开发软件总结

本来本文发布到首页的,该网站运营人员移除了,说我这篇博文太简单了,如果感觉我这篇博文有用的,大家给个推荐,打一下运营人员的脸 目录 一.Ubuntu 16.04下安装JDK(spring 3.2不支持jdk8,spring官网下载地址:http://repo.spring.io/libs-release-local/org/springframework/...