专栏首页芋道源码1024分布式作业系统 Elastic-Job-Lite 源码分析 —— 作业监控服务

分布式作业系统 Elastic-Job-Lite 源码分析 —— 作业监控服务

摘要: 原创出处 http://www.iocoder.cn/Elastic-Job/job-monitor/ 「芋道源码」欢迎转载,保留摘要,谢谢!

本文基于 Elastic-Job V2.1.5 版本分享

  • 1. 概述
  • 2. MonitorService

1. 概述

本文主要分享 Elastic-Job-Lite 作业监控服务。内容对应《官方文档 —— DUMP作业运行信息》。

使用Elastic-Job-Lite过程中可能会碰到一些分布式问题,导致作业运行不稳定。 由于无法在生产环境调试,通过dump命令可以把作业内部相关信息dump出来,方便开发者debug分析; 另外为了不泄露隐私,已将相关信息中的ip地址以ip1, ip2…的形式过滤,可以在互联网上公开传输环境信息,便于进一步完善Elastic-Job。

涉及到主要类的类图如下( 打开大图 ):

  • 在 Elastic-Job-lite 里,作业监控服务( MonitorService ) 实现了DUMP作业运行信息功能。

你行好事会因为得到赞赏而愉悦 同理,开源项目贡献者会因为 Star 而更加有动力 为 Elastic-Job 点赞!传送门

2. MonitorService

MonitorService,作业监控服务。

初始化 MonitorService 方法实现如下

// MonitorService.java
private final String jobName;

public void listen() {
   int port = configService.load(true).getMonitorPort();
   if (port < 0) {
       return;
   }
   try {
       log.info("Elastic job: Monitor service is running, the port is '{}'", port);
       openSocketForMonitor(port);
   } catch (final IOException ex) {
       log.error("Elastic job: Monitor service listen failure, error is: ", ex);
   }
}

private void openSocketForMonitor(final int port) throws IOException {
   serverSocket = new ServerSocket(port);
   new Thread() {

       @Override
       public void run() {
           while (!closed) {
               try {
                   process(serverSocket.accept());
               } catch (final IOException ex) {
                   log.error("Elastic job: Monitor service open socket for monitor failure, error is: ", ex);
               }
           }
       }
   }.start();
}
  • 在作业配置的监控服务端口属性( LiteJobConfiguration.monitorPort )启动 ServerSocket。一个作业对应一个作业监控端口,所以配置时,请不要重复端口噢。

处理 dump命令 方法如下

