您的位置:首页 > 运维架构 > 网站架构

分布式架构中的统一job调度监控管理的实现(一)

2016-08-23 11:51 357 查看
基于quartz的job 触发机制能解决的是时间的依赖。但是我们经常遇到的还有job之间的依赖,比如,job A 执行成功了才能执行job B。同时我们期望有对job的执行情况的log记录,如果job执行失败了,能够以告警的方式(邮件/短信)通知我们,进一步或者有个界面能够配置job,查询job执行情况。特别是现在很多系统都是分很多模块的特别是微服务架构的应用,如果多个模块都有单独的job触发机制,无疑是个浪费,也不利于统一管理,所以因运而生的提出了需要有一个统一的job调度监控管理模块。

该方案基于quartz 来做时间触发。管理模块(job-admin)和被管理模块之间用jms来通信。基于jms有多重益处:1,job-admin和被监控模块更解耦,job-admin不直接和被监控模块交互,互相独立。2,信息传递的可靠性,如果job-admin发出信息,但是被监控模块已经关闭或停机,则该消息会保留在queue中,不会丢失,等到被监控模块回复正常,则继续处理该信息。3,异步通信,信息的发出不依赖于job的执行。job-admin发出消息后,马上返回,不等待该消息的处理。4,同一个被监控模块可以分布式部署,每个部署的每个模块都监听同一个queue,保证了job执行的唯一性和可靠性。

同时要有一个job sdk 或者称为job-client,该sdk 需要集成进需要被管理的模块中,该集成要不影响原来的逻辑,尽量减少侵入。对于每个集成模块要有单独的jms queue, 比如 A模块,我们就定义 queue_A, job-admin往该queue_A上发送触发信息,模块A中的sdk 监听该queue,从上面获取信息。 同时还要定义queue_callback,所有被监控的模块公用该queue,被监控模块会将三种信息往该queue上发送,分别是job已经开始,job已经完成,job失败。job-admin监听queue_callback,将收到的信息入库或者告警通知。

job-admin的工作:我们常见的job分为按天执行的和按小时/分钟执行的,job之间的依赖我们只关注按天执行的job之间的依赖。每个job要有运行时间阈值,如果超过阈值没有成功,则报警。如果job B 依赖于job A,  job  A反馈异常或者超时没有反馈,则job B 不执行,后面可以修复问题后手动触发来执行job B.

      job-admin要有三张表来存储,job_tpl,job_instance,job_relation

job_instance 记录一次job实例执行情况

id,jobName,status,createTime,startTime,finishedTime,failedTime,errorMessage(varchar1000)

job_tpl 记录job定义

name,create_time,group,queue,status,cron_expression,desc,type(每日型,非每日型),time_string,max_run_time

job_relation 记录job的依赖关系

id,child_name,parent_name

每个job_instance要有自己的状态  CREATED,started,finished,failed,none,expired

job-client sdk包 基于spring aop 和 annotation.每个被监控模块要执行的job方法上要加annotation,在被监控模块启动时,初始化找到所有被annotaiton的方法,当sdk收到jms消息时,找到对应的job 方法,通过反射执行该方法,同时将执行的情况通过callback jms通知 job-admin.

jms 格式

call     jobName, jobID
call back      jobName,jobID,status,errorMessage

具体实现,下回分解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  架构
相关文章推荐