精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為什么我要用 Node.js? 案例逐一介紹

開發(fā) 前端
正如維基百科所說:“Node.js 是谷歌 V8 引擎、libuv平臺(tái)抽象層 以及主體使用 Javscript 編寫的核心庫三者集合的一個(gè)包裝外殼?!?除此之外,值得注意的是,Node.js 的作者瑞恩·達(dá)爾 (Ryan Dahl) 的目標(biāo)是創(chuàng)建具有實(shí)時(shí)推送能力的網(wǎng)站。在 Node.js 中,他給了開發(fā)者一個(gè)使用事件驅(qū)動(dòng)來實(shí)現(xiàn)異步開發(fā)的優(yōu)秀解決方案。

介紹

JavaScript 高漲的人氣帶來了很多變化,以至于如今使用其進(jìn)行網(wǎng)絡(luò)開發(fā)的形式也變得截然不同了。就如同在瀏覽器中一樣,現(xiàn)在我們也可以在服務(wù)器上運(yùn)行 JavaScript ,從前端跨越到后端,這樣巨大的反差讓人難以想象,因?yàn)閮H僅在幾年前Javascript 還如同 Flash 或者 Java applet 那樣嵌入網(wǎng)頁在沙箱環(huán)境中運(yùn)行。

在深入Node.js之前,你可能需要閱讀和了解使用跨棧式JavaScript(JavaScript across the stack)帶來的好處,它統(tǒng)一了編程語言和數(shù)據(jù)格式(JSON),讓你能***地重用開發(fā)人員資源。由于這更多的是關(guān)于 JavaScript 的特點(diǎn),這里就不過多討論它。但它確實(shí)是一個(gè)讓人在開發(fā)環(huán)節(jié)中使用 Node 的關(guān)鍵的優(yōu)點(diǎn)。

正如維基百科所說:“Node.js 是谷歌 V8 引擎、libuv平臺(tái)抽象層 以及主體使用 Javscript 編寫的核心庫三者集合的一個(gè)包裝外殼。” 除此之外,值得注意的是,Node.js 的作者瑞恩·達(dá)爾 (Ryan Dahl) 的目標(biāo)是創(chuàng)建具有實(shí)時(shí)推送能力的網(wǎng)站。在 Node.js 中,他給了開發(fā)者一個(gè)使用事件驅(qū)動(dòng)來實(shí)現(xiàn)異步開發(fā)的優(yōu)秀解決方案。(注:V8是谷歌開發(fā)的,目前公認(rèn)最快的 Javascript 解析引擎,libuv 是一個(gè)開源的、為 Node 定制而生的跨平臺(tái)的異步 IO 庫。)

簡(jiǎn)而言之:Node.js 在實(shí)時(shí)的 Web應(yīng)用上采用了基于 WebSocket 的推送技術(shù)。這意味著什么樣的革命性?Well,在經(jīng)過了20多年的基于無狀態(tài)的請(qǐng)求-返機(jī)制的無狀態(tài)交互之后,我們終于有了實(shí)時(shí)的,雙向連接的web應(yīng) 用,客戶端和服務(wù)器端都可以發(fā)起通信,能夠自由地交換數(shù)據(jù)。與此形成鮮明對(duì)比的是傳統(tǒng)的 web響應(yīng)模式,客戶端總是主動(dòng)發(fā)起通信而服務(wù)端被動(dòng)返回。此外,這些都是基于運(yùn)行在標(biāo)準(zhǔn)80端口上的開放Web組件(HTML、CSS和JS)。

可能有人會(huì)說,我們已經(jīng)使用 Flash 和 Java Applet 的形式很多年了——但實(shí)際上,這些方式只是使用網(wǎng)絡(luò)將數(shù)據(jù)傳遞到客戶端上的沙箱環(huán)境。他們都是隔離運(yùn)行的,而且經(jīng)常操作到需要額外的權(quán)限之類的非標(biāo)準(zhǔn)端口。

憑借其獨(dú)特的優(yōu)勢(shì),Node.js的現(xiàn)在已經(jīng)在許多著名公司的產(chǎn)品中起到了關(guān)鍵作用。

在這篇文章中,我們不僅將討論這些優(yōu)勢(shì)是如何實(shí)現(xiàn)的,而且也會(huì)討論為什么你使用 Node.js 來替代一些經(jīng)典的Web應(yīng)用程序模型。

Node.js 是如何工作的?

Node.js 的主要思路是:使用非阻塞的,事件驅(qū)動(dòng)的 I/O 操作來保持在處理跨平臺(tái) (across distributed devices) 數(shù)據(jù)密集型實(shí)時(shí)應(yīng)用時(shí)的輕巧高效。這聽起來有點(diǎn)繞口。

它的真正含義是,Node.js 不是一個(gè)即將主導(dǎo)Web開發(fā)的世界的銀彈級(jí)的平臺(tái)。相反,它是一個(gè)滿足特別需求的平臺(tái)。你肯定不會(huì)希望使用 Node.js 去做 CPU密集型操作。事實(shí)上,使用它進(jìn)行繁重的計(jì)算等于摒棄 Node 幾乎所有的優(yōu)點(diǎn)。Node 真正的亮點(diǎn)在于建設(shè)高性能,高擴(kuò)展性的互聯(lián)網(wǎng)應(yīng)用——因?yàn)樗軌蛱幚睚嫶蟮牟⑶腋咄掏铝康牟l(fā)連接。

