高并发代表着大流量,举个例子,从古至今对黄河的治理,大禹治水是拓宽河道,清除淤泥,让水流更通畅,流向大海。都江堰是通过引流的方式将岷江之水分流到多个支流,分担水流压力。三峡门和葛洲坝采用的是建造水库的方式将水储存起来然后把水库中的水缓缓排出去,提高下游抗洪能力。
Macintosh
上面的例子也提到了三个例子,其实代表了高并发系统设计的三种思路。
Scale-up (纵向扩展) Scale-out(横向扩展)。举个例子,摩尔定律,摩尔定律是指每18个月 CPU 的性能要翻一倍。这种不断追逐摩尔定律,不断提升 CPU 的方案,就叫做 Scale-up(纵向扩展),把类似CPU 多核心的方案叫做 Scale-out(横向扩展)。
系统设计最初的时候,会考虑使用 Scale-up 的方式,因为此方法简单,升级相关硬件就可以,但是当系统并发突破了单台机器的基线时,这个时候,就需要考虑scale-out 的方式。
scale-out 虽然突破了单机的限制,但是会出现分布式系统的问题,就是分布式系统中的 CAP 理论,如何保证多个节点的数据一致性?如何保证系统的可用性?如何无感知的增加或者删除节点?
大禹治水的时候疏通淤泥,防止阻塞,提高性能。
缓存主要是在高并发系统情况下,能够支撑多用户同时访问。主要是缓存的高性能,基于数据库存储,一般的持久化都是使用磁盘作为存储介质。通过机械,磁头,转轴等方式访问磁道和扇区。这个速度肯定不会特别快。
磁盘结构图
一般来说磁盘寻磁道的时间大概是 10ms 左右。相对磁盘的花费时间,CPU 执行指令,和内存寻址的时间都是 ns级别。从千兆网卡是读取的时间是 us 微秒级别。整个计算机体系中,磁盘是最慢的,这也是为啥很多计算机升级成固态硬盘。我们常说的缓存,一般是以内存作为存储介质的。可以提升性能。
异步也是高并发系统的一种设计思路,反义词是同步。
同步会阻塞等待被调用方的逻辑执行完成,才会继续往下执行,这样存在个问题,当被调用方法响应时间长时,会造成调用方长久阻塞,在高并发的情况下会出现整个系统性能下降,甚至发生雪崩。
异步调用在高并发系统中经常被调用,大家熟悉的 12306 就是,订票时,可以看到系统显示在排队,其实这个就表示在异步处理我们的订票请求。其次 12306 系统中的余票查询,下单,更改余票状态,这些操作都是耗时操作,一般是采用异步的方式,将请求丢到消息队列中,同时快速响应用户,告诉用户正在排队处理,然后释放资源出来处理更多的请求,订票请求完成后,再通知用户是订票成功还是失败。
异步高并发订单处理
罗马不是一天建成的!高并发系统的演进应该是循序渐进,以解决系统中存在的问题为目的和驱动力的。
以淘宝为例,当时在业务从0到1的阶段是通过购买的方式快速搭建了系统。而后,随着流昰的增长,淘宝做了一系列的技术改造来提升高并发处理能力,比如数据库存储引擎从 MyISAM 迁移到 InnoDB,数据库做分库分表,增加缓存,启动中间件研发等。