// MonitorService.java
private void process(final Socket socket) throws IOException {
   try (
           BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
           BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
           Socket autoCloseSocket = socket) {
       // 读取命令
       String cmdLine = reader.readLine();
       if (null != cmdLine && DUMP_COMMAND.equalsIgnoreCase(cmdLine)) { // DUMP
           List<String> result = new ArrayList<>();
           dumpDirectly("/" + jobName, result);
           outputMessage(writer, Joiner.on("\n").join(SensitiveInfoUtils.filterSensitiveIps(result)) + "\n");
       }
   }
}
  • #process() 方法,目前只支持 DUMP 命令。如果你有自定义命令的需要,可以拓展该方法。
  • 调用 #dumpDirectly() 方法,输出当前作业名对应的相关调试信息。 private void dumpDirectly(final String path, final List<String> result) { for (String each : regCenter.getChildrenKeys(path)) { String zkPath = path + "/" + each; String zkValue = regCenter.get(zkPath); if (null == zkValue) { zkValue = ""; } TreeCache treeCache = (TreeCache) regCenter.getRawCache("/" + jobName); ChildData treeCacheData = treeCache.getCurrentData(zkPath); String treeCachePath = null == treeCacheData ? "" : treeCacheData.getPath(); String treeCacheValue = null == treeCacheData ? "" : new String(treeCacheData.getData()); // 判断 TreeCache缓存 和 注册中心 数据一致 if (zkValue.equals(treeCacheValue) && zkPath.equals(treeCachePath)) { result.add(Joiner.on(" | ").join(zkPath, zkValue)); } else { result.add(Joiner.on(" | ").join(zkPath, zkValue, treeCachePath, treeCacheValue)); } // 递归 dumpDirectly(zkPath, result); } }
    • 当作业本地 TreeCache缓存 和注册中心数据不一致时,DUMP 出 [zkPath, zkValue, treeCachePath, treeCacheValue]。当相同时,只需 DUMP 出 [zkPath, zkValue],方便看出本地和注册中心是否存在数据差异。
  • DUMP 信息例子如下: Yunai-MacdeMacBook-Pro-2:elastic-job yunai$ echo "dump" | nc 127.0.0.1 10024 /javaSimpleJob/sharding | /javaSimpleJob/sharding/2 | /javaSimpleJob/sharding/2/instance | ip198@-@5100 /javaSimpleJob/sharding/1 | /javaSimpleJob/sharding/1/instance | ip198@-@5100 /javaSimpleJob/sharding/0 | /javaSimpleJob/sharding/0/instance | ip198@-@5100 /javaSimpleJob/servers | /javaSimpleJob/servers/ip2 | /javaSimpleJob/servers/ip198 | /javaSimpleJob/leader | /javaSimpleJob/leader/sharding | /javaSimpleJob/leader/failover | /javaSimpleJob/leader/failover/latch | /javaSimpleJob/leader/failover/items | /javaSimpleJob/leader/election | /javaSimpleJob/leader/election/latch | /javaSimpleJob/leader/election/instance | ip198@-@5100 /javaSimpleJob/instances | /javaSimpleJob/instances/ip198@-@5100 | /javaSimpleJob/config | {"jobName":"javaSimpleJob","jobClass":"com.dangdang.ddframe.job.example.job.simple.JavaSimpleJob","jobType":"SIMPLE","cron":"0 0/2 * * * ?","shardingTotalCount":3,"shardingItemParameters":"0\u003dBeijing,1\u003dShanghai,2\u003dGuangzhou","jobParameter":"","failover":true,"misfire":true,"description":"","jobProperties":{"job_exception_handler":"com.dangdang.ddframe.job.executor.handler.impl.DefaultJobExceptionHandler","executor_service_handler":"com.dangdang.ddframe.job.executor.handler.impl.DefaultExecutorServiceHandler"},"monitorExecution":false,"maxTimeDiffSeconds":-1,"monitorPort":10024,"jobShardingStrategyClass":"com.dangdang.ddframe.job.lite.api.strategy.impl.OdevitySortByNameJobShardingStrategy","reconcileIntervalMinutes":10,"disabled":false,"overwrite":true}

本文分享自微信公众号 - 芋道源码(YunaiV)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 注册中心 Eureka 源码解析 —— Eureka-Client 初始化(三)之 EurekaClient

    1. 概述 本文接《Eureka 源码解析 —— Eureka-Client 初始化(二)之 EurekaClientConfig》,主要分享 Eureka-C...

    芋道源码
  • 芋道 Spring Boot 分库分表入门

    因为市面上已经非常不错的分库分表的资料,所以艿艿就不在尴尬的瞎哔哔一些内容。推荐阅读两个资料:

    芋道源码
  • 关于Eureka 2.x,别再人云亦云了!

    看清楚官方的言辞:官方只是说Eureka 2.0的开发被停止了,如果您将Eureka 2.0分支用在生产,将后果自负!

    芋道源码
  • Linux桌面GUI系统的调度器应该怎么做才不卡顿呢?

    关于太古老的故事,我就长话短说,主要是留下个 UNIX进程调度器从何开始 的印象,这样方便我们理解为什么Linux的进程调度器会是现在的这个效果。

    Linux阅码场
  • 运维之道:16 张图片带你 1 小时学会 Ansible

    来源:SpringForAll社区 ID:spring4all 今天分享一个讲解 Ansible 的 PPT,可以用做入门学习之用。内容非常全面,当然,能不能...

    小小科
  • 1-1.调度算法

    先来先服务和短作业优先调度算法 ​ 1.FCFS 特点:简单,有利于长作业 即CPU繁忙性作业 ​ 2.短作业进程优先调度算法:SJ(P)F 提高了...

    见贤思齊
  • 编写模块化CSS:命名空间

    用户1687375
  • CPU 漏洞补丁对内核性能影响:4.15 比 4.11 快 7-9%

    知名Linux Kernel维护成员Greg Kroah-Hartman今天分享了一些非常有趣的细节–在Linux内核打上Meltdown和Spectre漏洞补...

    Debian社区
  • 来自Byron同学的解答

    使用了第三方的网页分析模块BeautifulSoup,可以从这里下载最新版:http://www.crummy.com/software/BeautifulSo...

    Crossin先生
  • T-SQL Enhancement in SQL Server 2005[下篇]

    在第一部分中,我们讨论了APPLY和CTE这两个T-SQL Enhancement。APPLY实现了Table和TVF的Join,CTE通过创建“临时的View...

    蒋金楠

扫码关注云+社区

领取腾讯云代金券