它的工作原理是相當(dāng)有趣的。傳統(tǒng)的網(wǎng)絡(luò)服務(wù)技術(shù),是每個(gè)新增一個(gè)連接(請(qǐng)求)便生成一個(gè)新的線程,這個(gè)新的線程會(huì)占用系統(tǒng)內(nèi)存,最終會(huì)占掉所有的可 用內(nèi)存。而 Node.js 僅僅只運(yùn)行在一個(gè)單線程中,使用非阻塞的異步 I/O 調(diào)用,所有連接都由該線程處理,在 libuv 的加分下,可以允許其支持?jǐn)?shù)萬并發(fā)連接(全部掛在該線程的事件循環(huán)中)。

toptal-blog-1_B

做一個(gè)簡(jiǎn)單的計(jì)算: 假設(shè)是普通的Web程序,新接入一個(gè)連接會(huì)占用 2M 的內(nèi)存,在有 8GB RAM的系統(tǒng)上運(yùn)行時(shí), 算上線程之間上下文切換的成本,并發(fā)連接的***理論值則為 4000 個(gè)。這是在傳統(tǒng) Web服務(wù)端技術(shù)下的處理情況。而 Node.js 則達(dá)到了約 1M 一個(gè)并發(fā)連接的拓展級(jí)別 (相關(guān)證明).

當(dāng)然,在所有客戶端的請(qǐng)求共享單一線程時(shí)也會(huì)有問題, 這也是一個(gè)編寫 Node.js 應(yīng)用的潛在缺陷. 首先, 大量的計(jì)算可能會(huì)使得 Node 的單線程暫時(shí)失去反應(yīng), 并導(dǎo)致所有的其他客戶端的請(qǐng)求一直阻塞, 直到計(jì)算結(jié)束才恢復(fù)正常。 其次,開發(fā)人員需要非常小心,不要讓一個(gè) Exception 阻塞核心的事件循環(huán),因?yàn)檫@將導(dǎo)致 Node.js 實(shí)例的終止(實(shí)際上就是程序崩潰)。( 筆者注:如 PHP 中某個(gè)頁面掛掉是不會(huì)影響網(wǎng)站運(yùn)行的,但是 Nodejs 是一個(gè)線程一個(gè)線程來處理所有的鏈接,所以不論是計(jì)算卡了或者是被異常阻塞了都可能會(huì)影響到其他所有的鏈接。解決方案在稍后討論。)

用來避免異常拋出時(shí)中斷進(jìn)程的方法是將異常使用回調(diào)傳遞出去(而不是拋出他們,就像在其他環(huán)境中一樣)。即使一些未處理的異常阻塞了程序,依舊有多 種應(yīng)對(duì)的解決方案,而且也有很多可用于監(jiān)視 Node 進(jìn)程來執(zhí)行必要的崩潰后恢復(fù)工作的策略和工具(雖然你將無法恢復(fù)用戶的 Session ),最常見的是使用 Forever 模塊,或者采用其他的外部系統(tǒng)工具如 upstart and monit。

NPM: The Node Package Manager

當(dāng)我們討論 Node.js 的時(shí)候,一個(gè)絕對(duì)不應(yīng)該忽略地方就是默認(rèn)內(nèi)置的模塊管理工具 —— NPM。 其靈感來源與 Ruby Gems(具有版本和依賴管理功能,可以通過在線資料庫便捷安裝可重用的組件的管理工具)。

一個(gè)完整的公用模塊列表可以在 NPM 的網(wǎng)站上找到(https:://npmjs.org/),或者通過使用與 Node.js 一同安裝的 NPM CLI 工具放問到。該模塊的生態(tài)系統(tǒng)向所有人開放,任何人都可以發(fā)布自己的模塊,所有的模塊都可以在 NPM 資料庫中找到。你可以在 http://howtonode.org/introduction-to-npm 頁面找到 NPM 的一個(gè)簡(jiǎn)要介紹(有點(diǎn)舊,但依舊能看)。

目前非常流行的一些 NPM 模塊有:

  • express – Express.js,是一個(gè)簡(jiǎn)潔而靈活的 node.js Web應(yīng)用框架, 并且已經(jīng)是現(xiàn)在大多數(shù) Node.js 應(yīng)用的標(biāo)準(zhǔn)框架,你已經(jīng)可以在很多 Node.js 的書籍中看到它了。
  • connect – Connect 是一個(gè) Node.js 的 HTTP 服務(wù)拓展框架,提供一個(gè)高性能的“插件”集合,以中間件聞名,是 Express 的基礎(chǔ)部分之一。
  • socket.iosockjs – 目前服務(wù)端***的兩個(gè) websocket 組件。
  • Jade – 流行的模板引擎之一,并且是 Express.js 的默認(rèn)模板引擎。其靈感來源于 HAML。
  • mongomongojs – 封裝了 MongoDB 的的各種 API,不過筆者平常工作用的是 mongoose 也很推薦。
  • redis – Redis 的客戶端函數(shù)庫.
  • coffee-script – CoffeeScript 編譯器,允許開發(fā)者使用 Coffee 來編寫他們的 Node.js 程序。
  • underscore (lodash, lazy) – ***的 JavaScript 工具庫 , 用于 Node.js 的封裝包,以及兩個(gè)采取略有不同的實(shí)現(xiàn)方法來獲得更好性能的同行。
  • forever – 可能是用來確保 node 腳本持續(xù)運(yùn)行的***的工具。

還有很多好的模塊,這里就不一一列舉了(希望沒有冒犯到?jīng)]列舉的)。

Node.js 應(yīng)該用在什么地方

聊天

聊天是最典型的多用戶實(shí)時(shí)交互的應(yīng)用。從IRC開始,有許多開源或者不開源的協(xié)議都運(yùn)行在非標(biāo)準(zhǔn)端口上,而現(xiàn)在,使用 Node.js 則可以解決這些問題——在標(biāo)準(zhǔn)的80端口運(yùn)行 WebSockets。

