1.高并发设计思路
设计思路
- scale-out(横向扩展,分而治之):分布式部署的方式,将流量分开,让每个服务器承担一部分并发和流量
- 缓存:服务器能够处理的流量是有限的,通过缓存能快速返回结果,在相同时间内较不使用缓存处理更多请求(拓宽河道)
- 异步:未处理完的请求先返回,待数据准备好再通知请求方
2.Scale-up(纵向扩展) VS Scale-out(横向扩展)
摩尔定律:不断提升单核的性能(Scale-up),单核成为瓶颈后转为多核处理(scale-out)
| Scale-up | Scale-out | |
|---|---|---|
| 实现思路 | 提升现有服务器性能(一台) | 串联多态服务器 |
| 实现 | 升级现有服务器性能 | 将多个低性能机器组合成分布式集群处理流量 |
| 特点 | 方案简单,适合系统设计初期 | 突破单机限制引入复杂问题(可用性、一致性) |
3.缓存
降低响应时间的中间存储成为缓存(广义的)
使用场景:操作系统、浏览器、数据库和消息队列.....
为什么要用缓存:因为持久化存储(磁盘)读取太慢了
磁盘为什么慢?:因为磁盘寻道时间长(磁头寻找信息花费时间 寻道时间)(相比CPU处理和内存读取)
磁盘的组成:
- 机械手臂
- 磁头
- 转轴
- 盘片(每个盘片划分成多个同心圆,类似CD光盘)
- 磁道(存储具体信息)
- 柱面
- 扇区
盘片构造示意图
4.异步
同步:调用方等待被调用方中的逻辑执行完成(容易曹成阻塞,发生雪崩)
异步:调用方不需要等待被调用方中的逻辑执行完成(通过回调,事件通知反馈给调用方)
使用场景:
12306中,将请求写入消息队列后,快速响应用户并释放资源响应用户
再由具体的服务消费消息(生产者与消费者解耦,生产者的生产速度炳辉影响消费者的消费速度)
5.设计原则
- 最简单的系统设计满足业务需求和流量现状,选择最熟悉的技术体系。
- 随着流量的增加和业务的变化修正架构中存在问题的点,如单点问题、横向扩展问题、性能无法满足需求的组件。在这个过程中,选择社区成熟的、团队熟悉的组件帮助我们解决问题,在社区没有合适解决方案的前提下才会自己造轮子。
- 当对架构的小修小补无法满足需求时,考虑重构、重写等大的调整方式以解决现有的问题。
- 高并发系统的演进应该是循序渐进,以解决系统中存在的问题为目的和驱动力的。
6.总结
- 高并发系统的演进是一个渐进的过程,并非一蹴而就的