天天看點

一個資深程式員看12306 (二)

上一篇,我是從感官和直覺上進行的分析,可以說幾乎沒有涉及到技術層面。

但作為一個程式員,僅從感官和直覺上分析,那就不叫程式員了,更何況,我還自诩為資深程式員呢?盡管我一再軟體行業跌打了近十年,但資深也不是僅僅靠時間就能說明一切的。是以,我一定不能跑了題,本篇将從技術層面進行簡單分析。

一:從平台架構來分析

一個好的系統,必須有好的平台架構,那麼什麼樣的平台架構是好的呢?評價一個平台架構的好壞,我認為主要從五個方面來評判:

高穩定性:系統級平台,穩定壓倒一切,沒有穩定的平台一切都是浮雲。

那麼如何使一個平台具有高穩定性能?要想使一個平台具備很高的穩定性,那除了平台伺服器程式本身穩定可靠,經得住考驗外,還要有備援備份,即備份得時刻準備着。舉個形象的例子,一個富翁,出入都會帶上幾個保镖,那麼如果不發生任何事情,這些保镖的作用就看不出來,就會顯的多餘,但一旦出了事情,他們的重要性就顯現出來了,必須在關鍵的時候能夠頂上去。那這麼多的備援備份,都是要靠錢砸出來的;再換個比喻,一個國家和平時期,看不出部隊的重要性,但你敢不要部隊麼?部隊是保護和平穩定的核心内容。是以隻是高穩定三個字,那背後付出的代價多大有多少人知道?一個平台,大多數時候備援備份是多餘的,作為公司來說,不可能讓其閑着啥都不幹。就像保镖一樣,閑的時候,你可以幫着開車,甚至送老闆娃上學。部隊平時搞個演戲,或者抗個洪救個災什麼的,甚至參與到治安維護上,這樣就能很大程度的發揮了備援部分的作用。這也是為啥華為、百度、360、騰訊等很多大的公司,借助自己的優秀平台,來大力發展雲盤,雲存儲的原因,因為他們的備援備份足夠,又不能浪費。

12306作為一個在幾天内,通路人數超過全國人口總量的幾倍的系統,不可能不去考慮穩定性。

高安全性:平台必須有很強的安全性,能夠抗擊或者分散大量的攻擊;

       說完了穩定性,就要說安全性了,安全的重要名額就是使用者資訊不被盜,平台不被黑掉,大量的攻擊不能打癱瘓平台。換句話說,用戶端或者Web端你可以癱瘓數次,整個後端支援平台一次都不能挂掉。那麼如何架設一個高安全性的平台呢?

首先就要解決的是,使用者資訊不能暴露在最上層,換句話說,就是使用者資料資訊盡可能的往更底層去存放。說的更通俗一點,就是使用者登入的資料,不能直接放在第一層伺服器上。搞技術的,特别是做網站的,都知道,IE通過WebService擷取資料,而WebService直接連接配接資料庫。這就是最基礎的。這樣的網站也是最容易被攻擊的,我們應該把資料庫向下再隐藏數層級。

其次,就是分散攻擊力度。什麼意思呢?就是不能讓攻擊包始終朝着一個方向打,要知道,水滴還能石穿呢?讓攻擊始終朝着一個點,那攻破是遲早的事。如果讓他們的打擊從一個點擴散到一個面,每個面都打的不疼不癢的,就解決了問題了。

再次,就是資料傳輸的安全性,不怕一萬,就怕萬一,是以所有的涉及到使用者安全資訊的内容,都得盡可能的加密傳輸,加密轉運。其它還有資料庫的通路不要通過傳輸SQL語句而是改為存儲過程通路等。

然而,目前大多數中小公司,資料庫的位置都很靠前,甚至一些大公司都有這樣做的。分散打擊點,是很多公司不會過多考慮的,因為對公司來說,沒必要好那麼大的資金去整這些,況且,他們的通路量也不大。官網通路的後端WebService,那最多就是設計成叢集模式。前端架上個Ngx也就足夠了,有多少個公司的官網通路量能每秒達到60萬人次呢?有的公司很大,但官網并發通路量每秒不到幾萬,這樣的官網,甚至連叢集都不用考慮,隻需要一主一備,甚至癱瘓後重新開機就行了。

       但12306不同,因為好漢架不住人多,如果有人存心想對某些官網網站進行攻擊,用數十個伺服器不停地給你的WebService發無用包。不為其他,隻為讓你的網站癱瘓,有幾個能架的住的?而不幸的是,這樣的人還挺多,并且大多數是競争公司的公司行為。

       那再回到12306,每個搶票軟體的每條消息都相當于一個攻擊包,并且這些攻擊包還是合法有效的包,平台不能直接丢掉,必須處理的包,更何況還有通過正常途徑買票,不停地刷官網網站的呢?

       要想真正解決這個問題,隻能是将WebService盡可能的分布式。可以這麼了解,一個公司的官網可以同時并發的人數假如說是30萬,那100個公司的官網,把他們的并發數算在一起,那不就是3000萬了麼?是以,12306要想解決并發通路官網,就需要部署100個甚至更多的12306的WebService,那就要申請更多的域名。隻有這樣,才能保證不被同時癱瘓。但這的需要多大的儲備資金?更何況,僅僅這樣還不夠,還要解決更底層的資料同步問題。畢竟幾百個公司有幾百個資料庫,他們之間不需要考慮資料同步和一緻性,但一個公司的話,必須考慮。