聊天應(yīng)用程序是最能體現(xiàn) Node.js 優(yōu)點(diǎn)的例子:輕量級(jí)、高流量并且能良好的應(yīng)對(duì)跨平臺(tái)設(shè)備上運(yùn)行密集型數(shù)據(jù)(雖然計(jì)算能力低)。同時(shí),聊天也是一個(gè)非常值得學(xué)習(xí)的用例,因?yàn)樗芎?jiǎn)單,并且涵蓋了目前為止一個(gè)典型的 Node.js 會(huì)用到的大部分解決方案。

讓我們?cè)囍鴣砻枥L它如何工作。

在最簡(jiǎn)單的情況下,我們布置了一個(gè)聊天室在我們的網(wǎng)站上,用戶可以在上面發(fā)消息,當(dāng)然是一對(duì)多的形式。例如,假設(shè)總共有三個(gè)人連接到我們的網(wǎng)站上。

在服務(wù)端這邊, 我們有一個(gè)使用 Express.js 搭建的簡(jiǎn)單站點(diǎn),該站點(diǎn)實(shí)現(xiàn)了兩件事 1) 處理路徑為 ‘/’ 的GET請(qǐng)求時(shí),下發(fā)包括一個(gè)留言板以及一個(gè)發(fā)送信息的 ‘發(fā)送’ 按鈕的頁面 2) 一個(gè)監(jiān)聽客戶端發(fā)送新消息的 websockets 服務(wù)。

在客戶端這邊,我們有一個(gè) HTML 頁面,上面有個(gè)兩個(gè) js 方法,一個(gè)是用于觸發(fā)事件的 “發(fā)送” 按鈕,這會(huì)把把輸入的消息通過 webscoket 發(fā)送,另一個(gè)方法是用 webscoket 在客戶端上監(jiān)聽服務(wù)端來的推送(例如,其他用戶發(fā)送的消息)。

當(dāng)有一個(gè)客戶端發(fā)送消息的時(shí)候,發(fā)生的事情是:

  1. 瀏覽器上,點(diǎn)擊發(fā)送按鈕觸發(fā)了 js 函數(shù),將輸入框中的文字通過 websocket 消息發(fā)送到服務(wù)器的 websocket 客戶端(頁面初始化加載的時(shí)候連接的)。
  2. 服務(wù)端的 websocket 組件收到 消息,然后通過廣播方法轉(zhuǎn)發(fā)到其他所有連接的客戶端。
  3. 通過頁面上運(yùn)行的 websocket 客戶端組件,所有的客戶端都能收到這條推送的新消息。接著 js 處理函數(shù)可以把這個(gè)消息添加到文字框內(nèi)。

toptal-blog-2_B

這是一個(gè)最簡(jiǎn)單的例子。如果要更好的解決方案,你可以使用 Redis 數(shù)據(jù)庫做一個(gè)簡(jiǎn)單的緩存。在一個(gè)更高級(jí)的解決方案中,你可能需要一個(gè)消息路由來專門處理消息隊(duì)列,并且需要一個(gè)更強(qiáng)健的發(fā)送機(jī)制,比如發(fā)送的時(shí)候覆蓋上暫 時(shí)離線的用戶或者為離線的注冊(cè)用戶存儲(chǔ)尚未接收的消息等等。但是不論你做了怎么樣的改進(jìn),Node.js 都將遵循一個(gè)基本原則:響應(yīng)事件,處理多個(gè)并發(fā)連接,并保持流動(dòng)性的用戶體驗(yàn)。

對(duì)象數(shù)據(jù)庫接口(API ON TOP OF AN OBJECT DB)

盡管,Node.js 確實(shí)非常擅長(zhǎng)實(shí)時(shí)交互的應(yīng)用,同時(shí)它也十分適合通過對(duì)象數(shù)據(jù)庫(object DB)來查詢數(shù)據(jù)(如 MongoDB)。以 JSON 格式存儲(chǔ)的數(shù)據(jù)允許 Node.js 直接處理,不需要糾結(jié)數(shù)據(jù)轉(zhuǎn)換和匹配的問題。

舉個(gè)例子,如果你正在使用 Rails,你會(huì)將 JSON 數(shù)據(jù)轉(zhuǎn)成 二進(jìn)制的 model,當(dāng)數(shù)據(jù)再被 Backbone.js, Angular.js 或者 jQuery AJAX 之類的調(diào)用又要轉(zhuǎn)回 JSON。如果是 Nodejs 的話,你可以通過一個(gè) REST API 簡(jiǎn)單的導(dǎo)出 JSON 對(duì)象以供客戶端使用。另外,從數(shù)據(jù)庫讀寫時(shí)候如果使用的是 MongoDB 的話,你也不用擔(dān)心的 JSON 與任何數(shù)據(jù)之間的格式問題。總之,你可以避免多元的數(shù)據(jù)轉(zhuǎn)換問題,不論是在客戶端、服務(wù)端還是數(shù)據(jù)庫。

隊(duì)列輸入

如果你正在接收一個(gè)高量并發(fā)的數(shù)據(jù),你的數(shù)據(jù)庫可能會(huì)成為你處理的瓶頸。正如上面的描述,Node.js 可以輕松的處理并發(fā)連接。 但是,由于數(shù)據(jù)庫操作是一個(gè)阻塞的操作(在這種情況下),這就是麻煩的地方。Node.js的解決方案是,在數(shù)據(jù)真正的寫入之前就承認(rèn)客戶端的數(shù)據(jù)是真實(shí) 的。

