Browse Source

设计新的路由算法"LRU";规划新算法"LFU";

xueli.xue 8 years ago
parent
commit
1c5a841579

+ 2 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java View File

12
     ROUND("轮询", new ExecutorRouteRound()),
12
     ROUND("轮询", new ExecutorRouteRound()),
13
     RANDOM("随机", new ExecutorRouteRandom()),
13
     RANDOM("随机", new ExecutorRouteRandom()),
14
     CONSISTENT_HASH("一致性HASH", new ExecutorRouteConsistentHash()),
14
     CONSISTENT_HASH("一致性HASH", new ExecutorRouteConsistentHash()),
15
+    LEAST_FREQUENTLY_USED("最不经常使用", new ExecutorRouteLFU()),
16
+    LEAST_RECENTLY_USED("最近最久未使用", new ExecutorRouteLRU()),
15
     FAILOVER("故障转移", null);
17
     FAILOVER("故障转移", null);
16
 
18
 
17
     ExecutorRouteStrategyEnum(String title, ExecutorRouter router) {
19
     ExecutorRouteStrategyEnum(String title, ExecutorRouter router) {

+ 4 - 21
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java View File

23
 
23
 
24
     public static void main(String[] args) {
24
     public static void main(String[] args) {
25
 
25
 
26
-        int c1 = 0;
27
-        int c2 = 0;
28
-        int c3 = 0;
29
-
30
-        long start = System.currentTimeMillis();
31
-        for (int i = 0; i < 10; i++) {
32
-            String ret = ExecutorRouter.route(i, new ArrayList<String>(Arrays.asList("127.0.0.1:0000", "127.0.0.1:2222", "127.0.0.1:3333")), ExecutorRouteStrategyEnum.CONSISTENT_HASH.name());
33
-            if (ret.equals("127.0.0.1:0000")) {
34
-                c1++;
35
-            } else if (ret.equals("127.0.0.1:2222")) {
36
-                c2++;
37
-            } else if (ret.equals("127.0.0.1:3333")) {
38
-                c3++;
39
-            }
40
-        }
41
-        long end = System.currentTimeMillis();
42
-        System.out.println(end - start);    // 1000*100=740、1000*1=162、
43
-
44
 
26
 
45
-        System.out.println(c1);
46
-        System.out.println(c2);
47
-        System.out.println(c3);
27
+        for (int i = 0; i < 100; i++) {
28
+            String ret = ExecutorRouter.route(666, new ArrayList<String>(Arrays.asList("127.0.0.1:0000", "127.0.0.1:2222", "127.0.0.1:3333")), ExecutorRouteStrategyEnum.LEAST_RECENTLY_USED.name());
29
+            System.out.println(ret);
30
+        }
48
 
31
 
49
     }
32
     }
50
 
33
 

+ 1 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java View File

10
 import java.util.TreeMap;
10
 import java.util.TreeMap;
11
 
11
 
12
 /**
12
 /**
13
- * 分组下JOB均匀散列在不同机器上;且每个JOB固定调度其中一台机器;
13
+ * 分组下机器地址相同,不同JOB均匀散列在不同机器上,保证分组下机器分配JOB平均;且每个JOB固定调度其中一台机器;
14
  *      a、virtual node:解决不均衡问题
14
  *      a、virtual node:解决不均衡问题
15
  *      b、hash method replace hashCode:String的hashCode可能重复,需要进一步扩大hashCode的取值范围
15
  *      b、hash method replace hashCode:String的hashCode可能重复,需要进一步扩大hashCode的取值范围
16
  * Created by xuxueli on 17/3/10.
16
  * Created by xuxueli on 17/3/10.

+ 24 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java View File

1
+package com.xxl.job.admin.core.route.strategy;
2
+
3
+import com.xxl.job.admin.core.route.ExecutorRouter;
4
+
5
+import java.util.ArrayList;
6
+
7
+/**
8
+ * 单个JOB对应的每个执行器,使用频率最低的优先被选举
9
+ *      a(*)、LFU(Least Frequently Used):最不经常使用,频率/次数
10
+ *      b、LRU(Least Recently Used):最近最久未使用,时间
11
+ *
12
+ * Created by xuxueli on 17/3/10.
13
+ */
14
+public class ExecutorRouteLFU extends ExecutorRouter {
15
+
16
+    @Override
17
+    public String route(int jobId, ArrayList<String> addressList) {
18
+
19
+        // TODO
20
+
21
+        return addressList.get(0);
22
+    }
23
+
24
+}

+ 45 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java View File

1
+package com.xxl.job.admin.core.route.strategy;
2
+
3
+import com.xxl.job.admin.core.route.ExecutorRouter;
4
+
5
+import java.util.ArrayList;
6
+import java.util.LinkedHashMap;
7
+import java.util.concurrent.ConcurrentHashMap;
8
+
9
+/**
10
+ * 单个JOB对应的每个执行器,最久为使用的优先被选举
11
+ *      a、LFU(Least Frequently Used):最不经常使用,频率/次数
12
+ *      b(*)、LRU(Least Recently Used):最近最久未使用,时间
13
+ *
14
+ * Created by xuxueli on 17/3/10.
15
+ */
16
+public class ExecutorRouteLRU extends ExecutorRouter {
17
+
18
+    private static ConcurrentHashMap<Integer, LinkedHashMap<String, String>> jobLRUMap = new ConcurrentHashMap<Integer, LinkedHashMap<String, String>>();
19
+
20
+    @Override
21
+    public String route(int jobId, ArrayList<String> addressList) {
22
+
23
+        LinkedHashMap<String, String> lruItem = jobLRUMap.get(jobId);
24
+        if (lruItem == null) {
25
+            /**
26
+             * LinkedHashMap
27
+             *      a、accessOrder:ture=访问顺序排序(get/put时排序);false=插入顺序排期;
28
+             *      b、removeEldestEntry:新增元素时将会调用,返回true时会删除最老元素;可封装LinkedHashMap并重写该方法,比如定义最大容量,超出是返回true即可实现固定长度的LRU算法;
29
+             */
30
+            lruItem = new LinkedHashMap<>(16, 0.75f, true);
31
+            jobLRUMap.put(jobId, lruItem);
32
+        }
33
+
34
+        for (String address: addressList) {
35
+            if (!lruItem.containsKey(address)) {
36
+                lruItem.put(address, address);
37
+            }
38
+        }
39
+
40
+        String eldestKey = lruItem.entrySet().iterator().next().getKey();
41
+        String eldestValue = lruItem.get(eldestKey);
42
+        return eldestValue;
43
+    }
44
+
45
+}