05-系统设计⽬标(三):如何让系统易于扩展?05-系统设计⽬标(三):如何让系统易于扩展?
从架构设计上来说,⾼可扩展性是⼀个设计的指标,它表⽰可以通过增加机器的⽅式来线性提⾼系统的处理
能⼒,从⽽承担更⾼的流量和并发。
你可能会问:“在架构设计之初,为什么不预先考虑好使⽤多少台机器,⽀持现有的并发呢?”这个问题我
在“03|系统设计⽬标(⼀):如何提升系统性能?”⼀课中提到过,答案是峰值的流量不可控。
⼀般来说,基于成本考虑,在业务平稳期,我们会预留30%〜50%的冗余以应对运营活动或者推⼴可能带来
的峰值流量,但是当有⼀个突发事件发⽣时,流量可能瞬间提升到2〜3倍甚⾄更⾼,我们还是以微博为例。
⿅晗和关晓彤互圈公布恋情,⼤家会到两个⼈的微博下⾯,或围观,或互动,微博的流量短时间内增⻓迅
速,微博信息流也短暂出现⽆法刷出新的消息的情况。
那我们要如何应对突发的流量呢?架构的改造已经来不及了,最快的⽅式就是堆机器。不过我们需要保证,
扩容了三倍的机器之后,相应的我们的系统也能⽀撑三倍的流量。有的⼈可能会产⽣疑问:“这不是显⽽易
⻅的吗?很简单啊。”真的是这样吗?我们来看看做这件事⼉难在哪⼉。
为什么提升扩展性会很复杂为什么提升扩展性会很复杂
在上⼀讲中,我提到可以在单机系统中通过增加处理核⼼的⽅式,来增加系统的并⾏处理能⼒,但这个⽅式
并不总⽣效。因为当并⾏的任务数较多时,系统会因为争抢资源⽽达到性能上的拐点,系统处理能⼒不升反
降。
⽽对于由多台机器组成的集群系统来说也是如此。集群系统中,不同的系统分层上可能存在⼀些“瓶颈
点”,这些瓶颈点制约着系统的横线扩展能⼒。这句话⽐较抽象,我举个例⼦你就明⽩了。
⽐⽅说,你系统的流量是每秒1000次请求,对数据库的请求量也是每秒1000次。如果流量增加10倍,虽然
系统可以通过扩容正常服务,数据库却成了瓶颈。再⽐⽅说,单机⽹络带宽是50Mbps,那么如果扩容到30
台机器,前端负载均衡的带宽就超过了千兆带宽的限制,也会成为瓶颈点。那么,我们的系统中存在哪些服
务会成为制约系统扩展的重要因素呢?
其实,⽆状态的服务和组件更易于扩展,⽽像MySQL这种存储服务是有状态的,就⽐较难以扩展。因为向
存储集群中增加或者减少机器时,会涉及⼤量数据的迁移,⽽⼀般传统的关系型数据库都不⽀持。这就是为
什么提升系统扩展性会很复杂的主要原因。
除此之外,从例⼦中你可以看到,我们需要站在整体架构的⻆度,⽽不仅仅是业务服务器的⻆度来考虑系统
的扩展性。所以说,数据库、缓存、依赖的第三⽅、负载均衡、交换机带宽等等所以说,数据库、缓存、依赖的第三⽅、负载均衡、交换机带宽等等都是系统扩展时需要考虑
的因素。我们要知道系统并发到了某⼀个量级之后,哪⼀个因素会成为我们的瓶颈点,从⽽针对性地进⾏扩
展。
针对这些复杂的扩展性问题,我提炼了⼀些系统设计思路,供你了解。
⾼可扩展性的设计思路⾼可扩展性的设计思路
拆分拆分是提升系统扩展性最重要的⼀个思路,它会把庞杂的系统拆分成独⽴的,有单⼀职责的模块。相对于⼤
系统来说,考虑⼀个⼀个⼩模块的扩展性当然会简单⼀些。将复杂的问题简单化,这就是我们的思路。将复杂的问题简单化,这就是我们的思路。
评论0
最新资源