为了支持不断增长的性能需求衍生出一种专门的高扩展架构。换句话说,如果你的性能需求突然超过原有的软件+硬件的组合性能上限,你可以调整自己系统,通过硬件或者软件来支持新增的性能需求
扩展因子
线性扩展:当你扩展你的系统硬件配置,你希望性能的扩展幅度也是同样水平的扩展。例如你双倍增加你的硬件配置,你的系统性能也是双倍增长。
但是一般来说非常难达到线性扩展的水平,一般你扩展一倍的硬件配置,但是你的性能扩展无法达到一倍,例如你双倍增加你的硬件配置,你的性能增长不到双倍。
扩展硬件系统配置,增加的额外的工作量多少,需要参考你系统的因素,扩展因素又依靠你的系统扩展组成
垂直扩容和水平扩容
当下非常流行的两种扩容方式:垂直扩容和水平扩容
垂直扩容:对服务器本身进行更换,部署比以前更好的服务器。新的服务器相比以前的服务器有更快的CPU,更多的内存,更大更快的硬盘,更快的内存总线
水平扩容:部署更多的服务器,增加的服务器性能与之前的服务器性能相同,或者花费同样的费用(电脑更新速度很快,同样的费用在以后电脑性能更强)
具有可扩展性架构的必备要求
从开发人员的角度来看最简单的方法就是垂直扩容,只需要将服务部署到更好的机器上,那么服务的性能就会更好,这种方式在一开始是一个相对线性的提升,但是一旦超过普通硬件的标准,需要更好的CPU, 更大更快的内存,更大更快的硬盘,更快更好的主板,这些硬件的价格提升会非常巨大相比性能的提升。同时现在的CPU发展趋势是增加多核,那么增加更多的CPU核心,但是软件并没有去明确的去利用这些新增的CPU核心,那么新增的CPU核心就不会给你带来性能提升。
水平扩容是一个更好的方式,但是水平扩容对于开发人员不是那么容易实现,为了使你的软件在多个电脑上进行很好的运行(或者一台机器多CPU),你的软件需要使用并行任务。从实际的角度来看,你的软件并行任务越好,你的软件将具有更好的水平扩容的能力
任务并行化
并行化任务需要做到如下几点
任务可以分配到不同的机器上
分配不同的任务到一台机器的不同的CPU上
分陪单独的任务在一个CPU的不同线程上
同时你你可以利用一些特殊先进的硬件来更好的支持,例如利用的显卡的计算能力,或者像具有高并发的InfiniBand网络接口。
负载均衡:分配单独的任务到单独的机器上,负载均衡的详细介绍在单独的文章中介绍。
并发任务:执行多个不同的程序在一台机器上,很可能使用同一个或者不同的CPU核心。多任务处理一般由操作系统进行操作,所以一般来说不需要软件开发人员进行考虑。所以你需要考虑的是如何将你的程序任务,变得更小,更独立但是又是相互协作的流程,如果有必要,你可以将其分布到不同的CPU核心上甚至不同的机器上。
多线程:将任务分配给一个人应用的不同线程叫做多线程,这里有一篇文章专门介绍Java 多线程,所以这里并不会具体介绍多线程。
为了实现完全并行,一个任务必须独立于其他并行执行的任务。
如果希望非常完全可以将任务部署到任何机器上,任务必须包含或能够访问执行任务所需的任何数据,而不管是什么服务器去执行任务。确切的说,这取决于您正在开发的应用程序的类型,因此在这里我无法更详细地介绍。