1 不要去 开课吧 和子公司 问原因就 自己百度去
2 上节回顾/本节重点/上节思考题
2.1 本节讲解
尝试新的学习方式,一天一发
1. 网盘系统设计:万亿 GB 网盘如何实现秒传与限速?
2 volatile 初步学习
3 小学英语 自己实力不行,只能从小学开始了
4 程序员的底层思维
5 思维导图10堂客
6 轮转数组 https://leetcode.cn/problems/rotate-array/
2.3 上节 思考题解答
4 今日所学
4.1 网盘系统设计:万亿 GB 网盘如何实现秒传与限速?
1 需求
功能需求
1.1 提供文件上传和下载服务
1.2 支持断点续传 分片上传
1.3 不用重复上传
1.4 流速控制
1.5 共享文件支持 密码分享(做防护)
1.6 怎么防止文件写到一半 宕机导致的一致性问题
非功能需求
大数据量存储:10 亿注册用户,1000 亿个文件,约 1 亿 TB 的存储空间。
高并发访问:平均 1 万 QPS,高峰期 2 万 QPS。
大流量负载:平均网络带宽负载 80Gb/S,高峰期带宽负载 160Gb/s。
高可靠存储:文件不丢失,持久存储可靠性达到 99.9999% ,即 100 万个文件最多丢失(或损坏)1 个文件。
高可用服务:用户正常上传、下载服务可用性在 99.99% 以上,即一年最多 53 分钟不可用。
数据安全性:文件需要加密存储,用户本人及共享文件外,其他人不能查看文件内容。不重复上传:相同文件内容不重复上传,也就是说,如果用户上传的文件内容已经被其他用户上传过了,该用户不需要再上传一次文件内容,进而实现“秒传”功能。从用户视角来看,不到一秒就可以完成一个大文件的上传。
4.2 负载指标估算
DBox 的设计目标是支持 10 亿用户注册使用,免费用户最大可拥有 1TB 存储空间。预计日活用户占总用户的 20%,即 2 亿用户。每个活跃用户平均每天上传、下载 4 个文件。DBox 的存储量、吞吐量、带宽负载估算如下。
存储量
1TB * 10亿 = 10亿TB = 大概 100万PB
吞吐量
(2亿 * 4) / (24 * 60 * 60) = 9259.3 = 约等于 1w 高峰期 2w左右
带宽负载
1MB * 1w = 10GB/s = 80 Gb/s 高峰期带宽 160Gb/s
4.3 概要设计
4.4 详细设计
解决的问题
1 元数据如何管理?
2 网络资源如何向付费用户倾斜?
3 如何做到不重复上传?
4 怎么防止文件写到一半 宕机导致的一致性问题
元数据怎么管理 是通过mysql表 物理文件表 Physics_File 和逻辑文件表 Logic_File。其中,Logic_File 记录用户文件的元数据,并和物理文件表 Physics_File 建立多对 1 关联关系,而 Block 表关联的则是 Physics_File 表,如下。
限流功能 一方面通过client端控制,一方面是服务器控制
有限通过client 控制,服务器拿到用户限流的参数,通过控制线程 队列的方式 来控制流速
只有文件长度、文件开头 256KB 的 MD5 值、文件的 MD5 值,三个值都相同,才会认为文件相同
4.5 问题思考
共享文件支持 密码分享(做防护)
mysql 表加一个字段 密码
怎么防止文件写到一半 宕机导致的一致性问题
看RocketMq commitLog文件
5 volatile
用的是 MESI 缓存一致性协议
cpu 多级缓存
java 内存模型和 cpu缓存模型类似
read load use assign store write
read(从主存读取),load(将主存读取到的值写入工作内存),use(从工作内存读取数据来计算),assign(将计算好的值重新赋值到工作内存中),store(将工作内存数据写入主存),write(将store过去的变量值赋值给主存中的变量)
6 小学英语
1、星期一Mon
全称Monday,英[ˈmʌndeɪ]美[ˈmʌndeɪ]。
2、星期二Tues
全称Tuesday,英[ˈtjuːzdeɪ]美[ˈtuːzdeɪ]。
3、星期三Wed
全称Wednesday,英[ˈwenzdeɪ]美[ˈwenzdeɪ]。
4、星期四Thur
全称Thursday,英[ˈθɜːzdeɪ]美[ˈθɜːrzdeɪ]。
5、星期五Fri
全称Friday,英[ˈfraɪdeɪ]美[ˈfraɪdeɪ]。
6、星期六Sat
全程Saturday,英[ˈsætədeɪ]美[ˈsætərdeɪ]。
7、星期日Sun
全称Sunday,英[ˈsʌndeɪ]美[ˈsʌndeɪ]。
7 轮转数组
package org.apache.rocketmq.client.test;
public class B {
public static void main(String[] args) {
int[] nums = {1,2,3,4,5,6,7};
int[] results = c(nums, 3);
for (int result : results) {
System.out.println(result);
}
}
public static int[] a(int[] nums, int k){
if(k <= 0){
return nums;
}
int[] results = new int[nums.length];
int mid = k % nums.length;
for (int i = 0; i < nums.length; i++) {
int s = mid > i ? nums.length - mid + i : i - mid;
results[i] = nums[s];
}
return results;
}
//位移法 时间复杂度 O n 空间复杂度 O n
public static int[] c(int[] nums, int k){
int n = nums.length;
k = k % n;
// (7 - 3) % 7) = 4
int startIndex = (n - k) % n;
int[] tmp = new int[n];
for (int i = 0; i < n; i++) {
tmp[i] = nums[(startIndex + i) % n];
}
for (int i = 0; i < n; i++) {
nums[i] = tmp[i];
}
return nums;
}
//颠倒法 时间复杂度 O n 空间复杂度 O 1
public static int[] b(int[] nums, int k){
int n = nums.length;
k = k % n;
reverse(nums, 0, n - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, n - 1);
return nums;
}
public static void reverse(int[] nums, int start, int end){
while(start < end){
int tmp = nums[start];
nums[start] = nums[end];
nums[end] = tmp;
start++;
end--;
}
}
}
7 前面思考和应用场景解答 (在此之前 请再次思考前面的问题 )
8 总结:
每日学习
9 下节预知
下周 针对 怎么防止文件写到一半 宕机导致的一致性问题 解析下