• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      Node.js:一種新的Web應用構建技術

      2015-04-12 00:00:00王金龍宋斌丁銳
      現(xiàn)代電子技術 2015年6期

      摘 "要: 現(xiàn)如今,有很多種Web應用程序開發(fā)語言。在Web應用程序開發(fā)過程中,大部分語言都要解決多線程問題。而且這些Web應用程序都要部署在第三方Web服務器上,如:Apache,Tomcat,Nginx等。近期一種基于I/O事件驅(qū)動模型服務器端的JavaScript運行環(huán)境——Node.js得到了廣泛的關注和應用。通過對同步阻塞語言PHP和異步非阻塞的Node.js構建的Web應用程序做一些性能上的比較,發(fā)現(xiàn)在高并發(fā)請求的情況下,Node.js構建的服務器比PHP構建的應用程序的響應時間短、吞吐率高。最終得出結論Node.js在構建快速、可擴展的Web應用程序方面的優(yōu)勢大于PHP。

      關鍵詞: Web服務器; 異步非阻塞; 事件驅(qū)動模型; Node.js

      中圖分類號: TN911?34 " " " " " " " " " 文獻標識碼: A " " " " " " " " " " " " " "文章編號: 1004?373X(2015)06?0070?04

      Node.js: a new technology to build Web application

      WANG Jin?long1, SONG Bin1, DING Rui2

      (1. Nanjing University of Science amp;Technology, Nanjing 210094, China; 2. China Tietong, Taizhou 225300, China)

      Abstract: Nowadays, there are many program languages to build Web application. During developing Web application, the most of languages must handle multithreading problem. In addition, these Web application programs must be deployed in a third?party Web server, such as Apache, Tomcat, Nginx and so on. Recently, Node.js, an event?driven server?side JavaScript environment based on I/O has been widely concerned and applied. In this paper, via comparing the performance of the Web application built by synchronous blocking PHP and asynchronous non?blocking Node.js, it is found that the response time of the Web server built by Node.js is shorter than PHP and the throughput of Node.js is higher than PHP in the case of high concurrent requests. A conclusion that Node.js is superior to PHP in building fast and scalable Web application program is obtained eventually.

      Keywords: Web server; asynchronous non?blocking; event?driven model; Node.js

      0 "引 "言

      早期,PHP這門服務器端腳本語言一直受到Web應用程序的開發(fā)者們青睞,然而JavaScript一直被人們認為是前端的腳本開發(fā)語言,隨著Node.js的出現(xiàn),JavaScript得到了大家更多的關注。Node.js是建立在Chrome的JavaScript運行時之上的平臺,它用于構建快速、可擴展的網(wǎng)絡應用程序。Node.js使用一種事件驅(qū)動、非阻塞的I/O模型,這也使得跨分布式設備的數(shù)據(jù)密集型實時應用更加輕量、高效和完美[1]。

      目前,國內(nèi)外很多大公司都在將他們的部分產(chǎn)品的技術棧向Node.js轉(zhuǎn)變。國外的有,知名團購網(wǎng)站Groupon將其站點從Ruby on Rails全面遷移到了Node.js. Groupon團隊的開發(fā)人員表示,Rails非常適合小型團隊的快速開發(fā),可以讓網(wǎng)站快速啟動并運行起來,這對于初期功能不斷變化的Groupon來說,是個不錯的選擇。但是,隨著Groupon的發(fā)展和新產(chǎn)品的不斷推出,這個代碼庫越來越大,有太多的開發(fā)者在同一個代碼庫工作,他們很難在本地運行并測試產(chǎn)品。因此,Groupon團隊評估了不同的軟件棧,想尋找一個能夠解決這些問題的方案,有效處理大量傳入的HTTP請求、使并行API請求服務于每一個HTTP請求、將結果渲染為HTML5,并可以有效實現(xiàn)監(jiān)控、部署和支持。該團隊使用不同的技術棧開發(fā)了原型,并做了測試,最終發(fā)現(xiàn)Node.js是個非常適合的解決方案。遷移之后,Groupon成為全球最大的Node.js部署產(chǎn)品之一,也為之帶來下列好處:頁面加載比之前快了50%;與之前相比,處理相同的流量所使用的硬件資源更少;團隊可以獨立地更改、部署各自負責的模塊;網(wǎng)站功能和設計實現(xiàn)可以快速迭代。鑒于性能和可擴展性方面的原因,LinkedIn將其移動設施的后臺Ruby on Rails替換成Node.js。

      國內(nèi)的Node.js應用主要有,淘寶的數(shù)據(jù)平臺、網(wǎng)易開源的pomelo實時框架和有道詞典等。MyFox是淘寶一個針對海量統(tǒng)計數(shù)據(jù)設計的高性能分布式MySQL集群中間層,負責從其中提取數(shù)據(jù)、計算并輸出統(tǒng)計結果。起初MyFox使用PHP編寫,但是遇到了很多問題。如PHP是單線程的,MySQL又需要阻塞查詢,因此很難并發(fā)請求數(shù)據(jù),最終項目組決定使用Node.js實現(xiàn)MyFox。pomelo是基于Node.js的高性能、分布式游戲服務器框架。它包括基礎的開發(fā)框架和相關的擴展組件。網(wǎng)易選擇Node.js的原因是,Node.js天生就是做多進程開發(fā)的,多個節(jié)點互相通訊交織在一起組成了分布式系統(tǒng);單線程的應用模型處理游戲邏輯是最簡單,最不容易出錯的,而且不可能出現(xiàn)死鎖、鎖競爭的情況;游戲是非常I/O密集型的應用,而Node.js生來就是為I/O而生的。

      1 "性能比較

      Node.js是Web服務器技術的新寵兒。與此同時,PHP這個傳統(tǒng)的Web應用程序使用的語言,自誕生以來,褒貶不一。大家可能會說對語言的評論是沒有意義的,但是有些評論的確是得到權衡的。與PHP相比,你不必使用一個獨立的HTTP服務器,把Node.js應用部署在Nginx下也是十分常見的,但不是必須的。因此,一個典型的Web應用程序的核心就是一個Web服務器的實現(xiàn)。比較Node.js和PHP。其實,真正比較的是Node.js和PHP+Apache2(或者其他的HTTP服務器)。所以為了論證Node.js構建的Web應用程序在高并發(fā)請求下的性能優(yōu)勢,本文的比較實驗用的是Apache2和mod_php,因為它們目前是最流行的配置。

      1.1 "測試方案

      為了使比較更加的有理可據(jù),實驗用PHP5和Node.js創(chuàng)建了一個簡單的Web應用程序。為了對兩種架構的I/O性能做比較,該應用程序從測試數(shù)據(jù)庫的用戶表中讀出前50行數(shù)據(jù),并且以JSON字符串的形式輸出到頁面。并通過開源的服務器性能測試工具Siege對兩者分別進行50,100,150,200,250和300個并發(fā)情況下的壓力測試。保持應用程序簡單的好處一是不必過問兩種語言的實現(xiàn)細節(jié),更重要的是,并非測試代碼的能力,真正測試的是兩種結構的差別。實驗服務器和實驗環(huán)境配置如下:

      硬件環(huán)境:Intel Core i5?3337U CPU@1.80 GHz,4 GB RAM。

      軟件環(huán)境:Ubuntu 12.10 x64,Apache 2.2.22,PHP 5.4.6,Node.js 0.10.28,MySQL 5.5.37、服務器性能測試工具Siege。

      Node.js應用程序代碼如下:

      var http = require(′http′),

      mysql = require(′mysql′);

      var connection = mysql.createConnection({

      host: ′localhost′,

      user: ′root′,

      password: ′root′,

      database: ′test′

      });

      http.createServer(function(req, res){

      connection.query(′select * from test_table limit 50′, function(err, rows, field){

      if(err) return err;

      res.end(JSON.stringify(rows));

      });

      }).listen(8090);

      PHP代碼如下:

      lt;?php

      $db = new PDO(′mysql:host=localhost;dbname=test′, ′root′,

      ′root′);

      $rows =$db-gt;query(′select * from test_table limit 50;′)-gt;fetchAll();

      echo json_encode($rows);

      ?gt;

      從上面的代碼可以看出,Node.js是通過回調(diào)函數(shù)(即函數(shù)作為參數(shù))實現(xiàn)異步操作,而PHP是完全的同步編程風格。而且,兩段代碼都能實現(xiàn)上述的功能。雖然PHP腳本明顯比Node.js短,但是,PHP不必實現(xiàn)一個完整的HTTP服務器,而Node.js只需要一句代碼(即http.createServer)就可以創(chuàng)建一個HTTP服務器。

      1.2 "測試結果及分析

      圖1顯示在不同并發(fā)數(shù)下,Node.js構建的服務器每秒鐘處理的事務數(shù)明顯高于PHP應用。圖2顯示Node.js構建的服務器的吞吐率維持在0.7 MB/s上下波動,而部署在Apache2服務器上PHP應用的吞吐率則維持在0.2 MB/s上下波動。

      lt;E:\王芳\現(xiàn)代電子技術201506\現(xiàn)代電子技術15年38卷第6期\Image\28t1.tifgt;

      圖1 不同并發(fā)數(shù)下的服務器每秒處理的事務數(shù)

      lt;E:\王芳\現(xiàn)代電子技術201506\現(xiàn)代電子技術15年38卷第6期\Image\28t2.tifgt;

      圖2 不同并發(fā)數(shù)下的服務器的吞吐率

      1.2.1 "多線程與單進程

      實際上,上面的實驗結果并不奇怪,只是表明了兩種解決方案之間的架構差異。PHP本身不是多線程的,但是Apache2支持多線程,一個請求對應一個Apache線程。每個請求都有一個獨立的PHP線程運行,請求之間的PHP環(huán)境相互獨立,互不影響。此外,每次啟動一個線程,都會占用一定大小的內(nèi)存,CPU上下文環(huán)境的切換也會帶來一定的開銷。

      然而,Node.js構建的Web服務器是單進程的,一個進程中保持一個活躍的請求處理線程。所以內(nèi)部沒有不同請求實例與父進程之間通信這種情況。相比PHP/Apache,Node.js的內(nèi)存使用更加高效,Apache的每個并發(fā)請求都會占用一定的內(nèi)存,但是,Node.js不同請求都是共享內(nèi)存的。

      由于Apache服務器上每個請求都是相互獨立,而服務器的內(nèi)存又是有限的,所以其必須在并發(fā)請求數(shù)和內(nèi)存之間做一個權衡。然而,Node.js不同請求共享內(nèi)存的優(yōu)勢,因此,Node.js構建的服務器每秒處理的請求數(shù)(即RPS)會高于Apache服務器,而RPS最終又會反應到服務器的吞吐率,如圖2所示,Node.js構建的服務器的吞吐率明顯高過PHP。

      1.2.2 "同步與異步

      PHP語言是以同步阻塞的方式執(zhí)行的。它的優(yōu)點十分明顯,利于程序員順序編寫業(yè)務邏輯;它的缺點在小規(guī)模站點中基本不存在,但是在復雜的網(wǎng)絡應用中,阻塞導致它無法更好的并發(fā)。

      然而Node.js是異步I/O的,Web應用已經(jīng)不再是單臺服務器就能勝任的時代了,在跨網(wǎng)絡的結構下,并發(fā)已經(jīng)是現(xiàn)代編程中的標準配備了[2]。具體到實處,則可以從用戶體驗和資源分配這兩個方面說起。

      在用戶體驗方面,Node.js的實質(zhì)是運行在Chrome v8引擎上的JavaScript。在瀏覽器中JavaScript在單線程上執(zhí)行,而且還與UI渲染共用一個線程。這意味著JavaScript在執(zhí)行的時候UI渲染和響應是處于停滯狀態(tài)的。如果網(wǎng)頁獲取一個網(wǎng)絡資源,通過同步的方式獲取,那么JavaScript則需要等待資源完全從服務器端獲取后才能繼續(xù)執(zhí)行,這期間UI將停頓,不響應用戶的交互行為。然而,如果采用異步請求,在下載資源期間,JavaScript和UI的執(zhí)行都不會處于等待狀態(tài)。但是,前端獲取資源的速度也取決于后端的響應速度,所以Node.js中資源的I/O都是異步[3]。

      從資源分配方面分析,在計算機資源中,通常I/O與CPU計算之間是可以并行進行的。但是同步的編程模型導致的問題是,I/O的進行會讓后續(xù)的任務等待,這造成資源不能被更好的利用。從實驗結果圖1可以看出,PHP的同步阻塞I/O問題導致其每秒處理的事務數(shù)明顯比異步非阻塞的Node.js低很多。而且,單線程同步編程模型會因阻塞I/O導致硬件資源得不到更優(yōu)的使用,多線程編程模型也因為編程中的死鎖、狀態(tài)同步等問題讓開發(fā)人員頭疼。Node.js在兩者之間給出了它的方案:利用單線程,遠離多線程死鎖、狀態(tài)同步等問題;利用異步I/O,讓單線程遠離阻塞,以更好的使用CPU。

      1.2.3 "測試結論

      通過上述實驗,可以看出Node.js構建的單進程、異步非阻塞I/O的Web服務器在處理高并發(fā)請求上的優(yōu)勢。面對高并發(fā)的用戶請求,Node.js構建的Web服務器能作出更快速的響應,而且能有效利用服務器的硬件資源。

      2 "Node.js機制及適用領域

      以上分析了Node.js通過異步非阻塞I/O高效的處理并發(fā)請求的優(yōu)勢。但是Node.js如何在單線程的請求的局限下,處理并發(fā)請求。下面,本文將介紹Node.js處理并發(fā)請求機制及其適用的領域。

      2.1 "Node.js事件驅(qū)動模型

      Node.js構建的服務器是通過事件驅(qū)動模型來處理并發(fā)請求的。在Node.js中,所有的磁盤I/O都對應一個事件,Node.js內(nèi)部有一個事件循環(huán)進程,一直輪詢是否有事件發(fā)生。如果某個事件發(fā)生了,就會執(zhí)行相應事件的事件處理函數(shù)(又稱回調(diào)函數(shù))。用流程圖表示,如圖3所示。

      2.2 "Node.js編程模型

      Node.js的I/O方法是嚴格的:異步的交互是它的規(guī)則。每個I/O操作都是通過高度嵌套的函數(shù)(即一個函數(shù)作為另一個函數(shù)的參數(shù))處理的。在極少數(shù)的情況下,Node.js開發(fā)人員才會用到同步執(zhí)行的函數(shù)。例如,為了刪除或者重命名文件,如果這個操作可能需要網(wǎng)絡或文件的I/O調(diào)用,控制邏輯會立即返回給調(diào)用者。但是,當有一些情況發(fā)生時,例如,如果數(shù)據(jù)變?yōu)榭捎糜趶木W(wǎng)絡Socket讀取,輸出流準備好寫操作或者有錯誤發(fā)生時,回調(diào)函數(shù)將被調(diào)用[4]。也正是由于Node.js異步回調(diào)的編程風格,導致開發(fā)過程中到處都是callback,代碼不優(yōu)雅,但是因為Node.js社區(qū)的活躍,出現(xiàn)了許多第三方的模塊來解決“回調(diào)陷阱”[5]問題。相比于Node.js,PHP是同步阻塞的編程模型,代碼邏輯更容易理解。

      lt;E:\王芳\現(xiàn)代電子技術201506\現(xiàn)代電子技術15年38卷第6期\Image\28t3.tifgt;

      圖3 事件驅(qū)動模型流程圖

      Node.js本身就支持構建HTTP服務器,而不需要借助第三方的Web服務器,所以用Node.js開發(fā)的Web應用程序部署非常方便、高效。

      2.3 "Node.js應用領域

      正如本文上面提到的,Node.js非常適合以下情況:在響應客戶端之前,預計可能有很高的流量,但所需的服務器端邏輯和處理不一定很多,Node.js發(fā)揮優(yōu)勢的典型示例如下:提供RESTful API的Web服務接收幾個參數(shù),解析它們,組合一個響應,并返回一個響應給用戶。這是適合Node.js的理想情況,因為可以構建它來處理數(shù)萬條連接,但是不需要處理大量邏輯,它本質(zhì)上只是從某個數(shù)據(jù)庫中查找一些值并將它們組成一個響應。由于響應是少量文本,請求也是少量的文本,因此流量不高,一臺機器甚至也可以處理最繁忙的公司的API需求[6]。在游戲數(shù)據(jù)統(tǒng)計方面,Node.js也發(fā)揮了很好的優(yōu)勢。當生成很高級別的統(tǒng)計數(shù)據(jù)時,必須跟蹤海量信息,如果有數(shù)百萬玩家同時在線玩游戲,而且處于游戲中的不同位置,為了快速生成海量信息,Node.js是這種場景的一種很好的解決方案,因為它能采集游戲生成的數(shù)據(jù),對數(shù)據(jù)進行最少的合并,然后對數(shù)據(jù)進行排隊,以便將它們寫入數(shù)據(jù)庫。

      但是,Node.js不適用在CPU密集型的應用,例如CPU使用率高而I/O操作少的情況[7]。因為Node.js是單線程的,對于多核CPU的服務器,Node.js不能有效地利用所有的核心。

      3 "結 "語

      本文通過對Node.js構建的Web服務器和PHP構建的應用程序做了性能上的比較,最終發(fā)現(xiàn),異步非阻塞的Node.js構建的Web服務器在處理高并發(fā)請求方面的優(yōu)勢,但是它不適用于CPU密集型的應用??偟膩碚f,Node.js完成了它提供快速可擴展服務器目標。Node.js使用了 Google 的一個非常快速的 JavaScript 引擎,即 v8 引擎[8]。同時使用一個事件驅(qū)動設計來保持代碼最小且易于閱讀。所有這些因素促成了 Node.js的理想目標,即編寫一個快速可擴展的解決方案變得比較容易。與理解Node.js是什么同樣重要的是,理解它不是什么。Node.js并不只是Apache的一個替代品,它旨在使Web應用程序更容易擴展。事實遠非如此,盡管 Node 還處于初始階段,但它發(fā)展得非常迅速,社區(qū)參與度非常高,社區(qū)成員創(chuàng)建了大量優(yōu)秀模塊,一年之內(nèi),這個不斷發(fā)展的產(chǎn)品就有可能出現(xiàn)在您的企業(yè)中。

      參考文獻

      [1] MCLAUGHLIN Brett. What is node? [M]. California: O'Reilly Media, 2011.

      [2] 樸靈.深入淺出Node.js[M].北京:人民郵電出版社,2013.

      [3] TILKOY Stefan, VINOSKI Steve. Node.js: using JavaScript to build high?performance network programs [J]. IEEE Internet Computing, 2010, 14(6): 80?83.

      [4] 趙昆.改變Web開發(fā)格局的新技術node.js[J].程序員,2011(7):124?125.

      [5] CANTELON Mike, HOLOWAYCHUK T J. Node.js in action [M]. America: Manning Publications, 2013.

      [6] RAUCH Guillermo. Smashing Node.js [M]. America: Wiley, 2012.

      [7] LOUKIDES Mike. New directions in web architecture [EB/OL]. [2010?11?16]. http://radar.oreilly.com/2010/11/new?directions?in?web?architec.html.

      [8] VOID B Y. Node.js開發(fā)指南[M].北京:人民郵電出版社, 2012.

      平泉县| 岚皋县| 五河县| 鹤山市| 合水县| 佳木斯市| 琼海市| 兰坪| 灵丘县| 登封市| 清镇市| 温泉县| 巍山| 方山县| 柳河县| 巴彦县| 穆棱市| 黑龙江省| 苏尼特右旗| 肥城市| 嘉黎县| 托克逊县| 武胜县| 旺苍县| 平远县| 明溪县| 宿州市| 肥东县| 定远县| 景宁| 资中县| 类乌齐县| 黎城县| 铜梁县| 枣庄市| 鄂温| 保康县| 静乐县| 即墨市| 万山特区| 南澳县|