思考,输出,沉淀。用通俗的语言陈述技术,让自己和他人都有所收获。
作者:毅航😜
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
等,而且解决方案还在不断迭代。其中,
- Session(会话): 会话是一种用于在客户端和服务器之间保持状态的机制。通常,服务器为每个用户创建一个唯一的会话,将用户信息存储在会话中,并将会话标识发送到客户端的 Cookie 中,以便跟踪用户的状态和身份。
- Cookie(Cookie): Cookie 是一种存储在用户计算机上的小型文本文件,用于存储关于用户的信息,通常用于跟踪用户会话、身份验证信息和个性化设置等。
- JWT(JSON Web Token): JSON Web Token 是一种轻量级的开放标准,用于在用户和服务器之间安全地传输信息。它通常包含用户的声明、身份验证信息和签名,可用于验证用户身份和授权。
- Token(令牌): 令牌是一种用于身份验证和授权的令牌,通常是访问令牌(Access Token)或刷新令牌(Refresh Token)。它们用于访问受保护的资源或服务,而不必提供用户名和密码。
- SSO(Single Sign-On,单点登录): 单点登录是一种身份验证机制,允许用户使用单个凭证登录到多个关联的应用程序或服务,而不必重复输入用户名和密码。
- OAuth 2.0: OAuth 2.0 是一种开放标准,用于授权第三方应用程序访问受保护的资源。它允许用户授权应用程序代表他们访问他们的数据,而无需共享他们的凭证。OAuth 2.0 定义了不同类型的令牌和授权流程,以实现不同的身份验证和授权需求。
数据库
数据库在开发中扮演着至关重要的角色,其主要用于存储、管理和检索应用程序所需的数据。数据库提供了数据的结构化存储,允许应用程序进行有效的数据操作,确保数据的持久性和可靠性,以及支持多用户并发访问。如下这张图展示了目前常用的数据库软件。
进一步,数据库可以实现数据的持久化保存。但为了快速检索这些数据信息,其数据结构的选择也就至关重要。目前检索
常用的结构如下所示:
其中数据库中索引常用到的数据结构如下:
Skiplist(跳表)
:一种常见的内存中索引类型,常用于Redis
中。哈希索引
:"Map" 数据结构(或"集合")的常见实现。LSM树(Log-Structured Merge Tree)
:具有高写入吞吐量。B树(B-tree)
:面向磁盘的解决方案,具有一致的读/写性能。反向索引
:用于文档索引,例如Lucene
中使用。后缀树
:用于字符串模式搜索。R树(R-tree)
:多维搜索,如查找最近的邻居等。
如上的这些数据结构用于有效地组织和查找数据。当然在实际工作中,最重要的还是根据具体应用需求,选择合适的数据结构对于数据索引和搜索非常重要。
在此,笔者
仅是列举了一小部分内容,更多详细内容可参考system-design-101进行了解。
总结
至于是否要学系统设计
这其实是一个仁者见仁,智者见智的事情。反正知识就在那里,只会增加不会减少,学或者不学都在乎于个人的选择。希望如上的这个项目能帮助到你~~