提交 1c5a8415 authored 作者: xueli.xue's avatar xueli.xue

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

上级 9c03285d
...@@ -12,6 +12,8 @@ public enum ExecutorRouteStrategyEnum { ...@@ -12,6 +12,8 @@ public enum ExecutorRouteStrategyEnum {
ROUND("轮询", new ExecutorRouteRound()), ROUND("轮询", new ExecutorRouteRound()),
RANDOM("随机", new ExecutorRouteRandom()), RANDOM("随机", new ExecutorRouteRandom()),
CONSISTENT_HASH("一致性HASH", new ExecutorRouteConsistentHash()), CONSISTENT_HASH("一致性HASH", new ExecutorRouteConsistentHash()),
LEAST_FREQUENTLY_USED("最不经常使用", new ExecutorRouteLFU()),
LEAST_RECENTLY_USED("最近最久未使用", new ExecutorRouteLRU()),
FAILOVER("故障转移", null); FAILOVER("故障转移", null);
ExecutorRouteStrategyEnum(String title, ExecutorRouter router) { ExecutorRouteStrategyEnum(String title, ExecutorRouter router) {
......
...@@ -23,28 +23,11 @@ public abstract class ExecutorRouter { ...@@ -23,28 +23,11 @@ public abstract class ExecutorRouter {
public static void main(String[] args) { 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<String>(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++;
}
}
long end = System.currentTimeMillis();
System.out.println(end - start); // 1000*100=740、1000*1=162、
System.out.println(c1); for (int i = 0; i < 100; i++) {
System.out.println(c2); 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());
System.out.println(c3); System.out.println(ret);
}
} }
......
...@@ -10,7 +10,7 @@ import java.util.SortedMap; ...@@ -10,7 +10,7 @@ import java.util.SortedMap;
import java.util.TreeMap; import java.util.TreeMap;
/** /**
* 分组下JOB均匀散列在不同机器上;且每个JOB固定调度其中一台机器; * 分组下机器地址相同,不同JOB均匀散列在不同机器上,保证分组下机器分配JOB平均;且每个JOB固定调度其中一台机器;
* a、virtual node:解决不均衡问题 * a、virtual node:解决不均衡问题
* b、hash method replace hashCode:String的hashCode可能重复,需要进一步扩大hashCode的取值范围 * b、hash method replace hashCode:String的hashCode可能重复,需要进一步扩大hashCode的取值范围
* Created by xuxueli on 17/3/10. * Created by xuxueli on 17/3/10.
......
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<String> addressList) {
// TODO
return addressList.get(0);
}
}
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<Integer, LinkedHashMap<String, String>> jobLRUMap = new ConcurrentHashMap<Integer, LinkedHashMap<String, String>>();
@Override
public String route(int jobId, ArrayList<String> addressList) {
LinkedHashMap<String, String> 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;
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论