Browse Source

路由策越优化:循环和LFU路由策略计数器自增无上限问题和首次路由压力集中在首台机器的问题修复;

xueli.xue 8 years ago
parent
commit
ee1f4e7a32

+ 5 - 2
README.md

@@ -23,6 +23,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
 - 16、任务注册: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;
 - 17、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移;
 - 18、Rolling日志:支持以Rolling方式实时查看执行器输出的日志信息,实时监控任务进度;
+- 19、运行报表:支持实时查看系统信息数据,如任务数量、调度次数、执行器数量等;以及调度报表,如调度日期分布图,调度成功分布图等;
 
 #### 1.3 发展
 于2015年中,我在github上创建XXL-JOB项目仓库并提交第一个commit,随之进行系统结构设计,UI选型,交互设计……
@@ -770,9 +771,11 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
 - 4、权限增强校验,采用动态登录TOKEN(推荐接入内部SSO);
 - 5、数据库配置优化,解决乱码问题;
 
-#### 6.12 版本 V1.6.2 特性(Coding)
-- 1、任务报表:总任务数、总调度数、调度成功比例
+#### 6.12 版本 V1.6.2 特性
+- 1、运行报表:支持实时查看系统信息数据,如任务数量、调度次数、执行器数量等;以及调度报表,如调度日期分布图,调度成功分布图等
 - 2、JobHandler支持自定义回调结果;
+- 3、资源路径包含空格或中文时资源文件无法加载时,无法准确查看异常信息的问题处理。
+- 4、路由策越优化:循环和LFU路由策略计数器自增无上限问题和首次路由压力集中在首台机器的问题修复;
 
 #### TODO LIST
 - 1、支持脚本JOB(源码或指定路径), 即shell/python/php等, 日志实时输出并支持在线监控;定制JobHandler实现;

+ 2 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java

@@ -33,8 +33,8 @@ public class ExecutorRouteLFU extends ExecutorRouter {
             jobLfuMap.put(jobId, lfuItemMap);
         }
         for (String address: addressList) {
-            if (!lfuItemMap.containsKey(address)) {
-                lfuItemMap.put(address, 0);
+            if (!lfuItemMap.containsKey(address) || lfuItemMap.get(address) >1000000 ) {
+                lfuItemMap.put(address, new Random().nextInt(addressList.size()));  // 初始化时主动Random一次,缓解首次压力
             }
         }
 

+ 2 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java

@@ -3,6 +3,7 @@ package com.xxl.job.admin.core.route.strategy;
 import com.xxl.job.admin.core.route.ExecutorRouter;
 
 import java.util.ArrayList;
+import java.util.Random;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
@@ -21,7 +22,7 @@ public class ExecutorRouteRound extends ExecutorRouter {
 
         // count++
         Integer count = routeCountEachJob.get(jobId);
-        count = (count==null)?0:++count;
+        count = (count==null || count>1000000)?(new Random().nextInt(100)):++count;  // 初始化时主动Random一次,缓解首次压力
         routeCountEachJob.put(jobId, count);
         return count;
     }