Github一个40.6k star的开源宝典,每个技术人都值得一看


思考,输出,沉淀。用通俗的语言陈述技术,让自己和他人都有所收获。

作者:毅航😜


System Design顾名思义就是去尝试设计一个系统。一般来说,设计完美的系统几乎是不可能的。任何的系统都是需要不断迭代。除此之外,还需要有具体的需求,并根据需求选取合适的架构风格。

可能你会想平时我的工作就是crud有必要学习系统设计吗?这个问题其实不好回答。但学习系统设计的人大多会出于如下两种原因:

  • 正在准备面试,你的目标公司会考到系统设计相关知识;
  • 目前正处于架构师或者想成为架构师 工作中会用到系统架构相关的知识。

可能你也很想系统了解System Design但苦于没有体系的资料,如果你有这样的焦虑。那最近GitHub上一个火起来的system-design-101或许能帮助到你。

GitHub地址: System Design-101


System Design-101是什么

System-design-101 见名只意,其是GitHub上一个关于系统设计的开源项目。它的目的是用图像通俗的话语 来解释复杂的系统。以帮助读者更好地理解系统设计的要点。总的来说System Design有如下亮点:

  • 涵盖了多个系统设计的主题 ,如通信协议、数据库、缓存、微服务架构等。
  • 提供了多个系统设计的案例分析 ,如Netflix、Google等。
  • 通过丰富的流程图、架构图、代码块、表格等来展示系统的结构和逻辑。

接下来,我们将选择几个比较熟悉的模块进行介绍。

Git多版本管理控制

Git 作为日常开发中一个不可缺少的工具。其主要用于管理和跟踪文件和代码的变化。而日常我们在开发中,我们的代码通常会存放于两个位置

  • 一个是在像 Github 这样的远程服务器上;
  • 另一个是在我们的本地计算机上。

然而,这并不完全准确。Git 在我们的本地计算机上维护了三个本地存储位置,这意味着我们的代码可以在四个地方找到:

  • 工作目录:我们在其中编辑文件的地方
  • 暂存区:一个临时位置,用于存放下一次提交的文件
  • 本地仓库:包含已提交的代码的地方
  • 远程仓库:存储代码的远程服务器

Git的工作原理大致如下

每位开发者通常会维护着主仓库的本地副本,并且可以对本地副本进行编辑和提交。

用户授权管理

由于Http无状态性,因此当你登录一个网站时,服务器会向你发送一个凭证。而这个凭证就是你通行证。目前常用的手段有:Session, cookie, JWT, token, SSO, and OAuth 2.0等,而且解决方案还在不断迭代。其中,

  1. Session(会话): 会话是一种用于在客户端和服务器之间保持状态的机制。通常,服务器为每个用户创建一个唯一的会话,将用户信息存储在会话中,并将会话标识发送到客户端的 Cookie 中,以便跟踪用户的状态和身份。
  2. Cookie(Cookie): Cookie 是一种存储在用户计算机上的小型文本文件,用于存储关于用户的信息,通常用于跟踪用户会话、身份验证信息和个性化设置等。
  3. JWT(JSON Web Token): JSON Web Token 是一种轻量级的开放标准,用于在用户和服务器之间安全地传输信息。它通常包含用户的声明、身份验证信息和签名,可用于验证用户身份和授权。
  4. Token(令牌): 令牌是一种用于身份验证和授权的令牌,通常是访问令牌(Access Token)或刷新令牌(Refresh Token)。它们用于访问受保护的资源或服务,而不必提供用户名和密码。
  5. SSO(Single Sign-On,单点登录): 单点登录是一种身份验证机制,允许用户使用单个凭证登录到多个关联的应用程序或服务,而不必重复输入用户名和密码。
  6. OAuth 2.0: OAuth 2.0 是一种开放标准,用于授权第三方应用程序访问受保护的资源。它允许用户授权应用程序代表他们访问他们的数据,而无需共享他们的凭证。OAuth 2.0 定义了不同类型的令牌和授权流程,以实现不同的身份验证和授权需求。

数据库

数据库在开发中扮演着至关重要的角色,其主要用于存储、管理和检索应用程序所需的数据。数据库提供了数据的结构化存储,允许应用程序进行有效的数据操作,确保数据的持久性和可靠性,以及支持多用户并发访问。如下这张图展示了目前常用的数据库软件。

进一步,数据库可以实现数据的持久化保存。但为了快速检索这些数据信息,其数据结构的选择也就至关重要。目前检索常用的结构如下所示:

其中数据库中索引常用到的数据结构如下:

  1. Skiplist(跳表):一种常见的内存中索引类型,常用于 Redis 中。
  2. 哈希索引:"Map" 数据结构(或"集合")的常见实现。
  3. LSM树(Log-Structured Merge Tree):具有高写入吞吐量。
  4. B树(B-tree):面向磁盘的解决方案,具有一致的读/写性能。
  5. 反向索引:用于文档索引,例如 Lucene 中使用。
  6. 后缀树:用于字符串模式搜索。
  7. R树(R-tree):多维搜索,如查找最近的邻居等。

如上的这些数据结构用于有效地组织和查找数据。当然在实际工作中,最重要的还是根据具体应用需求,选择合适的数据结构对于数据索引和搜索非常重要。

在此,笔者仅是列举了一小部分内容,更多详细内容可参考system-design-101进行了解。

总结

至于是否要学系统设计这其实是一个仁者见仁,智者见智的事情。反正知识就在那里,只会增加不会减少,学或者不学都在乎于个人的选择。希望如上的这个项目能帮助到你~~

相关推荐
霍先生的虚拟宇宙网络17 分钟前
webp 网页如何录屏?
开发语言·前端·javascript
jessezappy37 分钟前
jQuery-Word-Export 使用记录及完整修正文件下载 jquery.wordexport.js
前端·word·jquery·filesaver·word-export
Rverdoser1 小时前
RabbitMQ的基本概念和入门
开发语言·后端·ruby
旧林8431 小时前
第八章 利用CSS制作导航菜单
前端·css
yngsqq1 小时前
c#使用高版本8.0步骤
java·前端·c#
Tech Synapse2 小时前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
.生产的驴2 小时前
SpringCloud OpenFeign用户转发在请求头中添加用户信息 微服务内部调用
spring boot·后端·spring·spring cloud·微服务·架构
微信-since811922 小时前
[ruby on rails] 安装docker
后端·docker·ruby on rails
Myli_ing2 小时前
考研倒计时-配色+1
前端·javascript·考研
余道各努力,千里自同风2 小时前
前端 vue 如何区分开发环境
前端·javascript·vue.js