分布式架构中的统一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
具体实现,下回分解。
该方案基于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
具体实现,下回分解。
相关文章推荐
- 【niubi-job——一个分布式的任务调度框架】----框架设计原理以及实现
- niubi-job:一个分布式的任务调度框架设计原理以及实现
- 利用log4j+mongodb实现分布式系统中日志统一管理
- 5月17日云栖精选夜读:分布式大数据系统巧实现_全局数据调度管理不再难
- shadowX 分布式任务调度框架实现企业级监控业务
- 【niubi-job——一个分布式的任务调度框架】----框架设计原理以及实现
- 5月17日云栖精选夜读:分布式大数据系统巧实现_全局数据调度管理不再难
- 玩转mongodb(九):通过log4jmongo来实现分布式系统的日志统一管理
- 云方案,依托H3C彩虹云存储架构,结合UIA统一认证系统,实现了用户数据的集中存储和管理
- 利用log4j+mongodb实现分布式系统中日志统一管理
- 分布式大数据系统巧实现,全局数据调度管理不再难 大数据史记 2017-05-18 13:04:22 浏览63 评论0
- 5月17日云栖精选夜读:分布式大数据系统巧实现_全局数据调度管理不再难
- Springboot+atomikos+jta实现分布式事务统一管理
- 分布式深度学习的两种集群管理与调度的实现方式简介
- zk实现分布式统一配置管理
- yarn对mapreducev1的重构,根本的思想是将 JobTracker 两个主要的功能分离成单独的组件,这两个功能是资源管理和任务调度 / 监控。
- 【niubi-job——一个分布式的任务调度框架】----框架设计原理以及实现
- 分布式大数据系统巧实现_全局数据调度管理不再难
- 利用log4j+mongodb实现分布式系统中日志统一管理
- BlogEngine.Net架构与源代码分析系列part9:开发扩展(上)——Extension与管理上的实现