关于Scalability的一些思考与疑问
自从看了scala以后,一直在想着scalable program的事情。在google上搜索scalable programming,首先映入眼帘的就是wikipedia的scalability这个词条。
那么,scalability是什么?
wikipedia上给出的定义是“ scalability is the ability of a system, network, or process, to handle a growing amount of work in a capable manner or its ability to be enlarged to accommodate that growth.”在这句话里面,我认为它提到了scalability出现的两种情况。
一是“handle a growing amount of work in a capable manner”,另一个是“to be enlarged to accommodate that growth”。
前者考虑的是如何制定行之有效的策略来满足因工作量/负载增长而出现的scalability的需求,后者考虑的是scalability的需求出现后,怎么满足/容纳这样的工作/负载强度(计算资源or存储能力上)。前者指的更多的应该是高并发下的算法负载,是否会因为并发数太高而导致算法失效或性能退化等。后者考虑更多的也许是硬件资源,如CPU计算能力、存储能力和网络带宽等。
在诸如存储、路由、网络这些领域,scalability对系统而言都是很重要的属性。就拿存储来说,如果通过增加存储设备的数量,就可以在一定比例上提高存储的容量的话,那么这个存储系统就可以认为是scalable的。但是,这种scalable是否有一个scalability的上限呢?虽然可以一直通过增加设备的数量来增强某个硬件方面的能力,但是这样的可扩展性是否存在退化的趋势,即当数量不断增加时候,可扩展性反而没有原来那么好了。如下图所示:
scalability该如何衡量呢?用什么样的公式计算,什么样的标准来做判断呢?硬件设备的scalability是否天生难逃退化的命运,怎样减缓这种退化趋势呢?
按照wikipedia上的说法,对于“软”性的元素(比如算法、路由协议、程序等),scalable意味着在高并发下它们依旧可行。这个比较容易理解,就像数据库的索引,低并发时候一条条数据查找也是可以的,但是高并发时,这个方法似乎就耗费太多时间了,所以可能需要更优的算法好让在高并发情况下,算法也可以在规定时间内做出相应,给出计算结果。
如果说,高并发是软性元素需要scalability的梗,那么硬件需要scalability的梗是否也是这个呢?
常见的硬性元素有计算能力、存储能力、带宽等。存储需要scalability的原因显然不止高并发这一项,大数据存储就是很好的另一个理由。计算能力也是一样,不一定高并发才需要计算的scalability,在时间和计算能力直接需要权衡时,也会喜欢计算是拥有scalability的,比如对某项计算,只要这一个星期能算法就可以,那么一台PC可能就足够了,但是对于同一个任务,如果需要一个小时内得出结果,那么就需要更多的设备并行计算以更快求解(假设该任务可以并行化的话)。那么,带宽呢?带宽要如何做到scalable?多插根网线?显然不是这样,这也是我想不明白的地方。openstack通过将compute、storage、network整合到一个平台上来进行资源的按需使用,它的network又是如何做到整合在一起的呢?我这个服务器带宽不够时,怎么获得更多带宽?是否还是得依靠电信商?
上面说的都是比较笼统的元素,比如存储设备、带宽、算法什么的。当scalable真切的跟我们程序员的工作结合到一起的时候,我认为它还包含一门语言的可塑性、可修改性和可再造性。对一个项目而言,理论上说做了详设以后,用什么语言实现都是可以的。但问题是,在显示生活中,我们往往是在一个既定的框架上进行开发,更甚者,我们是在修改一个已经存在的系统。这种情况下,这个框架/系统所使用的语言的可塑性就很重要了。有没有一种办法可以避免牵一发而动全身?有没有一种语言可以在增加模块间交流的情况下却不改变接口?数据结构能否从算法中解耦?太多疑问。
想要需求不变是不可能的。所以,对系统进行修改、更新是不可避免的。那么,对系统的更改为什么导致了复杂性的增加?是因为业务本身变得复杂,还是因为使用的语言本身也导致了系统复杂性的增加?业务复杂性的增加或许可以通过业务重组等方式来进行改进,那么由于编程语言的固有特性和不可变性带来的系统额外的复杂性增加是否有避免的方法呢?什么样的语言可以灵活的做出各种变化呢?语言又有哪些变化需要应对呢?在系统更改的过程中,究竟是什么东西被改变和增加,这些东西里面有没有一些是由于编程语言额外造成的?怎样才算是灵活的语言,需要满足那些需求?