自從看了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真切的跟我們程序員的工作結合到一起的時候,我認為它還包含一門語言的可塑性、可修改性和可再造性。對一個項目而言,理論上說做了詳設以后,用什么語言實現都是可以的。但問題是,在顯示生活中,我們往往是在一個既定的框架上進行開發,更甚者,我們是在修改一個已經存在的系統。這種情況下,這個框架/系統所使用的語言的可塑性就很重要了。有沒有一種辦法可以避免牽一發而動全身?有沒有一種語言可以在增加模塊間交流的情況下卻不改變接口?數據結構能否從算法中解耦?太多疑問。
想要需求不變是不可能的。所以,對系統進行修改、更新是不可避免的。那么,對系統的更改為什么導致了復雜性的增加?是因為業務本身變得復雜,還是因為使用的語言本身也導致了系統復雜性的增加?業務復雜性的增加或許可以通過業務重組等方式來進行改進,那么由於編程語言的固有特性和不可變性帶來的系統額外的復雜性增加是否有避免的方法呢?什么樣的語言可以靈活的做出各種變化呢?語言又有哪些變化需要應對呢?在系統更改的過程中,究竟是什么東西被改變和增加,這些東西里面有沒有一些是由於編程語言額外造成的?怎樣才算是靈活的語言,需要滿足那些需求?