System design summary
system design
https://github.com/donnemartin/system-design-primer

Performance vs scalability
scalability 这里面的伸缩性是指指标的。当系统有较高的负载时,每个用户仍然能够有较好的响应时,我们说他系统伸缩性强。
Performance 就是指一个请求的响应越快,自然说性能越高
如何才能让系统有更好的可伸缩性?
需要在系统设计初就提前考虑好系统设计,提前知道可能的问题点,性能点等等。
那么具体的系统设计如下:
Latency vs throughput
延时:单个请求的延时
吞吐量:单位时间内处理的请求量
Availability vs consistency
CAP理论:对于分布式系统,发生网络分区是一定要考虑的,因此在发生网络分区的情况下,对于C和A只能二选一。
当发生网络分区时,如果你允许用户操作,那么就会造成网络分区之间的数据不一致。
当发生网络分区时,如果你不允许用户操作,那么不同分区之间的数据不会因此而不一致,但这就不能保证可用性。
Consistency patterns
Weak consistency 通话视频,丢一些也没关系,最大限度保证通畅
Eventual consistency 可以忍受延时,保证最终一致性
Strong consistency 强一致性,比如Mysql 事务,事务执行后,第一次查询就要是最新的数据
Availability patterns
Fail-over : Active-passive 主从结构,当主节点挂掉后,从节点自动升级为主节点向外提供服务,比如redis哨兵,mysql主从。 Active-active 主主结构,集群中各个节点都向外提供服务,当某个节点挂机后,负载均衡器不将流量负载到宕机节点即可。比如一些分布式数据库,kafka集群等。
Availability in numbers
可靠性的一些指标,比如要达到几个9
99.9% availability - three 9s
| Duration | Acceptable downtime |
|---|---|
| Downtime per year | 8h 45min 57s |
| Downtime per month | 43m 49.7s |
| Downtime per week | 10m 4.8s |
| Downtime per day | 1m 26.4s |
99.99% availability - four 9s
| Duration | Acceptable downtime |
|---|---|
| Downtime per year | 52min 35.7s |
| Downtime per month | 4m 23s |
| Downtime per week | 1m 5s |
| Downtime per day | 8.6s |
一些常见的系统组件
DNS,用DNS做负载均衡的
CDN,某些云服务器厂商的CDN原理。我有一个域名keboom.site。然后我可以访问此域名拿到一些文件。在云厂商处配置keboom.site,他会返回给你一个类似 alicloud.keboom.site的域名,前端代码在请求资源时,使用 alicloud.keboom.site来获取资源。云厂商会将keboom.site 的资源缓存到他们的服务器上。前端程序将访问云厂商缓存的资源,这大概就是CDN原理。
负载均衡,平时我们说的有nginx,这其实是在application 层。对于负载均衡在网络协议中,layer 4 也是可以做的,我记得是有些硬件设备支持这种层次的协议。
数据库
关系式数据库,特点是他支持事务,关系型表结构。
一些讨论点: 主从:分主从的话,比如读写分离,那么就要有手段做读写分离 主主:数据冲突,事务性的破坏,需要控制访问哪个主
对于数据库主主,主从,共同的缺点:数据延时问题(主同步不及时,此时主挂机,则数据丢失),数据同步问题(同步数据,消耗性能) 联邦:国外是这么叫的,对于国内来说,他可能说叫根据业务进行数据切分。缺点:如果多数据库join就很麻烦。多数据库事务。
切片:数据做分区,切片。mysql是有partition功能的,可对数据做分区(但这只是mysql内部做的优化,如果数据量足够大,仅仅分区还是不够,可能还是要将数据分到多个数据库多个服务器,然后做hash)。当然有也人为的对表做切分,比如对表加后缀然后做hash,这样人为做切分。缺点很明显就是数据切分后,我们的查询逻辑变得复杂。
反规范:可以消除一些join,但带来一些冗余。
SQL优化:建表时:比如字段的选择,尽可能让表结构更小。SQL查询时,注意建立索引,并且能够使用到索引。慢查询排查等。
NoSQL
虽然一些NoSQL数据库声称自己支持事务,但是网络上并不太认同。
一般来说他们 可用性 > 一致性
key value:典型的redis等,作为分布式缓存使用。
doc:如MongoDB,文档型,数据结构更加灵活些,json类型的文档不必要每个字段都必须一致。如果你的数据结构层级较深,结构没有那么规整,那么可以考虑使用文档型
列式存储:大数据相关,HBase clickhouse等,特点是数据压缩效率高,支持大量的写入,大数据情形下表现好。比如日志存储,或者一些数据归档等,作为数据仓库等使用。
图形:社交关系
Cache
从头到尾,客户端缓存,CDN缓存,web sever缓存,application 缓存,分布式缓存,数据库缓存
cache pattern: 经典的redis 和 数据库的更新
查询时: cache aside:查询cache,如果cache没有,则从数据库中查询出来放到缓存中,然后返回。
缺点: 1.时间变长(查询缓存、更新数据库、更新缓存)2. 当数据库数据更新时,缓存中数据需要做过期或修改或删除等操作。3. 当缓存服务器重启,则所有缓存需要重新加载
更新时:
- 先更新数据库再跟新redis
- 先更新redis在更新数据库
以上两种方式都是有一定时间的数据不一致。
异步
消息队列—背压:生产者生产消息放到消息队列服务器的内存中,消费者进行消费时,直接从内存中读取。这样是效率最高的。如果队列中数据过多导致服务器内存不足,则消息势必存储到磁盘中。这时消费者再来进行消费,则需要先从磁盘中随机读,将数据加载到内存中,才能进行消费,这样速度就会慢。那么通过背压的方式,当内存满时,则同时生产者减慢或者暂停生产。
System design summary的更多相关文章
- File System Design Case Studies
SRC=http://www.cs.rutgers.edu/~pxk/416/notes/13-fs-studies.html Paul Krzyzanowski April 24, 2014 Int ...
- Stanford机器学习笔记-7. Machine Learning System Design
7 Machine Learning System Design Content 7 Machine Learning System Design 7.1 Prioritizing What to W ...
- Machine Learning - 第6周(Advice for Applying Machine Learning、Machine Learning System Design)
In Week 6, you will be learning about systematically improving your learning algorithm. The videos f ...
- Microchip 125 kHz RFID System Design Guide
Passive RFID Basics - AN680 INTRODUCTION Radio Frequency Identification (RFID) systems use radio fre ...
- 【线性结构上的动态规划】UVa 11400 - Lighting System Design
Problem F Lighting System Design Input: Standard Input Output: Standard Output You are given the tas ...
- Machine Learning - XI. Machine Learning System Design机器学习系统的设计(Week 6)
http://blog.csdn.net/pipisorry/article/details/44119187 机器学习Machine Learning - Andrew NG courses学习笔记 ...
- 【系统设计】论文总结之:Butler W. Lampson. Hints for computer system design
Butler W. Lampson. Hints for computer system design. ACM Operating Systems Rev. 15, 5 (Oct. 1983), p ...
- UVA11400-Lighting System Design(动态规划基础)
Problem UVA11400-Lighting System Design Accept: 654 Submit: 4654Time Limit: 3000 mSec Problem Descr ...
- Qsys 设计流程---Qsys System Design Tutorial
Qsys 设计流程 ---Qsys System Design Tutorial 1.Avalon-MM Pipeline Bridge Avalon-MM Pipeline Bridge在slave ...
- 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 11—Machine Learning System Design 机器学习系统设计
Lecture 11—Machine Learning System Design 11.1 垃圾邮件分类 本章中用一个实际例子: 垃圾邮件Spam的分类 来描述机器学习系统设计方法.首先来看两封邮件 ...
随机推荐
- Go语言的100个错误使用场景(30-40)|数据类型与字符串使用
目录 前言 4. 控制结构 4.1 忽视元素在range循环中是拷贝(#30) 4.2 忽略在 range 循环中如何评估表达式(#31) 4.3 忽略在 range 中使用指针元素的影响(#32) ...
- JS 20道概念虽老但也略有收获的JS基础题,快速做题,高效复习,不妨试试?
壹 ❀ 引 在7月21交接完所有工作后,我也进入了休年假的阶段(没用完的8天年假),看似休息内心的紧张感反而瞬间加倍,到今天为止也面了几家,好消息是工作机会特别特别多,一封简历没投,面试邀请源源不断, ...
- Linux查看系统版本的方法
记录几种查看当前Linux系统的版本的方法 一.使用命令:cat /proc/version 查看 linux版本号:Linux version 5.4.0-99-generic (buildd@lg ...
- Ubuntu 22.04 Samba 安装和配置
安装 安装 sudo apt install samba 检查服务状态 systemctl status smbd --no-pager -l 检查是否启用(开机自启动) systemctl is-e ...
- 【OpenGL ES】绘制彩色三角形
1 前言 [OpenGL ES]绘制三角形 中介绍了绘制普通三角形的方法,本文将介绍绘制彩色三角形的方法. 本文完整代码资源见→[OpenGL ES]绘制彩色三角形 项目目录如下: 2 案 ...
- maven打包更改版本号
引入依赖 <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>versions-mave ...
- toml格式配置文件介绍
toml官方wik toml官方文档 此次文档是以v1.0.0为例,进行说明的.如果使用到的版本不同,直接去官方文档中找对应的版本即可. 谈到配置文件,大家都能说出来好几种,比如常见的ini.xml. ...
- 【Azure 存储服务】记一次调用Storage Blob API使用 SharedKey Authorization出现的403错误
问题描述 使用Azure Storag Blob REST API上传文件,用SharedKey作为Authorization出现403错误. 错误消息 b'\xef\xbb\xbf<?xml ...
- consul 的 HTTP API 和使用方法
目录 搭建起 consul Consul 的 HTTP API Service API 简单地注册服务 健康检查的配置和查询 建议读者先学习笔者的另一篇文章 学习搭建 Consul 服务发现与服务网格 ...
- C++ //类模板分文件编写问题及解决 //第一中解决方式 直接包含源文件 //第二种解决方法 将.h 和 cpp的内容写到一起,将后缀改为.hpp文件
1 //第一种方式被注释 2 //未被注释是第二种方式 3 //类模板分文件编写问题及解决 4 5 6 #include <iostream> 7 #include <string& ...