写点什么

架构师训练营 W05 作业

用户头像
Geek_f06ede
关注
发布于: 2020 年 11 月 20 日



作业一:

用你熟悉的编程语言实现一致性 hash 算法。

编写测试用例测试这个算法,测试 100 万 KV 数据,10 个服务器节点的情况下,计算这些 KV 数据在服务器上分布数量的标准差,以评估算法的存储负载不均衡性。

package com;
import com.alibaba.fastjson.JSON;
import org.apache.commons.collections.MapUtils;
import java.util.*;
public class UniformityHashWithVirtualNode {
    private static String[]nodeServerArr = {"192.168.1.1","192.168.1.2","192.168.1.3","192.168.1.4",
"192.168.1.5","192.168.1.6","192.168.1.7","192.168.1.8","192.168.1.9","192.168.1.10"};
    private static ListrealNodeList =new LinkedList<>();
    private static final int VIRTUALNODENUM =1;
    private static SortedMapvirtualNodeMap =new TreeMap<>();
static {
for (String nodeServer :nodeServerArr) {
realNodeList.add(nodeServer);
}
for (int i =0; i
for (String nodeServer :realNodeList) {
String virtualNodeServer = nodeServer +"VIRTUALNODE_" + i;
int hashCode = Math.abs((virtualNodeServer).hashCode());
virtualNodeMap.put(hashCode, virtualNodeServer);
}
}
System.out.println("虚拟节点列表:" + JSON.toJSONString(virtualNodeMap));
}
public static void main(String[] args) {
List keyList =new ArrayList<>();
for (int i =0; i <1000000; i++) {
String key = i +"_" +"KV";
keyList.add(key);
}
Map nodeServerCountMap =new HashMap<>();
keyList.forEach(key -> {
String serverNode =getServerNode(key);
System.out.println(key +"的 hash 值" + key.hashCode() +"被路由到了[" + serverNode +"] 节点上");
if (nodeServerCountMap.containsKey(serverNode)) {
nodeServerCountMap.put(serverNode,nodeServerCountMap.get(serverNode) +1);
}else {
nodeServerCountMap.put(serverNode,1);
}
});
System.out.println("虚拟节点与个数: [nodeServerCountMap] = " + JSON.toJSONString(nodeServerCountMap));
}
private static String getServerNode(String hashKey) {
SortedMap nodeMap =virtualNodeMap.tailMap(Math.abs((hashKey).hashCode()));
if (MapUtils.isEmpty(nodeMap)) {
int firstNodeIndex =virtualNodeMap.firstKey();
return virtualNodeMap.get(firstNodeIndex);
}
int firstNodeIndex = nodeMap.firstKey();
return nodeMap.get(firstNodeIndex);
}
}



发布于: 2020 年 11 月 20 日阅读数: 21
用户头像

Geek_f06ede

关注

还未添加个人签名 2019.12.09 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 W05 作业