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

原理图:

附:

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框架内部自己造了很多轮子,采用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)的更多相关文章

  1. Android中Input型输入设备驱动原理分析(一)

    转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...

  2. 使用AsyncTask异步更新UI界面及原理分析

    概述: AsyncTask是在Android SDK 1.5之后推出的一个方便编写后台线程与UI线程交互的辅助类.AsyncTask的内部实现是一个线程池,所有提交的异步任务都会在这个线程池中的工作线 ...

  3. 消息队列NetMQ 原理分析5-StreamEngine、Encord和Decord

    消息队列NetMQ 原理分析5-StreamEngine,Encord和Decord 前言 介绍 目的 StreamEngine 发送数据 接收数据 流程分析 Encoder V2Encoder V1 ...

  4. Groovy实现原理分析——准备工作

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  5. MyBatis:二级缓存原理分析

    MyBatis从入门到放弃七:二级缓存原理分析 前言 说起mybatis的一级缓存和二级缓存我特意问了几个身边的朋友他们平时会不会用,结果没有一个人平时业务场景中用. 好吧,那我暂且用来学习源码吧.一 ...

  6. dubbo源码解析五 --- 集群容错架构设计与原理分析

    欢迎来我的 Star Followers 后期后继续更新Dubbo别的文章 Dubbo 源码分析系列之一环境搭建 博客园 Dubbo 入门之二 --- 项目结构解析 博客园 Dubbo 源码分析系列之 ...

  7. SpringBoot入门(0) HelloWorld的实现与原理分析

    SpringBoot(0) HelloWorld的实现与原理分析 一.环境准备 1.1 环境约束 –jdk1.8:Spring Boot 推荐jdk1.7及以上:java version “1.8.0 ...

  8. Heartbleed心脏出血漏洞原理分析

    Heartbleed心脏出血漏洞原理分析 2017年01月14日 18:14:25 阅读数:2718 1. 概述    OpenSSL在实现TLS和DTLS的心跳处理逻辑时,存在编码缺陷.OpenSS ...

  9. Android插件化与热修复(六)-微信Tinker原理分析

    Tinker热修复原理分析 热补丁技术是在用户不需要重新安装应用的情况下实现应用更新,可快速解决一些线上问题.热补丁省去了Android应用发布版本的成本,而且用户端的更新也是无感知的. Tinker ...

随机推荐

  1. Java编程的逻辑 (38) - 剖析ArrayList

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  2. Nginx+php (十六)

    [教程主题]:Nginx+php [课程录制]: 创E [主要内容] [1] 编译PHP 初始环境: 为了省事把所需要的库文件全都安装上,可以使用rpm包安装,也可以用yum命令安装, yum -y  ...

  3. 【程序练习】——ini格式转换为xml格式

    ;Configuration of http [http] doamin=www.mysite.com port= cgihome=/cgi-bin   ;Configuration of db [d ...

  4. HTML5规范尘埃落定,5个开发工具推荐

    HTML5规范终于在今年正式定稿,对于从事多年HTML5开发的人员来说绝对是一个重大新闻.数字天堂董事长,DCloud CEO王安也发表了文章,从开发者和用户两个角度分析了HTML对两个人群的优势.其 ...

  5. 【转】IT族室内锻炼身体的小妙招

    上班族.久坐族近年的健康状况令人堪忧,由于缺乏运动加上长期面对辐射,使上班族身体状况越来越差.专家建议上班族应多加运动,只需小小的动作就能轻松获得健康! 梳头:用木梳从前额至头顶部向后部梳刷,逐渐加快 ...

  6. 【转载】一文总结学习 Python 的 14 张思维导图

    本文主要涵盖了 Python 编程的核心知识(暂不包括标准库及第三方库,后续会发布相应专题的文章). 首先,按顺序依次展示了以下内容的一系列思维导图:基础知识,数据类型(数字,字符串,列表,元组,字典 ...

  7. QDateTime 本地时间和UTC时间转换问题

    先说一下UTC,搜索360百科: 协调世界时,又称世界统一时间.世界标准时间.国际协调时间,简称UTC,是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统.1979年12月3日在内瓦举行 ...

  8. android 分辨率

    1.术语和概念 术语 说明 备注 Screen size(屏幕尺寸) 指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 摩托罗拉milestone手机是3.7英寸 A ...

  9. 2015年第六届蓝桥杯C/C++B组省赛题目解析

    一.奖券数目 有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利.虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号码是5位数(10000-99999),要求其中 ...

  10. JAVA编程环境JDK与JRE运行环境与API核心ClassMap

    JDK(Java Development Kit)称为Java开发包或Java开发工具,是一个编写Java的Applet小程序和应用程序的程序开发环境.JDK是整个Java的核心1.Java运行环境( ...