写点什么

架构师训练营第 5 周:技术选型 (一)

用户头像
子青
关注
发布于: 2020 年 10 月 25 日
架构师训练营第 5 周:技术选型(一)

一. 实现一致性 hash 算法

import java.util.SortedMap;import java.util.TreeMap;
public class ConsistentHashing { private static String[] nodes = {"node001", "node002", "node003", "node004"};
private static SortedMap virtualNodes; private static final int VIRTUAL_NODE_NUM = 4;
static { virtualNodes = new TreeMap<Integer, String>(); for (int i = 0, len = nodes.length ; i < len; i++) { int hashCode; String virtualNode; for (int j = 0; j < VIRTUAL_NODE_NUM; j++) { virtualNode = nodes[i] + "_" + j; hashCode = getHashCode(virtualNode); virtualNodes.putIfAbsent(hashCode, virtualNode); } } }
private static int getHashCode(String node) { final int p = 16777619; int hash = (int)2166136261L; for (int i = 0; i < node.length(); i++) hash = (hash ^ node.charAt(i)) * p; hash += hash << 13; hash ^= hash >> 7; hash += hash << 3; hash ^= hash >> 17; hash += hash << 5; if (hash < 0) hash = Math.abs(hash); return hash; }
public static String routeServer(String key) { int hashCode = getHashCode(key); SortedMap subMap = virtualNodes.tailMap(hashCode); int firstKey = (Integer)subMap.firstKey(); String virtualNode = (String)subMap.get(firstKey); String actualNode = virtualNode.substring(0, virtualNode.length() - 3); System.out.println(key + " mapped to " + actualNode); return actualNode; }
public static void main(String[] args) { String[] keys = {"123", "bbb", "12bb"}; for (int i = 0, len = keys.length; i < len; i++) { routeServer(keys[i]); } }}
复制代码


二. 学习总结

(一). 分布式缓存架构

缓存是介于数据访问者和数据源间的一种高速存储,当数据需要多次读取时,用于加快读取的速度。缓存数据一般使用 hash 表进行存储。

1. 缓存的关键指标

  • 缓存命中率

  • 缓存键集合大小

  • 缓存可使用内存空间

  • 缓存对象的生命时间

2. 通读缓存

  • 代理缓存,反向代理缓存,CDN 缓存都是通读缓存

  • 通读缓存给客户端返回缓存资源,并在请求未命中缓存时获取实际数据

  • 客户端连接的是通读缓存而不是生成响应的原始服务器


3. 旁路缓存

通常是一个独立的键值对(key-value)存储。应用代码通常会询问对象缓存需要的对象是否存在,如果存在,它会获取并使用缓存的对象,如果不存在或已过期, 应用会连接主数据源来组装对象,并将其保存回对象缓存中以便将来使用。

4. 一致性 hash 算法

5. 不合理的缓存使用场景

  • 频繁修改的数据

  • 没有热点的访问

  • 数据不一致与脏读

6. 缓存雪崩

当缓存服务崩溃的时候,数据库会因为完全不能承受如此大的压力而宕机,进而导致整个网站不可用。

7. 缓存预热

在缓存系统启动的时候就把热点数据加载好。

8. 缓存穿透

持续高并发的请求某个不存在的数据,因为缓存没有保存该数据,所有的请求都会落到数据库上,会对数据库造成很大的压力,甚至崩溃。一个简单的对策是将不存在的数据也缓存起来(其 value 值为 null),并设

定一个较短的失效时间。

(二). 消息队列/异步架构

1. 两种模型

  • 点对点模型

  • 发布订阅模型

2. 消息队列对好处

  • 实现异步处理,提升处理性能

  • 更好对伸缩性

  • 削峰填谷

  • 失败隔离和自我修复

  • 解偶

(三). 负载均衡架构

1. 负载均衡类型

  • HTTP 重定向负载均衡

  • DNS 负载均衡

  • 反向代理负载均衡

  • IP 负载均衡

  • 数据链路负载均衡

2. 负载均衡算法

  • rr

  • wrr

  • 随机

  • 最小连接

  • 源地址散列

3. 应用服务器对 session 管理

  • session 复制

  • session 绑定

  • 使用 cookie 记录 session

  • session 服务器


用户头像

子青

关注

还未添加个人签名 2018.05.04 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第 5 周:技术选型(一)