소스 검색

调度中心任务平均分配,触发组件每次获取与线程池数量相关数量的任务,避免大量任务集中在单个调度中心集群节点;

xuxueli 5 년 전
부모
커밋
8b2731d2dd

+ 10 - 10
doc/XXL-JOB官方文档.md 파일 보기

@@ -1576,18 +1576,17 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
1576 1576
 - 9、任务触发组件加载顺序调整,避免小概率情况下组件随机加载顺序导致的I18N的NPE问题;
1577 1577
 - 10、项目依赖升级至较新稳定版本,如spring、spring-boot、mybatis、slf4j、groovy等等;
1578 1578
 - 11、JobThread自销毁优化,避免并发触发导致triggerQueue中任务丢失问题;
1579
-- 12、[ING,交互兼容问题待处理]Cron在线生成工具:任务新增、编辑框通过组件在线生成Cron表达式;
1579
+- 12、Cron在线生成工具:任务新增、编辑框通过组件在线生成Cron表达式;
1580 1580
 - 13、Cron下次执行时间查询:支持通过界面在线查看后续连续5次执行时间;
1581 1581
 - 14、任务重试时参数丢失的问题修复;
1582
-- 15、[ING]xxl-rpc服务端线程优化,降低线程内存开销;
1583
-- 16、[ING]调度日志优化:支持设置日志保留天数,过期日志天维度记录报表,并清理;调度报表汇总实时数据和报表;
1584
-- 17、[ING]父子任务参数传递;流程任务等,透传动态参数;
1585
-- 18、[ING]调度中心任务平均分配,触发组件每次获取与线程池数量相关数量的任务,避免大量任务集中在单个调度中心集群节点。
1586
-- 19、调度中心密码限制18位,修复修改密码超过18位无法登陆的问题;
1587
-- 20、[ING]调度中心日志删除,改为分页获取ID,根据ID删除的方式;
1588
-- 21、[ING]任务回调改为restful方式;
1589
-- 22、任务告警组件分页参数无效问题修复;
1590
-- 23、DB脚本默认编码改为utf8mb4,修复字符乱码问题(建议Mysql版本5.7+);
1582
+- 15、调度中心密码限制18位,修复修改密码超过18位无法登陆的问题;
1583
+- 16、任务告警组件分页参数无效问题修复;
1584
+- 17、DB脚本默认编码改为utf8mb4,修复字符乱码问题(建议Mysql版本5.7+);
1585
+- 18、调度中心任务平均分配,触发组件每次获取与线程池数量相关数量的任务,避免大量任务集中在单个调度中心集群节点;
1586
+- 19、[ING]xxl-rpc服务端线程优化,降低线程内存开销;
1587
+- 20、[ING]调度日志优化:支持设置日志保留天数,过期日志天维度记录报表,并清理;调度报表汇总实时数据和报表;
1588
+- 21、[ING]调度中心日志删除,改为分页获取ID,根据ID删除的方式;
1589
+- 22、[ING]任务回调改为restful方式;
1591 1590
 
1592 1591
 
1593 1592
 ### TODO LIST
@@ -1625,6 +1624,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
1625 1624
 - 32、AccessToken按照执行器维度设置;控制调度、回调;
1626 1625
 - 33、任务执行一次的时候指定IP;
1627 1626
 - 34、通讯调整;双向HTTP,回调和其他API自定义AccessToken,Restful,执行器复用容器端口;
1627
+- 35、父子任务参数传递;流程任务等,透传动态参数;
1628 1628
 
1629 1629
 
1630 1630
 ## 七、其他

+ 20 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java 파일 보기

