lts 基本逻辑:
lts 代表light-task-scheduler,https://github.com/ltsopensource/light-task-scheduler
一、是什么
分布式动态调度的框架
二、为什么
1、周期性、定时性的任务可以使用调度器scheduler(每个任务一个线程,对于周期性任务非常浪费资源)
2、如果有非常多调度性任务需要处理,可以每台机器分别布置一套调度器,并且不同机器调度不同的任务。
3、2中每个机器进行调度很浪费(比如每1ms检查一次条件),不同的任务不能跨机器共享硬件,而且无法看到所有调度任务的整体的情况。
另一种方案是,一个master进行时间和条件的调度,到了执行条件再扔给具体的机器执行,这样很方便进行横向扩展,只要维护一套调度集群,就解决所有调度需求(分布式调度)
4、分布式调度引进的问题:某个正在执行的机器挂了怎么恢复?(故障转移)具体执行逻辑怎么封装和提交?怎么动态扩展容量?需要的机器永远故障怎么办?(Fail And Store)解决通信故障
三、主要组件
JobClient:提交任务(存档到mysql),一般是应用端的一部分,向jobtracker发消息
JobTracker;统一接收任务,进行条件的调度,条件满足时发给taskTracker
TaskTracker:真正干活的,运行应用本身的Runner
Admin:后台
Monitor:监控
所有东西加一起,构成一个cluster
四、内部实现
1、jobtracker核心逻辑
com.github.ltsopensource.jobtracker.support.JobPusher#send
从appcontext的XXQueue里面取出task,用netty走网络分发给各个taskTracker执行(传递参数)
2、tasktracker:
com.github.ltsopensource.tasktracker.runner.RunnerPool#execute
JobRunnerDelegate
DefaultRunnerFactory----具体的runner实现
五、部署
一般 job task admin/monitor分离,通过配置一样的lts.tasktracker.cluster-name,构成一个集群。
六、启动顺序
jobTracker taskTracker(配runner类,设置lts.tasktracker.node-group) client(指定tasktracker) admin
不同功能需要启动不同的taskTracker实例