用這種方法,在高負(fù)載的時(shí)候系統(tǒng)繼續(xù)維持它的響應(yīng),這在當(dāng)客戶端不需要嚴(yán)格確認(rèn)一個(gè)數(shù)據(jù)是否成功的被寫入時(shí)特別有用。典型的例子包括:日志記錄或者用戶跟蹤數(shù)據(jù)(user-tracking data)的記錄,這會(huì)被分批處理并且在稍后才使用;同時(shí)也包括最終一致性(so, 常用于 NoSQL)可以接受,不需要立即反應(yīng)的操作(例如 Facebook 上更新點(diǎn)贊的數(shù)目)。

數(shù)據(jù)通過某些緩存或者消息隊(duì)列的基礎(chǔ)組件(例如 RabbitMQ, ZeroMQ)進(jìn)入隊(duì)列,并且通過一個(gè)獨(dú)立的數(shù)據(jù)庫批量寫入進(jìn)程來一一消化,或者通過一個(gè)更高性能的計(jì)算密集型后端服務(wù)來進(jìn)行處理。其他的語言/框架也可 以實(shí)現(xiàn)相似的操作,但在相同的配置下是達(dá)不到 nodejs 的高吞吐量與高并發(fā)。

toptal-blog-3_B

簡(jiǎn)單的說:使用 Node,你可以把數(shù)據(jù)庫操作扔到一邊并在稍后處理它們,假設(shè)他們成功了一樣繼續(xù)執(zhí)行下去。(筆者注:在開發(fā)中通常的情況通常是,種耗時(shí)的操作通過回調(diào)函數(shù)來異步處理,主線程繼續(xù)往下執(zhí)行)

數(shù)據(jù)流

在較為傳統(tǒng)的網(wǎng)絡(luò)平臺(tái)上,HTTP 的請(qǐng)求和響應(yīng)更像是孤立的事件;然而事實(shí)上,他們都是數(shù)據(jù)流。這一觀察結(jié)果在 Nodejs 上可以用來建立一些很酷的功能。因?yàn)閿?shù)據(jù)通以流的形式接收,而我們可以在網(wǎng)站上在線處理正在上傳中的文件。這樣的話,就可以實(shí)現(xiàn)實(shí)時(shí)的音頻和視頻編碼,以及在不同數(shù)據(jù)源之間進(jìn)行代碼(代理見下一段)。

(筆者注:Node 有代替如 apache 這樣的 webserver 處理數(shù)據(jù),所以開發(fā)者可以直接收到客戶端一份一份上傳的數(shù)據(jù),并實(shí)時(shí)處理。上面這段話聽起來有點(diǎn)抽象,不過各位可以簡(jiǎn)單的想象一下不需要開 YY 或者 QQ,打開網(wǎng)頁就能進(jìn)行語音視頻的功能。)

代理

Node.js 可以通過異步的方式處理大量的并發(fā)連接,所以很容易作為服務(wù)端的代理來使用。這在與不同響應(yīng)時(shí)間的不同服務(wù)之間進(jìn)行代理,或者是收集來自多個(gè)來源的數(shù)據(jù)時(shí)尤其有用。

舉個(gè)例子:考慮一個(gè)服務(wù)器端的應(yīng)用程序和第三方資源進(jìn)行通信以更新自不同來源的數(shù)據(jù),或者將服務(wù)端上的一些圖像和視頻資源存儲(chǔ)到第三方云服務(wù)。

雖然專用代理服務(wù)器確實(shí)存在,但是如果你還沒有專用的代理服務(wù)器,或者你需要一個(gè)本地開發(fā)的解決方案,那么使用 Node 來做代理可能是更好的選擇。關(guān)于這個(gè)解決方案,我的意思是指當(dāng)你在開發(fā)的時(shí)候,你可以使用Node.js的開發(fā)環(huán)境搭建一個(gè)服務(wù)來處理對(duì)資源和代理的請(qǐng) 求,而在生產(chǎn)環(huán)境下,你可以使用專用的代理服務(wù)(比如nginx,HAProxy等)來處理這些交互。

股票操盤手的儀表盤

讓我們繼續(xù)討論應(yīng)用程序這塊。實(shí)時(shí)網(wǎng)絡(luò)的解決方案可以很輕松的實(shí)現(xiàn)證券交易軟件——用于跟蹤股票的價(jià)格,執(zhí)行計(jì)算、做技術(shù)分析,同時(shí)生成報(bào)表。

使用一個(gè)實(shí)時(shí)的的基于網(wǎng)頁的解決方案,將會(huì)允許操盤手輕松的切換工作軟件以及工作地點(diǎn)。相信不久,我們或許會(huì)在 佛羅里達(dá)州、伊維薩島又或者是巴厘島的海灘上看到他們。

應(yīng)用監(jiān)聽儀盤表

另一種常見的用例中,使用 Node+Web+Socket 非常適合:跟蹤網(wǎng)站訪問者并且可視化實(shí)時(shí)它們之間的實(shí)時(shí)交互。 (如果你有興趣,可以去看看Hummingbird)

你可能需要采集用戶的實(shí)時(shí)狀態(tài), 或者甚至當(dāng)他們到達(dá)渠道中某個(gè)特定的點(diǎn)時(shí), 打開一個(gè)交流頻道, 通過有針對(duì)性的互動(dòng)介紹移動(dòng)到下一個(gè)階段. (如果你感興趣的話,推薦你看看 CANDDi)

想象一下,如果你知道你的訪客的實(shí)時(shí)操作,并能夠形象化地看到他們的交互,這將對(duì)你的業(yè)務(wù)帶來多大的提升。隨著實(shí)時(shí)的、雙向 socket 通信的 Node.js ,現(xiàn)在你可以做到了。

