diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java index 770d78d..9ab89b5 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java @@ -12,6 +12,8 @@ ROUND("轮询", new ExecutorRouteRound()), RANDOM("随机", new ExecutorRouteRandom()), CONSISTENT_HASH("一致性HASH", new ExecutorRouteConsistentHash()), + LEAST_FREQUENTLY_USED("最不经常使用", new ExecutorRouteLFU()), + LEAST_RECENTLY_USED("最近最久未使用", new ExecutorRouteLRU()), FAILOVER("故障转移", null); ExecutorRouteStrategyEnum(String title, ExecutorRouter router) { diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java index 770d78d..9ab89b5 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java @@ -12,6 +12,8 @@ ROUND("轮询", new ExecutorRouteRound()), RANDOM("随机", new ExecutorRouteRandom()), CONSISTENT_HASH("一致性HASH", new ExecutorRouteConsistentHash()), + LEAST_FREQUENTLY_USED("最不经常使用", new ExecutorRouteLFU()), + LEAST_RECENTLY_USED("最近最久未使用", new ExecutorRouteLRU()), FAILOVER("故障转移", null); ExecutorRouteStrategyEnum(String title, ExecutorRouter router) { diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java index ea6cbf8..0a77c3b 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java @@ -23,28 +23,11 @@ public static void main(String[] args) { - int c1 = 0; - int c2 = 0; - int c3 = 0; - long start = System.currentTimeMillis(); - for (int i = 0; i < 10; i++) { - String ret = ExecutorRouter.route(i, new ArrayList(Arrays.asList("127.0.0.1:0000", "127.0.0.1:2222", "127.0.0.1:3333")), ExecutorRouteStrategyEnum.CONSISTENT_HASH.name()); - if (ret.equals("127.0.0.1:0000")) { - c1++; - } else if (ret.equals("127.0.0.1:2222")) { - c2++; - } else if (ret.equals("127.0.0.1:3333")) { - c3++; - } + for (int i = 0; i < 100; i++) { + String ret = ExecutorRouter.route(666, new ArrayList(Arrays.asList("127.0.0.1:0000", "127.0.0.1:2222", "127.0.0.1:3333")), ExecutorRouteStrategyEnum.LEAST_RECENTLY_USED.name()); + System.out.println(ret); } - long end = System.currentTimeMillis(); - System.out.println(end - start); // 1000*100=740、1000*1=162、 - - - System.out.println(c1); - System.out.println(c2); - System.out.println(c3); } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java index 770d78d..9ab89b5 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java @@ -12,6 +12,8 @@ ROUND("轮询", new ExecutorRouteRound()), RANDOM("随机", new ExecutorRouteRandom()), CONSISTENT_HASH("一致性HASH", new ExecutorRouteConsistentHash()), + LEAST_FREQUENTLY_USED("最不经常使用", new ExecutorRouteLFU()), + LEAST_RECENTLY_USED("最近最久未使用", new ExecutorRouteLRU()), FAILOVER("故障转移", null); ExecutorRouteStrategyEnum(String title, ExecutorRouter router) { diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java index ea6cbf8..0a77c3b 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java @@ -23,28 +23,11 @@ public static void main(String[] args) { - int c1 = 0; - int c2 = 0; - int c3 = 0; - long start = System.currentTimeMillis(); - for (int i = 0; i < 10; i++) { - String ret = ExecutorRouter.route(i, new ArrayList(Arrays.asList("127.0.0.1:0000", "127.0.0.1:2222", "127.0.0.1:3333")), ExecutorRouteStrategyEnum.CONSISTENT_HASH.name()); - if (ret.equals("127.0.0.1:0000")) { - c1++; - } else if (ret.equals("127.0.0.1:2222")) { - c2++; - } else if (ret.equals("127.0.0.1:3333")) { - c3++; - } + for (int i = 0; i < 100; i++) { + String ret = ExecutorRouter.route(666, new ArrayList(Arrays.asList("127.0.0.1:0000", "127.0.0.1:2222", "127.0.0.1:3333")), ExecutorRouteStrategyEnum.LEAST_RECENTLY_USED.name()); + System.out.println(ret); } - long end = System.currentTimeMillis(); - System.out.println(end - start); // 1000*100=740、1000*1=162、 - - - System.out.println(c1); - System.out.println(c2); - System.out.println(c3); } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java index 4a42d75..8270695 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java @@ -10,7 +10,7 @@ import java.util.TreeMap; /** - * 分组下JOB均匀散列在不同机器上;且每个JOB固定调度其中一台机器; + * 分组下机器地址相同,不同JOB均匀散列在不同机器上,保证分组下机器分配JOB平均;且每个JOB固定调度其中一台机器; * a、virtual node:解决不均衡问题 * b、hash method replace hashCode:String的hashCode可能重复,需要进一步扩大hashCode的取值范围 * Created by xuxueli on 17/3/10. diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java index 770d78d..9ab89b5 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java @@ -12,6 +12,8 @@ ROUND("轮询", new ExecutorRouteRound()), RANDOM("随机", new ExecutorRouteRandom()), CONSISTENT_HASH("一致性HASH", new ExecutorRouteConsistentHash()), + LEAST_FREQUENTLY_USED("最不经常使用", new ExecutorRouteLFU()), + LEAST_RECENTLY_USED("最近最久未使用", new ExecutorRouteLRU()), FAILOVER("故障转移", null); ExecutorRouteStrategyEnum(String title, ExecutorRouter router) { diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java index ea6cbf8..0a77c3b 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java @@ -23,28 +23,11 @@ public static void main(String[] args) { - int c1 = 0; - int c2 = 0; - int c3 = 0; - long start = System.currentTimeMillis(); - for (int i = 0; i < 10; i++) { - String ret = ExecutorRouter.route(i, new ArrayList(Arrays.asList("127.0.0.1:0000", "127.0.0.1:2222", "127.0.0.1:3333")), ExecutorRouteStrategyEnum.CONSISTENT_HASH.name()); - if (ret.equals("127.0.0.1:0000")) { - c1++; - } else if (ret.equals("127.0.0.1:2222")) { - c2++; - } else if (ret.equals("127.0.0.1:3333")) { - c3++; - } + for (int i = 0; i < 100; i++) { + String ret = ExecutorRouter.route(666, new ArrayList(Arrays.asList("127.0.0.1:0000", "127.0.0.1:2222", "127.0.0.1:3333")), ExecutorRouteStrategyEnum.LEAST_RECENTLY_USED.name()); + System.out.println(ret); } - long end = System.currentTimeMillis(); - System.out.println(end - start); // 1000*100=740、1000*1=162、 - - - System.out.println(c1); - System.out.println(c2); - System.out.println(c3); } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java index 4a42d75..8270695 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java @@ -10,7 +10,7 @@ import java.util.TreeMap; /** - * 分组下JOB均匀散列在不同机器上;且每个JOB固定调度其中一台机器; + * 分组下机器地址相同,不同JOB均匀散列在不同机器上,保证分组下机器分配JOB平均;且每个JOB固定调度其中一台机器; * a、virtual node:解决不均衡问题 * b、hash method replace hashCode:String的hashCode可能重复,需要进一步扩大hashCode的取值范围 * Created by xuxueli on 17/3/10. diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java new file mode 100644 index 0000000..4069d90 --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java @@ -0,0 +1,24 @@ +package com.xxl.job.admin.core.route.strategy; + +import com.xxl.job.admin.core.route.ExecutorRouter; + +import java.util.ArrayList; + +/** + * 单个JOB对应的每个执行器,使用频率最低的优先被选举 + * a(*)、LFU(Least Frequently Used):最不经常使用,频率/次数 + * b、LRU(Least Recently Used):最近最久未使用,时间 + * + * Created by xuxueli on 17/3/10. + */ +public class ExecutorRouteLFU extends ExecutorRouter { + + @Override + public String route(int jobId, ArrayList addressList) { + + // TODO + + return addressList.get(0); + } + +} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java index 770d78d..9ab89b5 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java @@ -12,6 +12,8 @@ ROUND("轮询", new ExecutorRouteRound()), RANDOM("随机", new ExecutorRouteRandom()), CONSISTENT_HASH("一致性HASH", new ExecutorRouteConsistentHash()), + LEAST_FREQUENTLY_USED("最不经常使用", new ExecutorRouteLFU()), + LEAST_RECENTLY_USED("最近最久未使用", new ExecutorRouteLRU()), FAILOVER("故障转移", null); ExecutorRouteStrategyEnum(String title, ExecutorRouter router) { diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java index ea6cbf8..0a77c3b 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java @@ -23,28 +23,11 @@ public static void main(String[] args) { - int c1 = 0; - int c2 = 0; - int c3 = 0; - long start = System.currentTimeMillis(); - for (int i = 0; i < 10; i++) { - String ret = ExecutorRouter.route(i, new ArrayList(Arrays.asList("127.0.0.1:0000", "127.0.0.1:2222", "127.0.0.1:3333")), ExecutorRouteStrategyEnum.CONSISTENT_HASH.name()); - if (ret.equals("127.0.0.1:0000")) { - c1++; - } else if (ret.equals("127.0.0.1:2222")) { - c2++; - } else if (ret.equals("127.0.0.1:3333")) { - c3++; - } + for (int i = 0; i < 100; i++) { + String ret = ExecutorRouter.route(666, new ArrayList(Arrays.asList("127.0.0.1:0000", "127.0.0.1:2222", "127.0.0.1:3333")), ExecutorRouteStrategyEnum.LEAST_RECENTLY_USED.name()); + System.out.println(ret); } - long end = System.currentTimeMillis(); - System.out.println(end - start); // 1000*100=740、1000*1=162、 - - - System.out.println(c1); - System.out.println(c2); - System.out.println(c3); } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java index 4a42d75..8270695 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java @@ -10,7 +10,7 @@ import java.util.TreeMap; /** - * 分组下JOB均匀散列在不同机器上;且每个JOB固定调度其中一台机器; + * 分组下机器地址相同,不同JOB均匀散列在不同机器上,保证分组下机器分配JOB平均;且每个JOB固定调度其中一台机器; * a、virtual node:解决不均衡问题 * b、hash method replace hashCode:String的hashCode可能重复,需要进一步扩大hashCode的取值范围 * Created by xuxueli on 17/3/10. diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java new file mode 100644 index 0000000..4069d90 --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java @@ -0,0 +1,24 @@ +package com.xxl.job.admin.core.route.strategy; + +import com.xxl.job.admin.core.route.ExecutorRouter; + +import java.util.ArrayList; + +/** + * 单个JOB对应的每个执行器,使用频率最低的优先被选举 + * a(*)、LFU(Least Frequently Used):最不经常使用,频率/次数 + * b、LRU(Least Recently Used):最近最久未使用,时间 + * + * Created by xuxueli on 17/3/10. + */ +public class ExecutorRouteLFU extends ExecutorRouter { + + @Override + public String route(int jobId, ArrayList addressList) { + + // TODO + + return addressList.get(0); + } + +} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java new file mode 100644 index 0000000..609a8ff --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java @@ -0,0 +1,45 @@ +package com.xxl.job.admin.core.route.strategy; + +import com.xxl.job.admin.core.route.ExecutorRouter; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 单个JOB对应的每个执行器,最久为使用的优先被选举 + * a、LFU(Least Frequently Used):最不经常使用,频率/次数 + * b(*)、LRU(Least Recently Used):最近最久未使用,时间 + * + * Created by xuxueli on 17/3/10. + */ +public class ExecutorRouteLRU extends ExecutorRouter { + + private static ConcurrentHashMap> jobLRUMap = new ConcurrentHashMap>(); + + @Override + public String route(int jobId, ArrayList addressList) { + + LinkedHashMap lruItem = jobLRUMap.get(jobId); + if (lruItem == null) { + /** + * LinkedHashMap + * a、accessOrder:ture=访问顺序排序(get/put时排序);false=插入顺序排期; + * b、removeEldestEntry:新增元素时将会调用,返回true时会删除最老元素;可封装LinkedHashMap并重写该方法,比如定义最大容量,超出是返回true即可实现固定长度的LRU算法; + */ + lruItem = new LinkedHashMap<>(16, 0.75f, true); + jobLRUMap.put(jobId, lruItem); + } + + for (String address: addressList) { + if (!lruItem.containsKey(address)) { + lruItem.put(address, address); + } + } + + String eldestKey = lruItem.entrySet().iterator().next().getKey(); + String eldestValue = lruItem.get(eldestKey); + return eldestValue; + } + +}