写点什么

架构师训练营 week5 课后作业

用户头像
花果山
关注
发布于: 2020 年 11 月 22 日

作业一(2 选 1):

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

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


import java.util.ArrayList;import java.util.Collection;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Random;import java.util.SortedMap;import java.util.TreeMap;import java.util.concurrent.ConcurrentHashMap;
public class ConsistentHashingExample {
// 服务器总数 private static final int SERVERS_NUM = 100; // 每台服务器需要设置的虚拟节点数 private static final int VIRTUAL_NODES = 10;
// HASH环 private static SortedMap<Integer, String> treeMapHash;
// 待加入 Hash 环的服务器列表 private static ArrayList<String> serverList = new ArrayList<>();
private static void init() { // 构造服务器数据 for (int i = 0; i < SERVERS_NUM; i++) { String s = new StringBuilder().append("192.168.0.").append(String.valueOf(i)).toString(); serverList.add(s); } // 构建 Hash 环 treeMapHash = buildHash(new TreeMap<Integer, String>()); // 将服务器的虚拟节点添加到 Hash 环中 for (String s : serverList) { for (int i = 0; i < VIRTUAL_NODES; i++) { String VNNode = s + "&&VN" + String.valueOf(i); addServerNode(VNNode); } } }
// 构建 Hash 环 private static SortedMap<Integer, String> buildHash(TreeMap<Integer, String> treeMap) { treeMapHash = treeMap; return treeMapHash; }
private static String[] getIPAddress(int num) { String[] res = new String[num]; Random random = new Random(); for (int i = 0; i < num; i++) { res[i] = String.valueOf(random.nextInt(256)) + "." + String.valueOf(random.nextInt(256)) + "." + String.valueOf(random.nextInt(256)) + "." + String.valueOf(random.nextInt(256)) + ":" + String.valueOf(random.nextInt(9999)); } return res; }
private static void addServerNode(String serverNodeName) { int hash = new GetHashCode().getHashCode(serverNodeName); treeMapHash.put(hash, serverNodeName); System.out.println("上线服务器节点:" + serverNodeName); }
private static void delServerNode(String serverNodeName) { int hash = new GetHashCode().getHashCode(serverNodeName); treeMapHash.remove(hash); System.out.println("下线服务器节点:" + serverNodeName); }
private static String selectServerNode(String requestURL) { int hash = new GetHashCode().getHashCode(requestURL); // 向右寻找第一个 key Map.Entry<Integer, String> subEntry = ((TreeMap<Integer, String>) treeMapHash).ceilingEntry(hash); // 设置成一个环,如果超过尾部,则取第一个点 subEntry = subEntry == null ? ((TreeMap<Integer, String>) treeMapHash).firstEntry() : subEntry; String VNNode = subEntry.getValue(); return VNNode.substring(0, VNNode.indexOf("&&")); }
public static void main(String[] args) { init(); // 请求节点 String[] nodes = getIPAddress(100); // <节点,服务器> for (int i = 0; i < nodes.length; i++) { // 选择服务器 String serverIP = selectServerNode(nodes[i]); System.out.println("请求节点:["+nodes[i] + "]选择的服务器节点是:" + serverIP); }
}
}
复制代码


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

花果山

关注

还未添加个人签名 2019.05.09 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 week5 课后作业