系統(tǒng)監(jiān)控儀表

現(xiàn)在,讓我們看看事情的基礎(chǔ)設(shè)施方面。想象一下,比如,希望為其用戶提供服務(wù)監(jiān)控頁面(例如,GitHub上的狀態(tài)頁)的 SaaS 運(yùn)營(yíng)商 。通過 Node.js 的事件循環(huán),我們可以創(chuàng)建一個(gè)基于 Web 的功能強(qiáng)大的儀表板,以異步方式檢查服務(wù)狀態(tài)并且使用的 WebSockets 將數(shù)據(jù)推送到客戶端。

內(nèi)部(公司內(nèi)部)和公共服務(wù)的狀態(tài)都可以使用該項(xiàng)技術(shù)實(shí)現(xiàn)實(shí)時(shí)的上報(bào)。讓我們把這一想法延伸的遠(yuǎn)一點(diǎn),試著想象一個(gè)電信運(yùn)營(yíng)商中網(wǎng)絡(luò)運(yùn)營(yíng)中心(NOC)的監(jiān)控應(yīng)用,云/網(wǎng)絡(luò)/服務(wù)器運(yùn)營(yíng)商,或者一些金融機(jī)構(gòu),全都運(yùn)行在這個(gè)由 Node.js 和 WebSocket 組成的應(yīng)用上,而不是 Java 和/或 Java Applet。

注意:不要嘗試使用 Node 打造硬實(shí)時(shí)系統(tǒng)(即,響應(yīng)時(shí)間要求一致的系統(tǒng))。 Erlang是可能是該類應(yīng)用程序的更好的選擇。

什么地方可以使用 Node.js

服務(wù)端 WEB 應(yīng)用

通過 Node.js 使用 Express.js 也可以用來創(chuàng)建服務(wù)端上的典型的網(wǎng)頁應(yīng)用。然而,雖然有可能,使用 Node.js 來進(jìn)行請(qǐng)求+響應(yīng)的形式來呈現(xiàn) HTML 并不是最典型的用例。有人贊成也有人反對(duì)這一做法。這里有一些看法以供參考:

優(yōu)點(diǎn):

  • 如果你不需要進(jìn)行 CPU密集型計(jì)算,你可以從頭到尾甚至是數(shù)據(jù)庫(比如 MongoDB)都使用 Javascript 來開發(fā)。這顯著地減輕了開發(fā)工序(包括成本)。
  • 對(duì)于一個(gè)使用 Node.js 作為服務(wù)端的單頁應(yīng)用或者 websocket 應(yīng)用,爬蟲可以收到一個(gè)完全 HTML 呈現(xiàn)的響應(yīng),這是更為SEO友好的。

缺點(diǎn):

  • 任何CPU密集型的計(jì)算都將阻礙 Node.js 的反應(yīng),所以使用多線程的平臺(tái)是一個(gè)更好的方法?;蛘?,您也可以嘗試向外擴(kuò)展的計(jì)算[*]。
  • Node.js 使用關(guān)系型數(shù)據(jù)庫依舊十分痛苦(詳細(xì)見下方)。拜托了,如果你想執(zhí)行關(guān)系型數(shù)據(jù)操作,請(qǐng)考慮別的環(huán)境:Rails, Django 甚至 ASP.NET MVC 。。。。

【*】另一種解決方案是,為這些CPU密集型的計(jì)算建立一個(gè)高度可擴(kuò)展的MQ支持的環(huán)境與后端處理,以保持 Node 作為一個(gè)前臺(tái)專員來異步處理客戶端請(qǐng)求。

Node.js 不應(yīng)該在什么地方使用

使用關(guān)系型數(shù)據(jù)庫的服務(wù)端 WEB 應(yīng)用

對(duì)比 Node.js 上的 Express.js 和 Ruby on Rails,當(dāng)你使用關(guān)系型數(shù)據(jù)庫的時(shí)候請(qǐng)毫不猶豫的選擇后者。

Node.js 的關(guān)系數(shù)據(jù)庫工具仍處于早期階段,目前還沒有成熟到讓人能夠愉快地使用它。而與此同時(shí),Rails天生自帶了數(shù)據(jù)訪問組件,連同DB schema遷移的支持工具和一些Gems(一語雙關(guān),一指這些如同珍寶的工具,二指ruby的gems程序包)。Rails和它的搭檔框架們擁有非常成 熟且被證明了的活動(dòng)記錄(Active Record)或數(shù)據(jù)映射(Data Mapper)的數(shù)據(jù)訪問層的實(shí)現(xiàn),而這些是當(dāng)你在使用純JavaScript來復(fù)制這些應(yīng)用的時(shí)候會(huì)非常想要使用的東西。

不過,如果你真的傾向于全部使用 JS(并且做好可能抓狂的準(zhǔn)備),那么請(qǐng)繼續(xù)關(guān)注 Sequelize 和 Node ORM2 ,雖然這兩者仍然不成熟的,但他們最終會(huì)迎頭趕上。

[*] 使用 Node 光是作為前端而 Rails 做后端來連接關(guān)系型數(shù)據(jù)庫,這是完全有可能也并不少見的。(筆者注:國(guó)外有種說法,PHP這一類程序員也可以算作是前端)

繁重的服務(wù)端的計(jì)算和處理

