精品欧美一区二区三区在线观看 _久久久久国色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.国产一区| 黄色免费视频大全| 国产肥老妇视频| 激情五月综合网| 欧美日韩加勒比精品一区| 91成人免费观看| 蜜桃av.com| 成人看片网页| 91片在线免费观看| 久久久视频精品| 日本中文字幕有码| 福利视频在线| 久久中文字幕av| 一本久道中文字幕精品亚洲嫩| 99在线首页视频| 中文字幕五月天| 91麻豆精品国产综合久久久 | 亚洲另类在线视频| 国产精品91视频| 中文字幕一区二区久久人妻网站| 男男gaygays亚洲| 福利电影一区二区| 欧美成人免费在线视频| www.欧美激情.com| h视频在线免费观看| 91蜜桃网址入口| 91久久大香伊蕉在人线| 国产一级精品毛片| 激情五月综合网| 亚洲第一在线视频| 国产91xxx| 欧洲综合视频| 蜜桃av一区二区在线观看 | 中文字幕第九页| 欧美黑人xx片| 中文字幕亚洲综合久久菠萝蜜| 国产精自产拍久久久久久| 国产一二三四视频| 久久精品xxxxx| 亚洲欧美一区二区三区极速播放 | 欧美午夜免费电影| 水蜜桃一区二区| 中文字幕av片| 亚洲欧美网站在线观看| 精品91自产拍在线观看一区| 毛片在线播放视频| 亚洲精品白浆| 91免费精品国自产拍在线不卡| 亚洲最大福利网站| 国产免费的av| 亚洲影音先锋| 日韩在线播放视频| 欧美精品日韩在线| 日韩精品一级| 欧美午夜片欧美片在线观看| 全黄性性激高免费视频| 免费在线观看污视频| 蜜臀国产一区二区三区在线播放| 日本久久亚洲电影| 午夜国产福利一区二区| 色综合色综合| 亚洲国产精品一区二区三区| 国产又猛又黄的视频| a免费在线观看| 亚洲乱码中文字幕综合| 日韩精品手机在线观看| 清纯唯美亚洲色图| 久久免费看少妇高潮| 国产日韩欧美日韩大片| 黄色小视频在线免费看| 国模精品一区| 中文字幕亚洲图片| www.88av| 精品99re| 欧美系列亚洲系列| 一区二区在线免费看| 伊人久久av| 亚洲天堂免费看| 免费看污污视频| 国产午夜在线观看| 成人av在线一区二区三区| 国产欧美日韩中文字幕| 国产男女裸体做爰爽爽| 成人一区二区在线观看| 成人欧美一区二区三区在线 | 亚洲一级在线| 欧美大片在线看| 亚洲无人区码一码二码三码的含义| 老司机亚洲精品一区二区| 欧美成人aa大片| 亚洲黄色av片| 亚洲精品555| 日韩欧美国产高清91| 午夜两性免费视频| 肉色欧美久久久久久久免费看| 亚洲图片欧美色图| 肉大捧一出免费观看网站在线播放 | 啊啊啊一区二区| 国产在线高清视频| 国产精品―色哟哟| 欧美亚洲国产免费| 香蕉视频免费在线看| 国产91高潮流白浆在线麻豆| 国产精品区一区二区三含羞草| 国产毛片在线视频| 91丨九色丨黑人外教| 亚洲一区二区三区免费看| 搞黄视频免费在线观看| 亚洲精品国产第一综合99久久| 亚洲欧美日韩另类精品一区二区三区 | av资源网一区| 国产伦精品一区二区三毛| 黄色av网站在线免费观看| 久久一区二区三区四区| 女女同性女同一区二区三区按摩| 三妻四妾完整版在线观看电视剧 | 日韩理论片在线| 日韩在线一级片| 国产一区二区三区国产精品| 欧美卡1卡2卡| 午夜免费福利网站| 国产一区二区精品福利地址| 久久久久久网址| 天堂网一区二区三区| 国产日韩一区二区三区在线| 91视频国产精品| 超碰免费在线97| 成人精品小蝌蚪| 激情视频小说图片| 国产精品99| 欧美一区二区免费视频| 亚洲911精品成人18网站| 成人爽a毛片| 日韩精品欧美激情| 欧美三级视频网站| 亚洲欧美久久久| 精品综合久久久| 国产专区在线播放| 精品magnet| 超碰影院在线观看| 伊人国产精品| 色妞一区二区三区| 国产一级片免费看| 福利一区二区在线观看| 8x8ⅹ国产精品一区二区二区| 精品精品导航| 日韩精品一区国产麻豆| 三叶草欧洲码在线| 亚洲区第一页| 国产精品美女在线观看| www.色呦呦| 亚洲精品中文在线影院| 在线观看免费视频污| 久久久精品久久久久久96| 久久人91精品久久久久久不卡| 99精品免费观看| 一区二区三区在线观看国产| 在线观看免费看片| 激情六月综合| 国产原创欧美精品| 黄色一级大片在线免费看产| 欧美一区二区三区四区视频| 欧美成人精品欧美一级| 日韩精品一级中文字幕精品视频免费观看| 91日本视频在线| 羞羞电影在线观看www| 精品91自产拍在线观看一区| 国产性xxxx高清| 久久精品视频免费| 亚洲日本精品| 99tv成人影院| 国内精品久久久久久久久| 桃花色综合影院| 亚洲精品老司机| 美女久久久久久久久| 欧美3p视频| 3d精品h动漫啪啪一区二区| av3级在线| 日韩一本二本av| 男人天堂资源网| 国产精品一区二区三区乱码| 亚洲丰满在线| 视频在线观看免费影院欧美meiju| 久久久久久久激情视频| 黄色片在线看| 日韩欧美亚洲一区二区| 成人午夜视频在线播放| 国产91精品一区二区麻豆亚洲| 免费无码毛片一区二三区| 国产一区二区三区四区大秀| 91久久久亚洲精品| 色偷偷色偷偷色偷偷在线视频| 在线观看欧美日韩国产| 无码一区二区三区| 91在线视频网址| 欧美不卡在线播放| 超碰成人久久| 国产精品人成电影| av电影院在线看| 日韩视频免费中文字幕| 五月婷婷开心中文字幕| 91精品在线观看入口| 天天操天天干天天操天天干| 国产一区二区三区四区五区美女 | 91超薄肉色丝袜交足高跟凉鞋| 欧美一级网站| 成人免费看片'免费看| 国产一区二区三区亚洲综合| 97不卡在线视频| 十九岁完整版在线观看好看云免费| 欧美日韩精品系列| 精品一区二区在线观看视频| av一本久道久久综合久久鬼色| 亚洲一级免费在线观看| 97在线精品| 久久久久一区二区三区| 亚洲深夜视频| 亚洲天堂成人在线视频| 波多野结衣理论片| 国产欧美日韩精品一区| 国产又大又黄又粗又爽| 亚洲精品偷拍| 免费人成自慰网站| 亲子伦视频一区二区三区| 欧美自拍视频在线| 国产高清自拍视频在线观看| 亚洲二区中文字幕| 精品美女www爽爽爽视频| 欧美日韩国产高清一区二区| 69视频免费看| 日韩欧美中文免费| 国产免费观看av| 国产欧美日韩亚州综合| 亚洲av无码成人精品国产| 日韩精品国产精品| 日韩欧美一区三区| 一区二区三区国产盗摄 | 亚洲一区二区福利视频| 日本不卡中文字幕| 中文字幕一区二区中文字幕| 色妞ww精品视频7777| 成人网在线视频| 青青久久精品| 久久久久久国产免费| 18+激情视频在线| 亚洲国产精品久久久久| 性欧美videos另类hd| 欧美电影免费观看完整版| 国产v片在线观看| 日韩三级在线免费观看| www.xxxx国产| 精品久久久久久久人人人人传媒| 亚洲第一色视频| 日本丶国产丶欧美色综合| 看免费黄色录像| 久久色视频免费观看| 成人h动漫精品一区| 91丨porny丨国产入口| 精品无码一区二区三区| 国产精品亚洲成人| 亚洲精品无码久久久久久久| 老司机精品导航| 国产91在线亚洲| 亚洲激情婷婷| www.国产区| 久久99久久99小草精品免视看| heyzo亚洲| 老司机久久99久久精品播放免费| 欧美丰满熟妇xxxxx| 国产一区日韩欧美| 亚洲国产精品一区二区第一页| 日韩在线理论| 日本a在线天堂| 国产精品毛片在线看| 国产熟人av一二三区| 精品一区二区日韩| 黑森林av导航| 久久久噜噜噜久久人人看 | 亚洲 国产 欧美 日韩| 亚洲欧美一区二区三区情侣bbw| 国产一区二区女内射| 一本一道久久a久久精品| 在线观看国产区| 欧美刺激脚交jootjob| 三级在线视频| 久久久av亚洲男天堂| 成年人视频在线观看免费| 日韩激情视频在线播放| 国产51人人成人人人人爽色哟哟| 久久视频精品在线| 国产毛片av在线| 久久偷看各类女兵18女厕嘘嘘| 国产在线天堂www网在线观看| 欧美老少做受xxxx高潮| 黄色网页在线播放| 91av福利视频| 91成人福利社区| 欧美18视频| 自拍亚洲一区| 久久精品欧美| 1024精品久久久久久久久| 777精品久无码人妻蜜桃| 久久精品国产精品亚洲综合| 国产主播中文字幕| 高清不卡一区二区在线| 黄大色黄女片18免费| 午夜av一区二区三区| 日韩av黄色片| 欧美日韩国产专区| 国产成人三级在线播放| 国产亚洲欧美aaaa| 东热在线免费视频| 国外成人免费在线播放| 欧美天堂一区| 日韩国产欧美精品| 日韩一区三区| 青青视频在线播放| 顶级嫩模精品视频在线看| 午夜国产福利视频| 91国偷自产一区二区三区观看 | 久久久成人免费视频| 欧美日韩另类字幕中文| www.成人免费视频| 久久五月天色综合| 97久久精品一区二区三区的观看方式| 日本高清不卡三区| 欧美xxav| 在线黄色免费观看| 国产日韩精品一区二区三区在线| 欧美日韩精品区| 亚洲国产毛片完整版| sm在线观看| 国产欧美亚洲日本| 国产在线观看91一区二区三区| 日韩精品一区二区在线视频 | 亚洲黄色天堂| 在线播放第一页| 一区二区三区精品视频在线| 国产中文字幕免费| 日韩欧美中文字幕制服| 草莓福利社区在线| 亚洲wwwav| 午夜a一级毛片亚洲欧洲| 亚洲欧洲一区二区| 日韩av在线播放中文字幕| 国产精品天天干| 欧美视频一区二区| 1024视频在线| 国内精品伊人久久| 国产精品三p一区二区| 日韩欧美一区二区在线观看| 久久午夜电影| 日韩精品电影一区二区三区| 欧美日韩免费观看一区二区三区 | 国产精品91久久| 日韩黄色大片| 久久久久久久高清| 樱花影视一区二区| 人妻无码中文字幕| 中文字幕免费精品一区高清| 99re久久| 久久久久久久久影视| 成人永久免费视频| 国产91精品一区| 伊人久久五月天| 高清在线一区二区| 91成人综合网| 2023国产精品视频| 中文字幕激情视频| 欧美精品免费看| 牛牛影视久久网| 青青在线免费观看视频| 国产精品久久久久久久浪潮网站| 国产乱人乱偷精品视频| 一区二区三区视频在线| 久久亚洲精品人成综合网| 五月天激情图片| 91在线看国产| 一区二区三区黄| 久久久亚洲影院| av亚洲免费| 久久人妻精品白浆国产| 成人欧美一区二区三区在线播放| 69国产精品视频免费观看| 最近中文字幕2019免费| 成人福利免费在线观看| 热久久精品免费视频| 亚洲精品午夜久久久| 青青草超碰在线| 91成人伦理在线电影| 日韩一区精品视频| 精品99久久久久成人网站免费| 欧美精品一二三区| 成人三级小说| 国产精品av一区| 激情综合自拍| 91麻豆制片厂|