qschedule server

来源:互联网 发布:软件测试面试 编辑:程序博客网 时间:2024/05/21 05:24
  • Qschedule 核心流程
    • Qschedule Server Init
    • Qschedule Client Init
    • Qschedule Server Schedule Job
    • Qschedule Server Task Execute
    • Qschedule Client Task Execute
    • Qschedule Server Recover

Qschedule 核心流程

Qschedule Server Init

集群中的每台Server 启动时投票选举自己为Leader。
当自己成为Leader后,启动任务调度线程池Schedule,作业跟踪线程Jobtracker,任务跟踪线程TaskTracker
启动作业注册服务JobRegister、进度跟踪服务ProcessTracker、日志存储服务Logger、任务完成后Ack确认服务AckService等。
作业跟踪线程Jobtracker 开始查找需要调度(已启动并设置了cron表达式)的Job,纳入Job容器中管理。且每分钟探测一次Db和Job容器同步
任务跟踪线程TaskTracker开始查找未完成(正在调度和调度过程中出现错误)的Job,Ping客户端确认调度结果,对出错的任务使用失败恢复策略FailedRecoverStrategy处理并向业务线报警。且每间隔1分钟执行一次。

Qschedule Client Init

Qschedule-executor 
验证应用中心下发的qunar-app.properties
将应用名(如:tc_qschedule_demo)和job名(如:qschedule.demo.job1)通过JobRegistry这个dubbo接口注册到server db
实例化Qmq Consumer客户端,订阅subjectPrefix为job名,consumer group为default的消息。当收到消息调用Worker的doWork执行任务。qmq consumer客户端 启动单线程线程池处理接收的消息,保证同一时刻只接收一个消息,处理一次任务。

Qschedule manager
设置cron表达式、json 参数、恢复策略
启动
Job

Qschedule Server Schedule Job

JobTracker发现并调度(schedule)Job
Job根据最后一次被调度的时间(last run time)和cron表达式计算下
一次调度的时间(next run time)并传递给Schedule
当到达job执行的时间后,schedule开始执行(execute)job

public class Scheduler {    private ScheduledExecutorService scheduleExecutor;    private ExecutorService workerExecutor;    @Override    public ScheduledFuture schedule(final Job job, final Date next) {        long nextTime = next.getTime();        long now = System.currentTimeMillis();        return scheduleExecutor.schedule(new Runnable() {            public void run() {                workerExecutor.execute(new Runnable() {                    public void run() {                        job.execute(runAt);                        job.schedule();                    }                });            }        }, nextTime - now, TimeUnit.MILLISECONDS);    }}

Qschedule Server Task Execute

Task Create
job检查last task是否已经结束(即检测上一次任务的状态是否为最终FINISH、DISCARD)
如果上一次任务没有结束,更新last run time,等待下一次调度
如果上一次任务已经结束,则创建(create)task
Task Start,任务的状态变成 STARTED
Task Execute
Select Runner

task 在执行时,首先选择一个在线机器RUNNER。如果该任务没有在线机器,则任务的状态变成 NORUNNER。否则从用户指定的Worker中随机选取一台。
Handle Message 
创建消息,以job名作为subject,将job的json参数作为消息的属性,发送给worker,如果worker拒绝消费,说明worker正在处理上一个任务,则任务的状态变成CONSUMERBUSY

Qschedule Client Task Execute

Qschedule Client接收消息后开始执行任务,及调用WorkerdoWorker方法。
在任务执行过程中,Worker可以通过TaskMonitor向Server的ProcessTracker汇报任务进度,也可以发送Logger给Server,Server会将其存入Hbase,但这一过程是非可靠的。
Task执行完成后Qmq Consumer向Server发送Ack确认帧,AckService接口接收确认帧后判断Task处理是否有异常。
如果任务处理正确,将任务状态标记为FINISH,FINSH是任务的一个终止状态,任务执行结束。
如果任务处理有异常,将任务状态标志为FAILED,FAILED是任务的中间状态,后续会由TaskTracker根据用户指定的恢复策略执行进一步操作。

Qschedule Server Recover

Task Tracker从可调度的job中查找执行失败(FAILED),没有找到在线机器(NORUNNER),消费者忙(CONSUMERBUSY),2分钟内任务仍然运行(STARTED)的任务。
没有找到在线机器(NORUNNER)的和2分钟内任务仍然运行的(STARTED)需要ping
执行失败,消费者忙,没有工作者且ping不通,2分钟内任务仍然运行且ping不通的执行恢复策略。
恢复策略为Discrad ,任务状态为Discrad,发报警
恢复策略为Retry, 重新执行Execute任务,发报警

0 0
原创粉丝点击