程序員能親自架構全國各地上萬人同時訪問的高並發大數據量的軟件程序應該是職業生涯的榮幸 -开发者知识库

程序員能親自架構全國各地上萬人同時訪問的高並發大數據量的軟件程序應該是職業生涯的榮幸 -开发者知识库,第1张

    好長一段時間總是開發企業內部信息管理系統性質的軟件項目,往往是有幾個人在用的系統就能賣出幾萬元,例如只有一個人用的系統,往往可以賣1.5萬-2萬左右,若是有20來個人用的系統往往可以賣出20萬的價格。若商務談得好可以賣出更高的價格。

   我們開發人員在學習軟件開發階段往往容易過度設計、往往會忽略客戶的真正實際工作上的操作需求、數據的各種方便輸入、統計查詢的需求,而是更多的精力往往會放在系統架構上、系統的優化上等等,往往喜歡逃避真實的客戶殘酷的現實需求,其實真正達到客戶的理想狀態是相當困難的。

   曾經有一段時間很沒有成就感,辛苦開發出來的程序往往只有幾個人偶爾用用,有些失落,但是一直沒放棄努力,一直不斷優化程序,希望有一天我們開發出來的系統有上萬人同時在線使用。

 

   2011年終於這個夢想實現了,有一個國家部委級的系統需要全國各地的每個省都上報數據、同時在線錄入需求調查數據的開發任務,軟件是否經得起上萬人的並發訪問?

    其實很多時候,最難的是讓別人相信你能把這么高並發高壓力的系統能搞定,相信你的實力,然后讓你來架構這樣的系統,能說服客戶你有這樣的能力其實很難的,客戶不會讓我們來拿他做實驗的,客戶是經不起這個折騰,在全國上萬用戶面前若丟人了,領導是很沒面子的,這不是關系和錢能解決的問題,必須需要有硬功夫多年的積累,需要拿事實來證明你有這個實力,可以搞定這個技術問題,就算出了問題也有能力馬上解決好,讓客戶相信你有這個實力其實比其他什么都重要。

 

    1:首先需要有非常良好的網絡帶寬,若有上萬人同時錄入數據的普通的Web信息管理系統,至少需要10M左右的網絡帶寬,而且網通、電信的主干網都有接入比較好,否則全國各地的網絡情況都不太一樣,有的城市錄入數據時可能會遇到網絡非常緩慢的情況,甚至到無法忍受的程度。

    2:須有一台牛X的Web服務器 一台牛X的數據庫服務器(備注接近頂配的奢侈硬件服務器非個人PC),由於是需要錄入1000萬條以上數據,最好采用Oracle數據庫比較理想一些,經得起考驗一些。

    3:需要進行適當的內存緩存優化策略,不能所有的數據庫都依靠SQL數據庫的方式把壓力放在數據庫服務器上,盡量多使用內存的方式處理數據。

    4:需要一個牛X的,經得起考驗的數據庫訪問層,因為每秒都有可能成千上萬的人在訪問,若是質量不良好的數據庫訪問組件、或者不穩定的數據庫訪問組件,更容易導致系統崩潰、或者占用非常龐大的內存,最后容易導致整個系統的崩潰。

    5:需要優化分頁存取數據功能,應為有可能會有1000萬條數據,若分頁讀取數據的功能沒能優化到最高,也很容易導致系統的崩潰,因為上萬人萬一在同一時間,或者接近同一時間點了查詢某頁數據時,那系統就真崩潰了,分頁存取數據一定需要做到極致才可以。

    6:需要進行數據庫索引優化,有索引和沒索引的性能差距有時候會是100倍,大數據量時可能會有1000倍都有可能,數據庫索引優化到極致了更容易得到運行順暢的信息管理系統。

    7:嚴謹高效的數據庫事務處理,由於高並發,並且有些單據是需要同時寫入多個表,需要保證數據庫的一致性,要么全部成功,要么全部失敗重新錄入數據,所以需要一個高效的數據庫事務處理機制的配合。

    8:所有的系統的操作日志、異常信息都需要完整的記錄下來,當系統發生一些故障時,可以快速排查問題,對正確診斷系統發生的故障的原因做分析參考用。

    9:需要經常檢測系統的各項指標、例如各服務器的內存使用情況、CPU使用情況、網絡帶寬使用情況,高峰時的各個參數是什么情況、系統不繁忙時的情況等,若服務器快承受不了壓力了,就得馬上增加負載均衡的服務器,網絡帶寬不夠了需要增加等等,總不能等系統崩潰了再去做這些事情。

  10:每個頁面的HTML、JS都進行優化,若某個頁面多余發了100個字符的垃圾HTML代碼,那1萬人每天獲得100次,那得占用多少網絡帶寬,100×100×1萬個字符的多余HTML被網絡上傳輸了,要知道接入主干網的網絡資源是多么寶貴,費用是多么昂貴。

  11:HTML、JS等都可以考慮用壓縮模式傳輸,那樣網絡傳輸效率會更高一些。

  12:由於全國各地上萬人,會有各種各樣的人,這些人也未必全是好人,可能某些人心情不好,或者其他什么的,可能就會攻擊我們的軟件系統破壞數據,這些也可能是由於好奇心導致的,所以系統需要有嚴格的權限管理控制,不應該進入的頁面絕對不能進入,不應該看的數據絕對不讓看,不能操作的功能絕對不讓多操作,一方面防止沒必要的多余的麻煩,另一方面也可以減少系統被攻擊破壞的可能性。

 

   有時候我們覺得上萬人同時訪問有啥了不起的,並不覺得珍惜這個機會。

    1:若我們想讓全國各地,每個省市、甚至每個縣都同時有人在輸入數據,而且要輸入大批量的數據,其實沒幾個人有這么大的組織能力及號召力的,若全是你自己雇佣的員工,上萬個人的辛苦費你要支付多少,每個月至少需要支付上千萬,而且還需要持續錄入好幾個月,普通人是沒這個財力、也沒這個號召力、強迫力的,很多程序員可能以輩子也難遇到這樣的情況。

    2:上萬人同時在線使用的系統,其中的核心組件都是你一手編寫出來的,精心維護的代碼,那是有多么自豪感?這個是充分能驗證你編碼精湛、思維嚴謹的寶貴機會,也是顯示一下你高超精湛技藝的表現機會,至少給了你一個這樣的大舞台。很多人才雖然也很有才華,但是可能經常缺少展示才華的機會。

    3:拿上萬人驗證的高質量的代碼,將來可以一直重復應用於開發各種軟件應用系統,可以放心用,最起碼有個定心丸,不管遇到什么情況,這部分軟件絕對不會遇到問題,可以放心大膽的用,經過接近10年精心維護的組件的最大價值就體現出來了。

 

   經過這次上萬人的同時在線使用,總結了一個深刻的體會,Oracle 的序列 NEXTVAL在高並發下會有重復問題,以前雖然知道這個事情,但是從沒有過深刻的教訓,基本上在少數人實用時幾乎不會遇到重復問題,但是上萬人使用時會遇到重復問題,需要程序里進行精心處理才會不重復。

 

   先寫到這里吧,其實可寫的東西還很多,這只是屬於其中的比較明顯的一部分吧,還有服務器負載均衡、服務器安全、數據備份等等蠻多環節。

 

 

最佳答案:

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复