每日学习思考笔记(第一期)

369 阅读5分钟

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 分钟不可用。
   数据安全性:文件需要加密存储,用户本人及共享文件外,其他人不能查看文件内容。不重复上传:相同文件内容不重复上传,也就是说,如果用户上传的文件内容已经被其他用户上传过了,该用户不需要再上传一次文件内容,进而实现“秒传”功能。从用户视角来看,不到一秒就可以完成一个大文件的上传。

上传文件时序图.png

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 表,如下。

image.png 限流功能 一方面通过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 轮转数组

leetcode.cn/problems/ro…

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 下节预知

下周 针对 怎么防止文件写到一半 宕机导致的一致性问题 解析下

10 复习昨天学的 最好讲给一个人听,互相学习