高擴充性:好的平台,必須是能夠動态擴充幾乎任何一部分,并且是熱擴充性。

       這個很好了解,就是說,當你的平台資源不夠用的時候,隻需要再配置一台或幾台服務,直接插上電,通上網,這些伺服器就會自動融入到系統平台中,開始工作并提供服務了。同樣,一個伺服器如果壞掉了,直接拔掉拿走就行了,而不會影響正在工作的其它系統,也就是說,使用者感受不到任何異常。

高并發性:好的平台,必須能夠支援高并發。

       這個也很高了解,就是通路量的問題,這裡說的通路量,是合法資料包的通路量,整個平台,在同一時期,能夠同時處理的有效資料。

海量存儲:好的平台,必須有海量的存儲資訊。

       支撐高并發的,必定是優秀的存儲平台,這個平台,能夠适應海量資料的快速存儲和通路,這就不能隻是資料庫了,還要考慮記憶體存儲。因為資料庫的存儲畢竟是要做I/O操作的,I/O操作必然定會耗時。目前知名的資料庫,我比較熟知的有SQL SerVer、Oracle、SyBase、Gbase和MySql,而我這幾個資料庫中,Gbases是樹形資料庫,非關系型資料庫,是專門針對海量資料使用的,也就是說,海量資料的存儲查詢,他非常快,什麼是海量資料呢?即存儲記錄以T的倍數來計算的。10T,100T的,他的存儲速錄快到讓人咋舌,每秒鐘最高能達到百萬條資料。但他也有弊端,對于關系型資訊的查找,就很慢了,是以它隻能在特定領域使用。而SqlServer的話,如果是12306,不應該選擇他,或者說選擇他會被鄙視。因為他連基本的跨平台都不能,一般來說服務平台,都在Linux下,可他是微軟的,不支援Linux。SyBase則是有點過時的資料庫。Mysql做大存儲量才5000萬條。是以,選來選取,隻能是Oracle。他的吞吐速率不高,單純的查詢和插入,他每秒的條數我測試過的最高不足2萬條。還沒有進行關聯操作測試。是以,海量存儲僅僅靠資料庫是不行得,常用東西還需要放置在記憶體緩存中,類似Memcache這樣的東西,讓其和資料庫配合使用,才是最優秀的。但,12306的資料,很大情況下,不能這麼使用。

       另外,一個優秀的平台,還必須是高融合性,即能夠供外界快速接入。是以,粗略來說,基于分布式的優秀平台,至少要有如下幾個部分構成。

1、使用者認證伺服器。

2、日志伺服器;

3、業務處理伺服器。

4、資料管理伺服器

5、資料庫伺服器

6、排程伺服器。

7、操作維護伺服器

二:從業務分析

       綜上,一個優秀的平台,誕生時間肯定不會端,投入至少也是千萬級别的。而上面這些,對于12306來說,都過于簡單。隻需要簡單想一下,你就知道。12306的平台系統不可能是一個,他是多個平台系統的組合。

1、訂票系統:負責票務的查詢、預定、票倉管理、使用者認證和登陸。

2、支付系統:用來進行購票的支付,鎖定票據。

3、資訊通知系統:用來進行訂票後的通知。

這三大系統的融合,必然不是特别順暢,他需要銀行銀監會的協助,聯通電信移動營運商的協助。鐵路系統的協助。等等,你想到的和你想不到的。這麼想來,12306可以稱為有史以來,最為複雜的系統了。這麼想來,一些什麼IT人士不堪忍受而自組團隊來開發售票系統,簡直是一個笑話。

是以,我們應該用正确的眼光看來看12306,不能僅僅是批判。要理性對待。莫說投入一兩個億,這個系統,投入100億去做,都不為過,如果這個系統真做好了,那具有劃時代的意義,他能做到像颠覆那個通訊公司就颠覆那個,設想一下,如果他又個類似QQ的東西,一下子就聚集了上億人的賬号資訊。這是騰訊10年的成果。他隻需不到一年就能達到。那他想做其他的,還難麼?這麼想的話,給他投個100億,政府可以通過它掌控整個民生民意和經濟了。

繼續閱讀