写点什么

架构师训练营 - 第五周

用户头像
石子头
关注
发布于: 2021 年 01 月 11 日

作业一:

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



package com.infoq.week5;
import java.util.List;import java.util.SortedMap;import java.util.TreeMap;
public class ConsistentHashing {
private static final int VIRTUAL_NODES = 150;
private List<String> serverList = null;
private SortedMap<Integer, String> virtualNodes = new TreeMap<Integer, String>(); public ConsistentHashing(){ }
public ConsistentHashing(List serverList) { this.serverList = serverList; }
public void addServer(String serverName) { this.serverList.add(serverName); }
public void buildNodes() { for (String str : serverList) { for(int i = 0; i < VIRTUAL_NODES; i++){ String virtualNodeName = str + "-VNode-" + String.valueOf(i); int hash = getHash(virtualNodeName); virtualNodes.put(hash, virtualNodeName); } } }
public String getServerName(String key) { int hash = getHash(key); SortedMap<Integer, String> subMap = virtualNodes.tailMap(hash); String virtualNode; if(subMap.isEmpty()){ Integer i = virtualNodes.firstKey(); virtualNode = virtualNodes.get(i); }else{ Integer i = subMap.firstKey(); virtualNode = subMap.get(i); } if(null != virtualNode){ return virtualNode.substring(0, virtualNode.indexOf("-VNode")); } return null; }
private static int getHash(String str){ final int p = 16777619; int hash = (int)2166136261L; for (int i = 0; i < str.length(); i++) hash = (hash ^ str.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; } }
复制代码


作业二:根据当周学习情况,完成一篇学习总结

一、缓存

  • 缓存数据通常来自于内存,比磁盘上的数据有更快的访问速度。

  • 缓存存储数据的最终结果形态,不需要中间计算,减少 CPU 资源的消耗。

  • 缓存降低数据库、磁盘、网络的负载压力,使这些 I/O 设备获得更好的响应特性。

缓存的优点

  1. 支持大数据量存储,不受应用进程重启影响;

  2. 数据集中存储,保证数据一致性;

  3. 数据读写分离,高性能,高可用;

缓存的常见问题:

  1. 缓存击穿(更新缓存时使用分布式锁锁住服务,防止请求穿透直达 DB);

  2. 缓存穿透(放入一个特殊对象);

  3. 缓存雪崩(缓存时间使用基本时间加上随机时间)。

二、消息队列,异步框架

消息队列调用架构

  • 点对点模型

  • 发布订阅模型

消息队的优点:

  1. 对结构复杂、设计系统多的操作进行解耦操作,降低系统的操作复杂度、降低系统的维护成本;

  2. 对一个可以进行异步操作的一些系统操作进行异步,减小操作的响应时间,提供更好的用户体验;

  3. 可对高流量进行削峰,保证系统的平稳运行。

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题

实现高性能,高可用,可伸缩和最终一致性架构

使用较多的消息队列有 ActiveMQ,RabbitMQ,ZeroMQ,Kafka,RocketMQ

三、负载均衡

  • 反向代理负载均衡

  • IP 层的负载均衡

  • 数据链路层负载均衡

四、数据库

MySQL 主从复制、主主复制的原理如下:

  • 主从复制,通过主服务器对数据库的操作写 BinLog,从而通知到从服务器,写服务器的 RelayLog。异步通知从 DB 根据 RelayLog 进行 SQL 执行。通过多台从服务器,从而提供多台对外的数据读取服务。

  • 主主复制,不会两台主 DB 同时写,避免数据冲突。每台 BinLog 都是接收直接的数据库操作;而 Relay Log 负责从另一台操作读取同步信息。


用户头像

石子头

关注

还未添加个人签名 2018.03.16 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 - 第五周