架构师训练营 W05 作业
发布于: 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; ifor (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
版权声明: 本文为 InfoQ 作者【Geek_f06ede】的原创文章。
原文链接:【http://xie.infoq.cn/article/db52893daedeebe7c1ee0fd26】。未经作者许可,禁止转载。
Geek_f06ede
关注
还未添加个人签名 2019.12.09 加入
还未添加个人简介
评论