小技术君


  • Home

  • About

  • Tags

  • Categories

  • Archives

  • Sitemap

  • Book

  • Markdown

  • Search

系统设计:设计Spotify

Posted on 2024-02-02 | In 系统设计 |

Image.png

初始阶段:基础版本

需求: 初始要求是处理50万用户和3000万首歌曲。我们将有播放歌曲的用户和上传歌曲的艺术家。

1*6V8fzH4kUg780E7AJExMsA.png

估算:数据计算

让我们从估算我们需要的存储开始。首先,我们需要将歌曲存储在某种存储中。

  • 歌曲存储: Spotify等服务通常使用Ogg Vorbis或AAC等格式进行流媒体传输,假设平均歌曲大小为3MB,我们需要3MB * 3000万 = 90TB的存储空间用于歌曲。
  • 歌曲元数据: 我们还需要存储歌曲元数据和用户配置文件信息。每首歌平均的元数据大小约为100字节 — 100字节 * 3000万 = 3GB
  • 用户元数据: 平均而言,我们将每个用户存储1KB的数据 — 1KB * 50万 = 0.5GB

1*FMBXX3b6J8ZIazoEvC54Rg.png

Read more »

如何结构化我们的代码

Posted on 2024-01-27 | In 系统设计 |

软件设计最佳实践,探讨按层、按特性和六边形架构/端口和适配器的代码结构。

在这篇文章中,我将探讨如何组织我们的代码并讨论最佳实践,涵盖三种不同的方法:按层、按特性和六边形架构/端口和适配器,以及它们的优缺点。

在探讨不同的代码结构方法之前,我们需要了解基本的软件设计原则:

  • 内聚性(Cohesion):指模块内部的类彼此相关的程度。
  • 耦合性(Coupling):指不同模块之间的依赖程度。

1*2Q8ye2K8hYRtNOMHWxoOBQ.png

  • 模块性(Modularity):指软件系统被分成独立模块的程度。每个模块封装了一组特定的功能,并被设计成能够独立工作,通过明确定义的接口与其他模块交互。
  • 抽象化(Abstraction):隐藏实现细节,只通过接口暴露必要的功能。
  • 关注点分离(Separation of Concerns):具有明确定义的各个部分,每个部分处理特定的关注点。
  • 封装性(Encapsulation):将数据和方法捆绑到单个模块或类中,以隐藏内部细节。

让我们更仔细地看看内聚性和耦合性?

内聚性描述软件的 关注点有多集中。它与单一职责原则密切相关。

  • 高内聚性 意味着模块内的类彼此密切相关,并共享一个共同的、明确定义的目的。
  • 低内聚性 意味着模块内的类关系不紧密,缺乏明确的目的,具有无关的责任。

遵循的最佳实践是追求高内聚性和松耦合。

Read more »

最好使用的 v2rayNG 完整介绍与入门

Posted on 2024-01-03 | In vpn |

Just My Socks:搬瓦工官方翻墙服务,多条线路,IP不怕被墙

力荐!Just My Socks - 非常靠谱稳定的shadowsocks/V2ray代理服务!

文章目录

  1. Just My Socks介绍
  2. Just My Socks购买
  3. Just My Socks优惠码
  4. Just My Socks注册
  5. Just My Socks信息查看
  6. Just My Socks怎么用

Just My Socks是目前非常火热的一个Shadowsocks/V2ray服务商(机场),由搬瓦工官方推出,每个服务提供5条线路,包括最快的CN2 GIA线路。Just My Socks最大的优势是保证IP不被墙,如果IP被墙,会自动更换新的可用IP给用户。对于只是需要翻墙看看YouTube、ins或者谷歌以及谷歌学术的朋友,Just My Socks是一个非常合适的选择。

Read more »

在3分钟内学习二分查找

Posted on 2023-12-17 | In 算法 |

二分查找是一种在有序数组中查找元素的算法,通过不断将搜索区域分成两半来实现。你可能在日常生活中已经不知不觉地使用了大脑里的二分查找。

最常见的例子是在字典中查找一个单词。假设你想找到“马拉松”的定义。你不会从字典的开头开始查找。你会打开字典大约在中间位置。如果你在‘T’处,你已经过头了。所以,你会调整并分割差距,缩小范围直到找到“马拉松”。

1*eyscCE4qgTvv-yHMQzfpoQ.png

这个逐步排除的过程就是二分查找的要点,但是针对数组的情况。

线性查找 vs 二分查找

考虑一个从1到100的数字数组,你需要在这个范围内找到一个特定的数字,就像玩一个猜数游戏。

线性查找

简单的方法是使用一个简单的for循环——遍历数组中的每个元素直到找到目标项。

1
2
3
4
5
6
7
8
function findItem(arr, item) {
for (let i = 0; i < arr.length; i++) {
if (arr[i] === item) {
return i;
}
}
return -1; // 未找到项
}

这个方法可以找到,但它的时间复杂度是O(n);想象一下,如果你要找的数在1到1万亿之间。