當(dāng)涉及到大量的計(jì)算,Node.js 就不是***的解決方案。你肯定不希望使用 Node.js 建立一個(gè)斐波那契數(shù)的計(jì)算服務(wù)。一般情況下,任何 CPU密集型操作 會(huì)削弱掉 Node通過事件驅(qū)動(dòng), 異步 I/O 模型等等帶來的在吞吐量上的優(yōu)勢(shì),因?yàn)楫?dāng)線程被非異步的高計(jì)算量占用時(shí)任何傳入的請(qǐng)求將被阻塞。

正如前面所說,Node.js 是單線程的,只使用一個(gè)單一的CPU核心。至于,涉及到服務(wù)器上多核并發(fā)處理,Node 的核心團(tuán)隊(duì)已經(jīng)使用 cluster 模塊的形式在這一方面做了一些工作 (參考:http://nodejs.org/api/cluster.html)。當(dāng)然,您也可以很容易的通過 nginx 的反向代理運(yùn)行多個(gè) Node.js 的服務(wù)器實(shí)例來避免單一線程阻塞的問題。

關(guān)于集群(clustering) ,你應(yīng)該將所有繁重的計(jì)算轉(zhuǎn)移到更合適的語言寫的后臺(tái)進(jìn)程來處理,同時(shí)讓他們通過像 RabbitMQ 那樣通過消息隊(duì)列服務(wù)器來進(jìn)行通信。

即使你的后臺(tái)處理可能最初運(yùn)行在同一臺(tái)服務(wù)器上時(shí)看不出什么優(yōu)點(diǎn),但是這樣的做法具有非常高的可擴(kuò)展性的潛力。這些后臺(tái)處理服務(wù)可以容易地分割出去,作為單獨(dú)的 worker 服務(wù)器,而不需要配置入口 web服務(wù)器的負(fù)載。

當(dāng)然,你也可以在其他語言平臺(tái)上用同樣的方法,但使用 Node.js 你可以得到很高的吞吐量,每個(gè)請(qǐng)求都作為一個(gè)小任務(wù)非常迅速和高效地處理,這一點(diǎn)我們已經(jīng)討論過了。

結(jié)論

我們已經(jīng)從理論到實(shí)踐討論過 Node.js 了,從它的目標(biāo)和野心,到其優(yōu)點(diǎn)和缺點(diǎn)。在 Node.js 的開發(fā)中99%的問題是由誤用阻塞操作而造成的。

請(qǐng)記住:Node.js 從來不是用于解決大規(guī)模計(jì)算問題而創(chuàng)建的。它的出現(xiàn)是為了解決大規(guī)模I/O 的問題,并且在這一點(diǎn)上做的非常好。

綜上,如果你項(xiàng)目需求中不包含CPU密集型操作,也不需要訪問任何阻塞的資源,那么你就可以利用的 Node.js 的優(yōu)點(diǎn),盡情的享受快速、可擴(kuò)展的網(wǎng)絡(luò)應(yīng)用。

原文鏈接:http://www.toptal.com/nodejs/why-the-hell-would-i-use-node-js

譯文鏈接:http://blog.jobbole.com/53736/

責(zé)任編輯:陳四芳 來源: 伯樂在線
相關(guān)推薦

2016-05-18 10:15:25

PythonNode.js

2012-05-02 15:56:20

PHP

2015-03-10 10:59:18

Node.js開發(fā)指南基礎(chǔ)介紹

2011-09-02 14:47:48

Node

2009-12-28 09:51:17

Fedora GNOM

2023-09-08 14:12:04

2022-12-22 07:44:04

2016-01-12 16:58:31

C游戲

2009-12-14 17:28:18

Visual Stud

2009-11-23 16:26:37

Visual stud

2013-11-01 09:34:56

Node.js技術(shù)

2011-11-10 11:08:34

Node.js

2020-04-20 16:00:05

Node.js框架JavaScript

2019-05-27 15:30:44

Node.jsJavaScript前端

2022-01-04 21:36:33

JS瀏覽器設(shè)計(jì)

2022-05-27 10:19:59

Node.js前端開發(fā)

2021-02-09 20:51:13

D 語言腳本編程語言

2016-05-12 14:54:39

UCloud

2016-05-16 14:00:39

UCloud 直播云

2015-09-16 10:17:42

Node.jsES 6特性
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产在线拍偷自揄拍精品| 亚洲成年人在线| 免费看啪啪网站| www.久久精品.com| 免费在线播放第一区高清av| 中文字幕亚洲一区二区三区五十路| 国模私拍视频在线观看| 波多野结衣精品| 欧美国产一区视频在线观看| 亚洲在线免费观看| 国产精品视频123| 性欧美欧美巨大69| 亚洲欧美日韩视频一区| 日本高清一区二区视频| 亚洲一区资源| 亚洲一区二区影院| 相泽南亚洲一区二区在线播放| 国产毛片久久久久| 老牛国产精品一区的观看方式| 久久亚洲国产精品成人av秋霞| 香蕉视频黄色在线观看| 欧美日本三级| 欧美吻胸吃奶大尺度电影 | 一本大道av一区二区在线播放| 亚洲一区二区三区免费观看| 少妇性bbb搡bbb爽爽爽欧美| 麻豆成人av在线| 欧美在线视频一区| 九九在线观看视频| 99久久精品费精品国产风间由美| 日韩国产欧美精品一区二区三区| 亚洲热在线视频| 欧美三区四区| 在线视频中文字幕一区二区| 成人性免费视频| 牛牛精品视频在线| 亚洲精品国产无天堂网2021| 亚洲精品一区二区毛豆| 欧美美女色图| 91网站在线播放| 国精产品99永久一区一区| 精品黑人一区二区三区在线观看| 久久se精品一区精品二区| 日韩免费中文字幕| 国产又大又粗又爽| 免费在线观看成人av| 亚州成人av在线| 欧美福利视频一区二区| 亚洲美女91| 91精品国产高清自在线看超| 日本一区二区免费在线观看| 亚洲国产精品第一区二区| 欧美俄罗斯性视频| 精品少妇一二三区| 狠狠爱综合网| 久久久伊人日本| 国产亚洲小视频| 雨宫琴音一区二区在线| 98精品国产高清在线xxxx天堂| 国产在线视频二区| 99精品久久久| 国产不卡在线观看| 精品一区二三区| 美女任你摸久久| 成人久久久久爱| 精品久久久无码中文字幕| 国产精选一区二区三区| 成人免费视频网站入口| 内射无码专区久久亚洲| 97精品国产97久久久久久久久久久久| 精品国产91亚洲一区二区三区www 精品国产_亚洲人成在线 | 色8久久人人97超碰香蕉987| 男人透女人免费视频| 免费观看成人性生生活片| 欧美日韩一区三区四区| 黄色三级视频在线播放| 超碰在线亚洲| 亚洲欧美国内爽妇网| 国产又黄又粗又猛又爽的| 天堂美国久久| 欧美激情一级二级| 黄色在线视频网址| 国产制服丝袜一区| 成人欧美一区二区| 欧美亚洲日本| 自拍偷拍欧美精品| 久久99中文字幕| 亚洲伦理影院| 日韩美女视频一区二区在线观看| yy6080午夜| 日韩精品免费| 欧美极度另类性三渗透| 成人免费视频国产免费| 韩国成人在线视频| 久久亚洲综合网| 日本视频不卡| 黄色精品一区二区| 免费在线观看污网站| 欧美性生活一级片| 久久精品视频网站| 五月婷婷中文字幕| 黄色精品一二区| 免费成人看片网址| a天堂中文在线官网在线| 欧美日韩亚洲天堂| www.日本久久| 欧美日韩国产传媒| 97在线观看视频国产| 正在播放木下凛凛xv99| 波多野结衣中文字幕一区| 亚洲精品自在在线观看| 忘忧草在线日韩www影院| 91麻豆精品国产| 国产精品国产三级国产专业不| 欧美福利影院| 国产精品男人爽免费视频1| 欧美一级一区二区三区| 亚洲女女做受ⅹxx高潮| 日韩av在线综合| 红杏一区二区三区| 欧美精品在线免费观看| 姑娘第5集在线观看免费好剧| 成人免费看的视频| 日韩第一页在线观看| 日韩一区二区三区免费| 日韩av在线不卡| 麻豆国产尤物av尤物在线观看| 日韩精品一二三四| 精品一区二区三区视频日产| 日本一级理论片在线大全| 欧美日韩亚州综合| 精品无码在线观看| 蜜桃视频一区| 欧美日韩日本网| 在线成人av观看| 日韩av在线免播放器| 在线看成人av| 成人精品视频.| h无码动漫在线观看| 欧美国产中文高清| 欧美乱妇40p| 亚洲第一视频在线| 亚洲一区二区三区国产| 少妇伦子伦精品无吗| 真实国产乱子伦精品一区二区三区| 国产精品免费看久久久香蕉| av在线首页| 欧美精品一二三| 伊人久久久久久久久久久久久久| 另类专区欧美蜜桃臀第一页| 亚洲一区二区三区精品在线观看| 欧美成人三级| 久久久成人精品视频| av老司机久久| 亚洲精品久久久久久国产精华液| 99精品视频免费版的特色功能| 亚洲成人二区| 成人av男人的天堂| 大菠萝精品导航| 亚洲人成电影网站色www| 波多野结衣一区二区三区四区| 国产欧美综合色| 91丨九色丨蝌蚪| 好吊一区二区三区| 蜜桃免费一区二区三区| 久久久人成影片一区二区三区在哪下载 | 日本免费久久高清视频| 国内在线精品| 欧美年轻男男videosbes| 国产精品视频一区二区三| 国产成人8x视频一区二区| 欧美激情视频免费看| 亚洲另类av| 国产精品旅馆在线| 亚洲妇熟xxxx妇色黄| 亚洲激情中文字幕| 在线观看亚洲黄色| 亚洲精品中文字幕乱码三区| 久久精品aⅴ无码中文字字幕重口| 激情综合中文娱乐网| 蜜桃精品久久久久久久免费影院 | 成人91免费视频| 色吧亚洲日本| 日韩中文字幕不卡视频| 亚洲精品国偷拍自产在线观看蜜桃| 婷婷久久综合九色综合绿巨人| 欧美黄色一级生活片| 国产尤物一区二区在线 | 蜜臀久久久久久久| 男女裸体影院高潮| 亚洲三级性片| 99久re热视频这里只有精品6| 成人av观看| 欧美精品免费在线观看| 男人天堂网在线观看| 日韩一区二区三区视频在线| 天堂中文在线网| 自拍偷拍欧美精品| 一级黄色片大全| 国产成人在线影院| 牛夜精品久久久久久久| 韩国自拍一区| 亚洲视频精品一区| 中文字幕伦av一区二区邻居| 亚洲a区在线视频| 亚洲a∨精品一区二区三区导航| 欧美刺激性大交免费视频| 粉嫩av一区| 日韩精品免费视频| 国内毛片毛片毛片毛片| 欧美午夜一区二区三区| 日本道在线观看| 一区二区成人在线| 蜜桃视频最新网址| 国产午夜精品美女毛片视频| 精品熟女一区二区三区| 国产美女精品一区二区三区| 精品久久久久久中文字幕2017| 亚洲视频碰碰| 91麻豆天美传媒在线| 菠萝蜜一区二区| 欧美连裤袜在线视频| 另类春色校园亚洲| 国产高清一区视频| 欧美h版在线观看| 成人精品福利视频| 男女啪啪999亚洲精品| 国产97在线播放| 成人动漫一区| 欧美在线性视频| а√在线中文在线新版| 久久久久九九九九| 色图在线观看| 欧美激情视频一区二区三区不卡| 日本最黄一级片免费在线| 在线精品高清中文字幕| 国产系列在线观看| 亚洲人成电影网站色…| 国产高清在线看| 亚洲乱码av中文一区二区| 91最新国产视频| 51漫画成人app入口| 欧美日韩国产成人| 免费网站在线观看人| 欧美国产乱视频| 不卡一本毛片| 性日韩欧美在线视频| 僵尸再翻生在线观看| 欧美在线播放视频| 欧美激情喷水| 国产精品盗摄久久久| 久久久加勒比| 成人在线国产精品| 精品视频成人| 国产精品区一区二区三在线播放| 久久精品凹凸全集| 精品亚洲欧美日韩| 欧美日韩国产高清电影| 一区二区三区欧美在线| 911精品美国片911久久久| 国产91在线亚洲| 亚洲经典三级| www.国产区| 经典一区二区三区| 人妻av一区二区三区| www.视频一区| 妺妺窝人体色WWW精品| 国产精品久久久久久妇女6080| 一本一本久久a久久| 亚洲精品久久7777| 国产在线观看黄色| 在线观看视频一区二区欧美日韩| 在线观看色网站| 欧美变态tickle挠乳网站| 日韩精品一二| 久久精品国产电影| av岛国在线| 国产精品久久久久久五月尺| 国产电影一区二区| 韩国一区二区三区美女美女秀 | 电影一区二区三区久久免费观看| 亚洲最大av网| 日韩高清一级| 一本一道久久久a久久久精品91| 欧美成人tv| 日韩a在线播放| 精品一区二区三区在线播放视频| 精品国产免费久久久久久婷婷| 91色乱码一区二区三区| 黄色一级大片在线免费观看| 午夜一区二区三区视频| 中文字幕一区二区三区四区视频 | 亚洲一区二区三区香蕉| 老牛影视av一区二区在线观看| 亚洲精品国产精品国自产观看| 欧美日韩1区2区3区| 成人一区二区三| 国产91精品露脸国语对白| 级毛片内射视频| 亚洲综合久久久久| 在线免费观看av片| 亚洲国产日韩欧美在线动漫| 亚洲1卡2卡3卡4卡乱码精品| 97视频在线观看网址| 91精品国产一区二区在线观看 | 久久精品国产99久久99久久久| 91亚洲男人天堂| 日本妇女毛茸茸| 91国产成人在线| 丝袜+亚洲+另类+欧美+变态| 免费91在线视频| 国产精品99| 欧美日本国产精品| 亚洲日本黄色| 被黑人猛躁10次高潮视频| 国产精品视频你懂的| 久久亚洲精品国产| 日韩精品一区二区三区中文不卡| 91精彩视频在线播放| 欧美一级片免费在线| 国产精品网址| 久久久久99精品成人片| 国产精品综合网| 91精品一区二区三区蜜桃| 欧美影视一区在线| 免费在线高清av| 91国内免费在线视频| aiai久久| 无码人妻少妇伦在线电影| 国产高清在线精品| 亚洲天堂黄色片| 在线不卡免费av| 成人ww免费完整版在线观看| 国产一区视频在线| 欧美一级淫片| 三级a在线观看| 中文字幕欧美日本乱码一线二线| 亚洲 日本 欧美 中文幕| 亚洲免费视频网站| 中文字幕影音在线| 欧美日产一区二区三区在线观看| 老鸭窝91久久精品色噜噜导演| 女同毛片一区二区三区| 欧美日韩色婷婷| 日本私人网站在线观看| 日本伊人精品一区二区三区介绍| 亚洲丁香日韩| 91看片就是不一样| 日本一二三四高清不卡| 一区二区视频网站| www.日韩不卡电影av| 99久久99九九99九九九| 成年人视频大全| 成人免费黄色在线| 天天爽夜夜爽夜夜爽精品| 亚洲跨种族黑人xxx| 99只有精品| 黄色www在线观看| 懂色av中文字幕一区二区三区| 国产在线免费视频| 日韩精品在线免费| 91tv亚洲精品香蕉国产一区| 亚洲日本japanese丝袜| 国产精品77777| 日韩成年人视频| 亚洲性xxxx| 91成人短视频在线观看| 国产色一区二区三区| 337p粉嫩大胆噜噜噜噜噜91av| 99re这里只有精品在线| 日韩有码在线播放| 99这里只有精品视频| 免费在线观看日韩视频| 中文字幕乱码久久午夜不卡| 97人妻精品一区二区三区| 欧美激情精品久久久久久黑人| 外国成人在线视频| 亚洲综合婷婷久久| 亚洲在线视频网站| 国产永久免费高清在线观看视频| 国产精品一区久久| 尤物精品在线| 超碰97av在线| 亚洲成人精品视频| 欧美片第1页| 99中文字幕在线观看| 久久综合成人精品亚洲另类欧美 | 日韩黄在线观看| 四虎影视精品永久在线观看| 91.com在线| 欧美极品少妇xxxxⅹ高跟鞋| 国产成年妇视频| 日本欧美在线视频| 欧美国内亚洲| avhd101老司机| 亚洲激情视频网站| 57pao成人永久免费| 99久久激情视频| 亚洲午夜视频在线| 男人的天堂在线视频免费观看|