Selaa lähdekoodia

LRU路由更新不及时问题修复

xuxueli 6 vuotta sitten
vanhempi
commit
878df30bbc

+ 2 - 1
doc/XXL-JOB官方文档.md Näytä tiedosto

1427
 - 13、执行器热部署时JobHandler重新初始化,修复由此导致的 "jobhandler naming conflicts." 问题;
1427
 - 13、执行器热部署时JobHandler重新初始化,修复由此导致的 "jobhandler naming conflicts." 问题;
1428
 - 14、新增Class的加载缓存,解决频繁加载Class会使jvm的方法区空间不足导致OOM的问题;
1428
 - 14、新增Class的加载缓存,解决频繁加载Class会使jvm的方法区空间不足导致OOM的问题;
1429
 - 15、调整首页报表默认区间为本周,避免日志量太大查询缓慢;
1429
 - 15、调整首页报表默认区间为本周,避免日志量太大查询缓慢;
1430
-- 16、[迭代中]任务线程隔离:
1430
+- 16、LRU路由更新不及时问题修复;
1431
+- 17、[迭代中]任务线程隔离:
1431
     - 执行器测异步响应,不存在阻塞不需要隔离;
1432
     - 执行器测异步响应,不存在阻塞不需要隔离;
1432
     - 调度中心共用单一调度线程池,可能导致调度阻塞需要线程隔离;调度线程池拆分为Fast/Slow两个,针对调度较慢的执行器地址请求,降级使用Slow线程池;考虑是否可以任务级隔离线程池;
1433
     - 调度中心共用单一调度线程池,可能导致调度阻塞需要线程隔离;调度线程池拆分为Fast/Slow两个,针对调度较慢的执行器地址请求,降级使用Slow线程池;考虑是否可以任务级隔离线程池;
1433
 
1434
 

+ 14 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java Näytä tiedosto

33
             lfuItemMap = new HashMap<String, Integer>();
33
             lfuItemMap = new HashMap<String, Integer>();
34
             jobLfuMap.putIfAbsent(jobId, lfuItemMap);   // 避免重复覆盖
34
             jobLfuMap.putIfAbsent(jobId, lfuItemMap);   // 避免重复覆盖
35
         }
35
         }
36
+
37
+        // put new
36
         for (String address: addressList) {
38
         for (String address: addressList) {
37
             if (!lfuItemMap.containsKey(address) || lfuItemMap.get(address) >1000000 ) {
39
             if (!lfuItemMap.containsKey(address) || lfuItemMap.get(address) >1000000 ) {
38
                 lfuItemMap.put(address, new Random().nextInt(addressList.size()));  // 初始化时主动Random一次,缓解首次压力
40
                 lfuItemMap.put(address, new Random().nextInt(addressList.size()));  // 初始化时主动Random一次,缓解首次压力
39
             }
41
             }
40
         }
42
         }
43
+        // remove old
44
+        List<String> delKeys = new ArrayList<>();
45
+        for (String existKey: lfuItemMap.keySet()) {
46
+            if (!addressList.contains(existKey)) {
47
+                delKeys.add(existKey);
48
+            }
49
+        }
50
+        if (delKeys.size() > 0) {
51
+            for (String delKey: delKeys) {
52
+                lfuItemMap.remove(delKey);
53
+            }
54
+        }
41
 
55
 
42
         // load least userd count address
56
         // load least userd count address
43
         List<Map.Entry<String, Integer>> lfuItemList = new ArrayList<Map.Entry<String, Integer>>(lfuItemMap.entrySet());
57
         List<Map.Entry<String, Integer>> lfuItemList = new ArrayList<Map.Entry<String, Integer>>(lfuItemMap.entrySet());

+ 14 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java Näytä tiedosto

4
 import com.xxl.job.core.biz.model.ReturnT;
4
 import com.xxl.job.core.biz.model.ReturnT;
5
 import com.xxl.job.core.biz.model.TriggerParam;
5
 import com.xxl.job.core.biz.model.TriggerParam;
6
 
6
 
7
+import java.util.ArrayList;
7
 import java.util.LinkedHashMap;
8
 import java.util.LinkedHashMap;
8
 import java.util.List;
9
 import java.util.List;
9
 import java.util.concurrent.ConcurrentHashMap;
10
 import java.util.concurrent.ConcurrentHashMap;
40
             jobLRUMap.putIfAbsent(jobId, lruItem);
41
             jobLRUMap.putIfAbsent(jobId, lruItem);
41
         }
42
         }
42
 
43
 
43
-        // put
44
+        // put new
44
         for (String address: addressList) {
45
         for (String address: addressList) {
45
             if (!lruItem.containsKey(address)) {
46
             if (!lruItem.containsKey(address)) {
46
                 lruItem.put(address, address);
47
                 lruItem.put(address, address);
47
             }
48
             }
48
         }
49
         }
50
+        // remove old
51
+        List<String> delKeys = new ArrayList<>();
52
+        for (String existKey: lruItem.keySet()) {
53
+            if (!addressList.contains(existKey)) {
54
+                delKeys.add(existKey);
55
+            }
56
+        }
57
+        if (delKeys.size() > 0) {
58
+            for (String delKey: delKeys) {
59
+                lruItem.remove(delKey);
60
+            }
61
+        }
49
 
62
 
50
         // load
63
         // load
51
         String eldestKey = lruItem.entrySet().iterator().next().getKey();
64
         String eldestKey = lruItem.entrySet().iterator().next().getKey();