网站服务器 WebServer/ApplicationServer
我们经常访问的网站背后都有一台或者若干台机器,提供HTTP/HTTPS服务,这样的机器就是网站服务器。
一台性能较好的服务器大约每秒钟可以处理1000次访问请求.
数据库 Database
- 顾名思义,就是存储数据的仓库,一般在内网中使用,不会向外网开放访问端口。
数据库配合服务器实现对数据的增删改查。 - 一般在系统架构中,数据库和WebServer会放在不同的机器上。
常见数据库
数据库一般分成关系型数据库(Relational database)和非关系型数据库(NoSQL)
常见的有以下几种
- MySQL, PostgreSQL, SQLServer, Oracle
最常见的关系型数据库,按照结构化存储数据,要求数据有较高的稳定性,不会轻易修改,表之间的关系比较复杂。 - Memcached, Redis
Key-Value NoSQL数据库,一般用作缓存系统,内存级别的访问速度,效率高,memcached要快于redis,
但是redis支持更多的数据结构,并且memcached不支持数据持久化。适合用在存储比较耗时的计算结果,或者频繁查询的数据。 - MongoDB
DocumentBased NoSQL,适合写多读少的数据 - Cassandra, HBase
Column Family Based NoSQL, 也是Key-Value的结构,只不过Key,一般分为row-key和column-key,
适合放查询请求简单的数据。
文件系统 FileSystem
操作系统的组成部分,一般是目录结构。数据库是基于文件系统存在,
换句话就是数据库系统依赖于文件系统。但是数据库系统提供了更加丰富的数据操作,
文件系统的接口比较单一。适合存储非结构化的数据,如图片,视频等等。
缓存 Cache
在系统设计中一般使用Memcache,也就是内存中的缓存。可以理解成哈希表,key-value结构。
常用的缓存软件是Memcached。由于空间有限,需要淘汰掉一些不常用的数据。
常用的算法有LRU(Least Recently Used),简易版的可以参考 LeetCode 146.LRU缓存
分析方法
- 明确设计需求
- 需要实现哪些功能,找出核心功能
- 有多大的访问量
关注几个数值:DAU(Daily Active Users)日活跃用户,MAU(Monthly Active Users)月活跃用户,QPS(Queries Per Second)每秒查询次数。要有对应的计算过程,具体数值并不重要,可以按照自己的想法或者对方的要求进行预估。
并发用户(Concurrent User):
计算QPS
- DAU * 单个用户请求次数 / 一天的秒数
- 峰值在上面数值的基础上乘以一个系数,这个结果可以作为读频率
- 写频率一般遵循二八原则,不超过读频率的20%
计算出QPS之后考虑服务器和数据库的数量
- 单台服务器QPS=1000
- 单台SQL数据库QPS=1000
- 单台NoSQL数据库QPS=10000
- 单台Memcached QPS=1000000
- 把所有需求浏览一遍,添加服务,把同一类问题或者相同逻辑的服务合并到一起
- 为每个服务选择适合的存储结构,定义数据表的结构
- 考虑系统还有那些缺陷,如何优化系统,是否支持扩展
NB,居然让我发现了这个。Acwing都是宝藏啊?求问大神,系统设计面试准备,有啥推荐的学习资料嘛?