技术选型(一)

用户头像
wing
关注
发布于: 2020 年 10 月 25 日

本周是跟随李智慧老师学习架构师训练营的第五周,现将本周学习内容总结如下:

1.分布式缓存

缓存是介于数据访问者和数据源之间的一种高速存储,当数据需要多次读取的时候,用于加速数据的读取速度。

缓存(Cache)和缓冲(Buffer)的区别:

缓冲:用于低速与高速设备之间读写数据时用于缓冲数据的一种中间存储。例如写数据时,先将数据写入Buffer再通过Buffer将数据写入磁盘。

缓存类型:

操作系统缓存

CPU缓存

JVM缓存

应用缓存

分布式对象缓存

数据库缓存

CDN缓存

代理与反向代理缓存

前端缓存

缓存的关键指标就是缓存命中率。缓存命中率是指能多少次重用一个缓存来相应业务请求。

影响缓存命中率的主要指标:

1)缓存键集合大小:一个应用能够生成的所有键集合数量。键越多,重用机会就越小。

2)缓存可使用内存空间大小:物理上能缓存的对象越多,命中率就越高。

3)缓存对象生存时间:TTL(Time To Live)。对象缓存时间越长,命中率越高。

通读缓存(read-through):代理缓存、方向代理缓存,CDN缓存。请求未命中时获取实际数据。

旁路缓存(cache-aside):缓存对象不存在时,访问原数据并更新缓存。

分布式缓存一致性Hash算法:基于虚拟节点。

各种介质数据访问延时



一般来说数据的读写比在2:1缓存才有意义。

缓存常见问题:

缓存预热

缓存雪崩

缓存击穿

缓存穿透

redis预先分配16384个桶。

2.消息队列

点对点模式

发布订阅模式

消息队列的好处:

1)异步处理,提升处理性能

2)更好的伸缩

3)削峰填谷

4)失败隔离和自我修复

5)解耦

通过消息队列可以实现基于实践驱动的架构

主要MQ产品对比

RabbitMQ:性能好,社区活跃,erlang开发

ActiveMQ:可跨平台,java开发

RocketMQ:性能好,可靠性高,java开发

Kafka:针对分布式场景进行了优化,分布式伸缩性较好,Scala开发,LinkedIn出品。

3.负载均衡

1)http重定向负载均衡

2)DNS负载均衡

3)反向代理负载均衡

4)IP负载均衡

5)数据链路层负载均衡:同一虚拟ip,通过 MAC地址进行负载

常用负载均衡算法:

1)轮训

2)加权轮询

3)随机

4)最少连接

5)源地址散列

Session集群管理:

1)Session复制

2)Session绑定

3)利用Cookie记录Session

4)Session服务器



作业一(2 选 1):

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

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



package algorithm;
package algorithm;
import java.util.*;
/**
* 带虚拟节点的一致性hash算法
*/
public class ConsistentHashWithVirtualNode<S> {
//节点 hash环
private TreeMap<Integer,S> nodes;
//真实机器节点
private List<S> realShards;
//虚拟节点个数
private final static int V_NODE_NUM = 150;
public ConsistentHashWithVirtualNode(List<S> realShards) {
this.realShards = realShards;
nodes = new TreeMap<>();
init();
}
//初始化信息
private void init() {
for(int i = 0; i < realShards.size(); ++i) {
for(int j = 0; j < V_NODE_NUM; ++j) {
//关联真实节点与虚拟节点
nodes.put(hash("SHARD-" +i+"-NODE-" + j),realShards.get(i));
}
}
}
//获取key对应的真实节点信息
public S getShardInfo(String key) {
SortedMap<Integer,S> subMap = nodes.tailMap(hash(key));
if(subMap.size() == 0) {
return nodes.get(nodes.firstKey());
}
return subMap.get(subMap.firstKey());
}
//返回hashcode
private int hash(String key) {
return key.hashCode();
}
public static void main(String[] args) {
LinkedList<Map<String,Map<String,Object>>> nodes = new LinkedList<>();
//初始化10个节点
for(int i = 0; i < 9; ++i) {
Map<String,Object> tmpMap = new HashMap<>();
tmpMap.put("ip","192.1.0." +i);
tmpMap.put("use","user" +i);
tmpMap.put("pass","pass" +i);
Map<String,Map<String,Object>> node = new HashMap<>();
node.put((String)tmpMap.get("ip"),tmpMap);
nodes.add(node);
}
ConsistentHashWithVirtualNode shards = new ConsistentHashWithVirtualNode(nodes);
System.out.println(shards.getShardInfo("123456789"));
}
}



用户头像

wing

关注

还未添加个人签名 2018.05.13 加入

还未添加个人简介

评论

发布
暂无评论
技术选型(一)