過年7天樂,學nodejs 也快樂


自從上次接觸nodejs 已經好長時間了,但是年底公司太忙了 ,沒時間看,

上次文章在ubuntu上安裝nodejs[開啟實時web時代] http://www.cnblogs.com/qqloving/p/3286001.html 2013-08-27

過年回家,家里沒網,作為一個戰斗型屌絲,自然不能錯過如此學習機會,於是買了兩本書 一本《深入淺出nodejs》一本《寫給大家看的c++》

看完nodejs 有點感覺,是移動互聯網時代不錯的技術選型,相信,5年后nodejs在中國一定會火起來,就像10年前c#剛出來,標榜為net 而生一樣。

 

1 首次在底層將性能的核心由單台服務器提升到服務器節點組合

傳統上大部分程序設計性能優化和核心都是在提升單台服務器的性能,而對服務器節點組合性能提升缺乏考慮。

一方面是,在獨立軟件服務提供商時代,過去80%的程序都運行在單台服務器上

另一方面是,在計算機結構上,cpu最快,內存次之,硬盤最次,網絡io性能最爛,所以傳統計算機都圍繞這cpu 、內存、硬盤進行設計。這可以理解為時代局限性。

前幾年,ruby 再次在單台服務器的性能上要求下滑一下,從而使開發效率在提高一次,但這幾年發現ruby風似乎小了,為啥呢?

個人認為開發效率乃是微軟的絕殺領域,ruby想要依靠開發效率在編程世界混一席之地,談何容易,加之開源世界不是很重視開發效率,而重視可閱讀,可擴展,可維護,促使ruby風刮的快,走的也快,而且高開發效率很容易出現零和游戲【1個人埋BUG,1個人改bug,一個人排期,看着每個人都很辛苦,都很努力,都應該加工資,但是從老板角度,結果維持為0】

nodejs的出現,徹底把性能分為cpu性能和io性能,而在io性能上采取異步回調機制,徹底消滅了計算機之間通信造成的等待堆積,造成的性能問題,

並發量大時候,大量的等待壓垮 服務器在傳統服務器和應用上似乎是家常便飯,這可能要和nodejs說 拜拜了

傳統web服務器應對海量並發 nodejs 服務器因對海量並發
微博桌面截圖_20140208200906

傳統的web服務器因為單台服務器可以承受的鏈接數有限,所以就弄一大堆海量服務器來分擔負載,

但是單台服務器的業務邏輯依然很復雜,軟件開發的復雜度整體上依然沒有降低,不信,你看看你的各種性能調優和可維護行的知識,是不是圍繞單台服務器的.例如高性能的***

標志

很少寫一個循環里面掉接口




微博桌面截圖_20140208201239
node js因為單一線程就可以處理很高的並發,所以每台服務器只須處理一點點業務邏輯,由一個隊列上的其他服務器處理其他邏輯,這樣,單台服務器的復雜度就極大的降低,我認為復雜度是性能的天敵,只有消滅復雜度,才能有可靠的性能



標志
一個循環里面掉接口很正常

2 nodejs自身及服務器和單線程的脆弱性

我也不知道nodejs是不是史上第一次自身就是服務器的編程工具,我資歷太淺,才work4年,nodejs是我見到的第一個自身就是服務器的編程工具.

nodejs 是單線程,遇到未知錯誤就自動退出了 。

為什么說nodejs脆弱呢,我是這么推理的以.NET和iis為例子

1 .NET APP 普通異常 黃頁                                                     普通

2 .NET APP的 iis程序池異常 程序退出                          嚴重

3 .NET iis 異常 這台服務器上的所有iis托管的程序異常        超級嚴重

大家平時寫程序 黃頁似乎是加長便飯,即使是程序上線了,該黃頁的時候,還是黃頁,但是程序整體是沒問題的

iis程序池無法啟動和iis異常就很少見了可以忽略了

但是在nodejs中,就完全不一樣 ,1和2放在一起了,因為nodejs 自身就成程序池,而且是單線程,只要出現一次異常,該線程就 退出了

這就好像以前大家只犯錯誤1 犯錯1000次才可能遇到1次錯誤2,在nodejs中犯一次錯誤就直接是錯誤2

在nodejs 風掛起來后,國外緊跟着的就是js的測試驅動的很多討論和實踐,框架出了一個又一個,為啥呢?nodejs有需求唄

3 v8內存限制和cpu、io壓力分散、事件循環問題

node 的v8 內存限制 一個線程的內存在32位和64位下都默認沒有突破2g內存,傳統的web服務器,壓力一上來,內存很快就上去了,更不用說內存比較大的操作了

node 通過異步機制加強了對cpu 和io的利用,造成了設計程序時候要先預判,我這個程序是cpu 密集呢還是io密集呢?

說實話 2013年, 通過很多事件 我才意識到 原來IO 是個很深的領域,很久以前一直認為io沒啥簡單的和1一樣。。。。。

node 整體上是依靠事件循環機制驅動,像遞歸程序非常消耗node的事件循環,很可能就造成堆棧溢出 程序退出 ,所以一般循環遞歸用c++寫插件

這幾個因素和到一起,就造成node 設計程序模塊時候 要更細致,技術粒度更細

就像一個普通的站點 用.NET 開發什么都干了 但是node 可能就不是這么回事了,例如 文件上傳、驗證碼生成 ,檢索服務,正則表達式服務等等,基本上看上去 高cpu 和高內存的模塊 都要剝離出來

4前后端模型風格一致和c++

為啥nodejs 出現后全堆棧開發就屢屢上頭條呢?,NET 程序員寫js的時候怎么沒人說全堆棧開發呢?

為啥呢?因為,有人絕望了,再加上移動互聯網的普及的加速,在服務器端生成html后到客戶端渲染已經OUT了

[ps:seo也out了,因為移動端鏈接不存在了]

so 一群被壓抑很久的身懷js絕技的人,拿着nodejs神器,在短短4年時間,幾乎攻下了web開發的各個角落,從未有一門語言在4年時間內取得如此成績.c#用了10年 才勉強取代了自己的大哥asp的市場份額,可見nodejs是多nb

[ps:隨着我國人口老齡化,新生人口減少,用人成本提高,不同分工的溝通成本將會年年上升]

全堆棧的nodejs 和宇宙效率最高的.NET 技術股票值得長期持有,尤其是要創業的各位伙伴們

微博桌面截圖_20140208211801

一直都想看看c++ 但是,NET這個大而全的平台上一般遇不到啥問題需要用c++解決,

最起碼nodejs 遞歸程序得用c++寫

nodejs 就不一樣,有一堆問題需要,所以過年就順便看看了c++,整體感覺c++沒有剛上大學時候在圖書館里面看的那么難了微笑.

感覺c++理論上也入門了 就剩下寫nodejs 時候謝謝c++練手了微笑

這也說明學習.NET 是快速進步的途徑,想學啥就學啥,我效率高,我怕啥,

5如何學習nodejs web開發?

根據我多年學習經驗

快速學習web開發的渠道 最快的是

抓取數據->整理數據->展示數據->程序優化 

題目選好了說不定還能掛點廣告把服務器錢掙回來呢

so lets go O(∩_∩)O~

                                                                                                               我實踐mvc TDD的項目  http://www.unknownerror.org/ 

                                                                                                                有時間 再弄個nodejs版本的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM