高并发代表着大流量,抵抗巨大流量的冲击,带给用户更好的使用体验,让流量更加平稳得被系统中的服务和组件处理。
解决高并发主要方向
1. Scale-out(横向扩展)
分而治之是一种常见的高并发系统设计方法,采用分布式部署 的方式把流量分流开,让每个服务器都承担一部分并发和流量。
那么什么时候选择 Scale-up(纵向扩展),什么时候选择 Scale-out 呢?
一般来讲,在我们系统设计初 期会考虑使用 Scale-up 的方式,因为这种方案足够简单,所谓能用堆砌硬件解决的问题就 用硬件来解决,但是当系统并发超过了单机的极限时,我们就要使用 Scale-out 的方式
2. 缓存
使用缓存来提高系统的性能,就好比用“拓宽河道”的方式抵抗高并发大流量的冲击。
那么为什么缓存可以大幅度提升系统的性能呢?
数据是放在持久化存储中的,一般的持久化存储都是使用磁盘作为存储介质的,而普通磁盘数据由机械手臂、磁头、转轴、盘片组成,盘片又分为磁道、柱面和扇区
普通磁盘的寻道时间是 10ms 左右,而相比于磁盘寻道花费的时间,CPU 执行指令和内存 寻址的时间都在是 ns(纳秒)级别,从千兆网卡上读取数据的时间是在μs(微秒)级别。 所以在整个计算机体系中,磁盘是最慢的一环,甚至比其它的组件要慢几个数量级。因此, 我们通常使用以内存作为存储介质的缓存,以此提升性能。
3. 异步
在某些场景下,未处理完成之前,我们可以让请求先返回,在数据准备好之后再通
知请求方,这样可以在单位时间内处理更多的请求。
4. 分层架构设计
软件架构分层在软件工程中是一种常见的设计方式,它是将整体系统拆分成 N 个层次,每 个层次有独立的职责,多个层次协同提供完整的功能。
MVC是一种标准的软件分层架构
- 分层的设计可以简化系统设计,让不同的人专注做某一层次的事情
- 分层之后可以做到很高的复用。
- 分层架构可以让我们更容易做横向扩展
缺点
明明可以在接收到请求后就可以直接查询数据库获得结果,却偏偏要在中间插入多个层次,并且有可能每个层次只是简单地做数据的传递。有时增加一个小小的需求也需要更改所有层次上的代码,看起来增加了开发的成本
单一职责原则规定每个类只有单一的功能,在这里可以引申为每一层拥有单一职 责,且层与层之间边界清晰;
迪米特法则原意是一个对象应当对其它对象有尽可能少的了 解,在分层架构的体现是数据的交互不能跨层,只能在相邻层之间进行;而开闭原则要求软 件对扩展开放,对修改关闭。它的含义其实就是将抽象层和实现层分离,抽象层是对实现 层共有特征的归纳总结,不可以修改,但是具体的实现是可以无限扩展,随意替换的。