你可以比线性查找做得更好。

Read more »

缓存:系统设计中至关重要的一环

Posted on 2023-12-17 | In 系统设计 |

1*miHYi3-erQzdPaF0arbxwQ.png

什么是缓存?

缓存就像是一个超快速的存储区域,保存了计算机或手机经常使用的内容的副本,这样可以在不访问较慢的主存储器的情况下快速获取。

一个现实中的例子可以是,每当我们购买杂货时,通常会倾向于大量购买,这样可以让杂货多存放一段时间,避免频繁去市场购买,这其实就是将杂货缓存在我们附近,而不是每次都从市场购买。

在系统设计中,如果缓存得当,它可以显著提升系统的性能。

缓存策略取决于数据访问模式,即数据是如何读取或写入的。例如:

  • 系统是读取密集型还是写入密集型?
  • 系统是否需要高一致性?

等等……

因此,选择正确的写入缓存策略非常关键,下面是一些不同的缓存策略:

Read more »

计算机的层次化架构

Posted on 2023-12-03 | In 系统设计 |

计算机在多层次系统中运行。每个层次都经过优化,以执行特定的任务,确保整个机器的高效运行。

1*1CjGIK6LMua2woczwH1r6A.png

从比特到大字节:理解计算机内存单元

在最基本的层面上,计算机使用二进制运行,只包含 0 和 1,被称为比特。以下是一个细分:

1 比特: 这是计算机中的基本数据单元,表示为 0 或 1。

1 字节: 包含 8 个比特,字节用于表示单个字符(例如,“A”)或数字(例如,1)。

Read more »

分片并不意味着分布式

Posted on 2023-12-03 | In 数据库分片 |

Sharding(分片)是一种将数据和负载分布到多个独立的数据库实例的技术。这种方法通过将原始数据集分割为分片来利用水平可扩展性,然后将这些分片分布到多个数据库实例中。

1*yg3PV8O2RO4YegyiYeiItA.png

但是,尽管”分布”一词出现在分片的定义中,但分片数据库并不是分布式数据库。

Read more »

生产就绪应用程序架构的高层次概述

Posted on 2023-11-26 | In 持续集成,系统设计 |

在你使用的每个完美应用程序背后,都有一整套的架构、测试、监控和安全措施。今天,让我们来看看一个生产就绪应用程序的非常高层次的架构。

CI/CD 管道

我们的第一个关键领域是持续集成和持续部署——CI/CD 管道。

这确保我们的代码从存储库经过一系列测试和管道检查,无需任何手动干预就进入生产服务器。

1*DIPdJHlAKsQero5qiyM7NQ.png

它配置了像 Jenkins 或 GitHub Actions 这样的平台,用于自动化我们的部署流程。

Read more »

Kafka 在分布式系统中八个使用场景

Posted on 2023-11-19 | In kafka,系统设计 |

Kafka 最初是为大规模日志处理而构建的。它会保留消息直到过期,并允许消费者以自己的速度拉取消息。与其前身不同,Kafka 不仅仅是一个消息队列,它是一个适用于各种情况的开源事件流平台。让我们回顾一下流行的 Kafka 使用案例。

1. 日志处理和分析

  • 下图显示了一个典型的 ELK(Elastic-Logstash-Kibana)堆栈。Kafka高效地收集来自每个实例的日志流。
  • ElasticSearch 从 Kafka 消耗日志并对其进行索引。Kibana 在 ElasticSearch 之上提供了搜索和可视化界面。

1*kTAkXkIs0mD7zrkuZA7Ocg.png

Read more »

软件工程师的关键原则-18个系统设计概念

Posted on 2023-11-11 | In 系统设计,网络技术 |

WeChat49289609a91e7d7c0e32077538409d13.png

要在系统设计中脱颖而出,深刻理解诸如负载均衡、缓存、分区、复制、数据库和代理等基本系统设计概念至关重要。

在掌握这个主模板的基础上,我们将讨论18个重要的系统设计概念。以下是每个概念的简要描述:

1. 域名系统 (DNS)

域名系统(DNS)是互联网基础设施的一个基本组成部分,将用户友好的域名转换为其相应的IP地址。它充当了互联网的电话簿,允许用户通过输入易于记忆的域名而不是计算机用于识别彼此的数值IP地址(如“192.0.2.1”)来访问网站和服务。

当您在Web浏览器中输入域名时,DNS负责查找相关的IP地址并将您的请求发送到适当的服务器。这个过程从您的计算机向递归解析器发送查询开始,然后递归解析器搜索一系列DNS服务器,从根服务器开始,然后是顶级域(TLD)服务器,最终是权威域名服务器。一旦找到IP地址,递归解析器将其返回给您的计算机,允许您的浏览器与目标服务器建立连接并访问所需的内容。

Read more »
12…6
小技术君

小技术君

桃李不言 下自成蹊

56 posts
22 categories
32 tags
RSS
GitHub Email
友情链接
  • Chris Blog
  • VPN
  • v2rayVPN
© 2015 — 2024 Chris
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4