CS-Notes/docs/notes/系统设计基础.md

117 lines
4.4 KiB
Java
Raw Normal View History

2019-11-02 14:39:13 +08:00
<!-- GFM-TOC -->
* [性能](#一性能)
* [伸缩性](#二伸缩性)
* [扩展性](#三扩展性)
* [可用性](#四可用性)
* [安全性](#五安全性)
* [参考资料](#参考资料)
<!-- GFM-TOC -->
2018-07-30 23:22:52 +08:00
2019-03-27 20:57:37 +08:00
# 性能
## 性能指标
### 1. 响应时间
2018-08-07 17:52:24 +08:00
2018-09-02 10:59:51 +08:00
指某个请求从发出到接收到响应消耗的时间
2018-08-07 17:52:24 +08:00
2019-05-17 22:56:46 +08:00
在对响应时间进行测试时通常采用重复请求的方式然后计算平均响应时间
2018-08-07 17:52:24 +08:00
2019-03-27 20:57:37 +08:00
### 2. 吞吐量
2018-08-07 17:52:24 +08:00
指系统在单位时间内可以处理的请求数量通常使用每秒的请求数来衡量
2019-03-27 20:57:37 +08:00
### 3. 并发用户数
2018-08-07 17:52:24 +08:00
指系统能同时处理的并发用户请求数量
2019-03-27 20:57:37 +08:00
在没有并发存在的系统中请求被顺序执行此时响应时间为吞吐量的倒数例如系统支持的吞吐量为 100 req/s那么平均响应时间应该为 0.01s
2018-08-07 17:52:24 +08:00
目前的大型系统都支持多线程来处理并发请求多线程能够提高吞吐量以及缩短响应时间主要有两个原因
2019-03-27 20:57:37 +08:00
- CPU
- IO 等待时间
2018-08-07 17:52:24 +08:00
2019-03-27 20:57:37 +08:00
使用 IO 多路复用等方式系统在等待一个 IO 操作完成的这段时间内不需要被阻塞可以去处理其它请求通过将这个等待时间利用起来使得 CPU 利用率大大提高
2018-08-07 17:52:24 +08:00
并发用户数不是越高越好因为如果并发用户数太高系统来不及处理这么多的请求会使得过多的请求需要等待那么响应时间就会大大提高
2019-03-27 20:57:37 +08:00
## 性能优化
2018-08-07 17:52:24 +08:00
2019-03-27 20:57:37 +08:00
### 1. 集群
2018-08-07 17:52:24 +08:00
将多台服务器组成集群使用负载均衡将请求转发到集群中避免单一服务器的负载压力过大导致性能降低
2019-03-27 20:57:37 +08:00
### 2. 缓存
2018-08-07 17:52:24 +08:00
缓存能够提高性能的原因如下
2019-03-27 20:57:37 +08:00
- 缓存数据通常位于内存等介质中这种介质对于读操作特别快
- 缓存数据可以位于靠近用户的地理位置上
- 可以将计算结果进行缓存从而避免重复计算
2018-08-07 17:52:24 +08:00
2019-03-27 20:57:37 +08:00
### 3. 异步
2018-08-07 17:52:24 +08:00
某些流程可以将操作转换为消息将消息发送到消息队列之后立即返回之后这个操作会被异步处理
2019-03-27 20:57:37 +08:00
# 伸缩性
2018-08-07 17:52:24 +08:00
指不断向集群中添加服务器来缓解不断上升的用户并发访问压力和不断增长的数据存储需求
2019-03-27 20:57:37 +08:00
## 伸缩性与性能
2018-08-07 17:52:24 +08:00
如果系统存在性能问题那么单个用户的请求总是很慢的
如果系统存在伸缩性问题那么单个用户的请求可能会很快但是在并发数很高的情况下系统会很慢
2019-03-27 20:57:37 +08:00
## 实现伸缩性
2018-08-07 17:52:24 +08:00
应用服务器只要不具有状态那么就可以很容易地通过负载均衡器向集群中添加新的服务器
2019-03-27 20:57:37 +08:00
关系型数据库的伸缩性通过 Sharding 来实现将数据按一定的规则分布到不同的节点上从而解决单台存储服务器的存储空间限制
2018-08-07 17:52:24 +08:00
对于非关系型数据库它们天生就是为海量数据而诞生对伸缩性的支持特别好
2019-03-27 20:57:37 +08:00
# 扩展性
2018-08-07 17:52:24 +08:00
指的是添加新功能时对现有系统的其它应用无影响这就要求不同应用具备低耦合的特点
实现可扩展主要有两种方式
2019-03-27 20:57:37 +08:00
- 使用消息队列进行解耦应用之间通过消息传递进行通信
- 使用分布式服务将业务和可复用的服务分离开来业务使用分布式服务框架调用可复用的服务新增的产品可以通过调用可复用的服务来实现业务逻辑对其它产品没有影响
2018-08-07 17:52:24 +08:00
2019-03-27 20:57:37 +08:00
# 可用性
2018-08-07 17:52:24 +08:00
2019-03-27 20:57:37 +08:00
## 冗余
2018-08-07 17:52:24 +08:00
保证高可用的主要手段是使用冗余当某个服务器故障时就请求其它服务器
2018-08-25 23:12:21 +08:00
应用服务器的冗余比较容易实现只要保证应用服务器不具有状态那么某个应用服务器故障时负载均衡器将该应用服务器原先的用户请求转发到另一个应用服务器上不会对用户有任何影响
2018-08-07 17:52:24 +08:00
存储服务器的冗余需要使用主从复制来实现当主服务器故障时需要提升从服务器为主服务器这个过程称为切换
2019-03-27 20:57:37 +08:00
## 监控
2018-08-07 17:52:24 +08:00
2019-05-17 22:56:46 +08:00
CPU内存磁盘网络等系统负载信息进行监控当某个信息达到一定阈值时通知运维人员从而在系统发生故障之前及时发现问题
2018-08-07 17:52:24 +08:00
2019-03-27 20:57:37 +08:00
## 服务降级
2018-08-07 17:52:24 +08:00
2018-08-25 23:12:21 +08:00
服务降级是系统为了应对大量的请求主动关闭部分功能从而保证核心功能可用
2018-08-07 17:52:24 +08:00
2019-03-27 20:57:37 +08:00
# 安全性
2018-08-07 17:52:24 +08:00
2018-10-10 01:25:42 +08:00
要求系统在应对各种攻击手段时能够有可靠的应对措施
2018-09-19 12:56:03 +08:00
2019-03-27 20:57:37 +08:00
# 参考资料
- 大型网站技术架构核心原理与案例分析
2019-11-02 14:39:13 +08:00
2019-11-02 17:33:10 +08:00
<div align="center"><img width="320px" src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/githubio/公众号二维码-2.png"></img></div>