对于大型的分布式架构而言,我们一直在追求一种简单、优雅的方式来应对访问量和数据量的增长。而这种方式通常指的是不需要改动软件程序,仅仅通过硬件升级或者增加机器就可以解决。而这种就是分布式架构下的伸缩设计 

伸缩分为垂直伸缩和水平伸缩两种 

垂直伸缩:
表示通过升级或者增加单台机器的硬件来支撑访问量以及数据量增长的方式,垂直伸缩的好处在于技术难度比较低,运营和改动成本也相对较低。但是缺点是机器性能是有瓶颈的,同时升级高性能的小型机或者大型机,成本是非常大的。这也是阿里去 IOE 的一个原因之一 

增加 CPU 核心数:增加 CPU 后系统的服务能力能够得到大的增长,比如响应速度、同时可以处理的线程数。
但是引入 CPU 后也会带来一些显著的问题 

  1. 锁竞争加剧;多个线程同时运行访问某个共享数据,那么就涉及到锁竞争,锁竞争激烈时
    会导致很多线程都在等待锁,所以即时增加 CPU 也无法让线程得到更快的处理。当然这里是有调优手段的,可以通过调优手段来降低锁竞争 

  2. 支撑并发请求的线程数是固定的,那么即时增加 CPU,系统的服务能力也不会得到提升 

  3. 对于单线程任务,多核心 CPU 是没有太大的作用的 

增加内存:
增加内存可以直接提成系统的响应速度,当然,也有可能达不到效果,就是如果 JVM 堆内存是固定的。 

水平伸缩:
通过增加机器来支撑访问量及数据量增长的方式,成为水平伸缩,水平伸缩理论上来说没有瓶颈,但是缺点是技术要求比较高,同时给运维带来了更大的挑战 

垂直伸缩和水平伸缩都有各自的有点,我们在实际使用过程中都会对两者做结合,一方面要考虑硬件升级的成本,一方面要考虑软件改造的成本。