@@ -60,6 +60,12 @@ public class XxlJobAdminConfig implements InitializingBean, DisposableBean {
60 60
     @Value("${spring.mail.username}")
61 61
     private String emailUserName;
62 62
 
63
+    @Value("${xxl.job.triggerpool.fast.max}")
64
+    private int triggerPoolFastMax;
65
+
66
+    @Value("${xxl.job.triggerpool.slow.max}")
67
+    private int triggerPoolSlowMax;
68
+
63 69
     // dao, service
64 70
 
65 71
     @Resource
@@ -90,6 +96,20 @@ public class XxlJobAdminConfig implements InitializingBean, DisposableBean {
90 96
         return emailUserName;
91 97
     }
92 98
 
99
+    public int getTriggerPoolFastMax() {
100
+        if (triggerPoolFastMax < 200) {
101
+            return 200;
102
+        }
103
+        return triggerPoolFastMax;
104
+    }
105
+
106
+    public int getTriggerPoolSlowMax() {
107
+        if (triggerPoolSlowMax < 100) {
108
+            return 100;
109
+        }
110
+        return triggerPoolSlowMax;
111
+    }
112
+
93 113
     public XxlJobLogDao getXxlJobLogDao() {
94 114
         return xxlJobLogDao;
95 115
     }

+ 8 - 5
xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/XxlJobScheduler.java 파일 보기

@@ -39,14 +39,17 @@ public class XxlJobScheduler  {
39 39
         // init i18n
40 40
         initI18n();
41 41
 
42
+        // admin-server
43
+        initRpcProvider();
44
+
42 45
         // admin registry monitor run
43 46
         JobRegistryMonitorHelper.getInstance().start();
44 47
 
45 48
         // admin monitor run
46 49
         JobFailMonitorHelper.getInstance().start();
47 50
 
48
-        // admin-server
49
-        initRpcProvider();
51
+        // admin trigger pool start
52
+        JobTriggerPoolHelper.toStart();
50 53
 
51 54
         // start-schedule
52 55
         JobScheduleHelper.getInstance().start();
@@ -63,12 +66,12 @@ public class XxlJobScheduler  {
63 66
         // admin trigger pool stop
64 67
         JobTriggerPoolHelper.toStop();
65 68
 
66
-        // admin registry stop
67
-        JobRegistryMonitorHelper.getInstance().toStop();
68
-
69 69
         // admin monitor stop
70 70
         JobFailMonitorHelper.getInstance().toStop();
71 71
 
72
+        // admin registry stop
73
+        JobRegistryMonitorHelper.getInstance().toStop();
74
+
72 75
         // admin-server
73 76
         stopRpcProvider();
74 77
     }

+ 4 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java 파일 보기

@@ -50,6 +50,9 @@ public class JobScheduleHelper {
50 50
                 }
51 51
                 logger.info(">>>>>>>>> init xxl-job admin scheduler success.");
52 52
 
53
+                // pre-read count: treadpool-size * trigger-qps (each trigger cost 50ms, qps = 1000/50 = 20)
54
+                int preReadCount = (XxlJobAdminConfig.getAdminConfig().getTriggerPoolFastMax() + XxlJobAdminConfig.getAdminConfig().getTriggerPoolSlowMax()) * 20;
55
+
53 56
                 while (!scheduleThreadToStop) {
54 57
 
55 58
                     // Scan Job
@@ -73,7 +76,7 @@ public class JobScheduleHelper {
73 76
 
74 77
                         // 1、pre read
75 78
                         long nowTime = System.currentTimeMillis();
76
-                        List<XxlJobInfo> scheduleList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleJobQuery(nowTime + PRE_READ_MS);
79
+                        List<XxlJobInfo> scheduleList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleJobQuery(nowTime + PRE_READ_MS, preReadCount);
77 80
                         if (scheduleList!=null && scheduleList.size()>0) {
78 81
                             // 2、push time-ring
79 82
                             for (XxlJobInfo jobInfo: scheduleList) {

+ 47 - 35
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java 파일 보기

@@ -1,5 +1,6 @@
1 1
 package com.xxl.job.admin.core.thread;
2 2
 
3
+import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
3 4
 import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
4 5
 import com.xxl.job.admin.core.trigger.XxlJobTrigger;
5 6
 import org.slf4j.Logger;
@@ -20,31 +21,44 @@ public class JobTriggerPoolHelper {
20 21
     // ---------------------- trigger pool ----------------------
21 22
 
22 23
     // fast/slow thread pool
23
-    private ThreadPoolExecutor fastTriggerPool = new ThreadPoolExecutor(
24
-            50,
25
-            200,
26
-            60L,
27
-            TimeUnit.SECONDS,
28
-            new LinkedBlockingQueue<Runnable>(1000),
29
-            new ThreadFactory() {
30
-                @Override
31
-                public Thread newThread(Runnable r) {
32
-                    return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-fastTriggerPool-" + r.hashCode());
33
-                }
34
-            });
35
-
36
-    private ThreadPoolExecutor slowTriggerPool = new ThreadPoolExecutor(
37
-            10,
38
-            100,
39
-            60L,
40
-            TimeUnit.SECONDS,
41
-            new LinkedBlockingQueue<Runnable>(2000),
42
-            new ThreadFactory() {
43
-                @Override
44
-                public Thread newThread(Runnable r) {
45
-                    return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-slowTriggerPool-" + r.hashCode());
46
-                }
47
-            });
24
+    private ThreadPoolExecutor fastTriggerPool = null;
25
+    private ThreadPoolExecutor slowTriggerPool = null;
26
+
27
+    public void start(){
28
+        fastTriggerPool = new ThreadPoolExecutor(
29
+                10,
30
+                XxlJobAdminConfig.getAdminConfig().getTriggerPoolFastMax(),
31
+                60L,
32
+                TimeUnit.SECONDS,
33
+                new LinkedBlockingQueue<Runnable>(1000),
34
+                new ThreadFactory() {
35
+                    @Override
36
+                    public Thread newThread(Runnable r) {
37
+                        return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-fastTriggerPool-" + r.hashCode());
38
+                    }
39
+                });
40
+
41
+        slowTriggerPool = new ThreadPoolExecutor(
42
+                10,
43
+                XxlJobAdminConfig.getAdminConfig().getTriggerPoolSlowMax(),
44
+                60L,
45
+                TimeUnit.SECONDS,
46
+                new LinkedBlockingQueue<Runnable>(2000),
47
+                new ThreadFactory() {
48
+                    @Override
49
+                    public Thread newThread(Runnable r) {
50
+                        return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-slowTriggerPool-" + r.hashCode());
51
+                    }
52
+                });
53
+    }
54
+
55
+
56
+    public void stop() {
57
+        //triggerPool.shutdown();
58
+        fastTriggerPool.shutdownNow();
59
+        slowTriggerPool.shutdownNow();
60
+        logger.info(">>>>>>>>> xxl-job trigger thread pool shutdown success.");
61
+    }
48 62
 
49 63
 
50 64
     // job timeout count
@@ -100,17 +114,19 @@ public class JobTriggerPoolHelper {
100 114
         });
101 115
     }
102 116
 
103
-    public void stop() {
104
-        //triggerPool.shutdown();
105
-        fastTriggerPool.shutdownNow();
106
-        slowTriggerPool.shutdownNow();
107
-        logger.info(">>>>>>>>> xxl-job trigger thread pool shutdown success.");
108
-    }
117
+
109 118
 
110 119
     // ---------------------- helper ----------------------
111 120
 
112 121
     private static JobTriggerPoolHelper helper = new JobTriggerPoolHelper();
113 122
 
123
+    public static void toStart() {
124
+        helper.start();
125
+    }
126
+    public static void toStop() {
127
+        helper.stop();
128
+    }
129
+
114 130
     /**
115 131
      * @param jobId
116 132
      * @param triggerType
@@ -126,8 +142,4 @@ public class JobTriggerPoolHelper {
126 142
         helper.addTrigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam);
127 143
     }
128 144
 
129
-    public static void toStop() {
130
-        helper.stop();
131
-    }
132
-
133 145
 }

+ 1 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java 파일 보기

@@ -41,7 +41,7 @@ public interface XxlJobInfoDao {
41 41
 
42 42
 	public int findAllCount();
43 43
 
44
-	public List<XxlJobInfo> scheduleJobQuery(@Param("maxNextTime") long maxNextTime);
44
+	public List<XxlJobInfo> scheduleJobQuery(@Param("maxNextTime") long maxNextTime, @Param("pagesize") int pagesize );
45 45
 
46 46
 	public int scheduleUpdate(XxlJobInfo xxlJobInfo);
47 47
 

+ 4 - 0
xxl-job-admin/src/main/resources/application.properties 파일 보기

@@ -44,3 +44,7 @@ xxl.job.accessToken=
44 44
 
45 45
 ### xxl-job, i18n (default empty as chinese, "en" as english)
46 46
 xxl.job.i18n=
47
+
48
+## xxl-job, triggerpool max size
49
+xxl.job.triggerpool.fast.max=200
50
+xxl.job.triggerpool.slow.max=100

+ 2 - 0
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml 파일 보기

@@ -213,6 +213,8 @@
213 213
 		FROM xxl_job_info AS t
214 214
 		WHERE t.trigger_status = 1
215 215
 			and t.trigger_next_time <![CDATA[ <= ]]> #{maxNextTime}
216
+		ORDER BY id ASC
217
+		LIMIT #{pagesize}
216 218
 	</select>
217 219
 
218 220
 	<update id="scheduleUpdate" parameterType="com.xxl.job.admin.core.model.XxlJobInfo"  >