ARTICLE

什麼使Node.js如此迅速?Node.js的五大最佳使用案例

LATEST ARTICLE

什麼使Node.js如此迅速?Node.js的五大最佳使用案例

什麼使Node.js如此迅速?Node.js的五大最佳使用案例

為何Node.js運行如此迅速?

當我們談到Node.js時,大家首先想到的是執行速度。那麼,我們來看看Node.js為什麼比其他技術更快?首先,重要的是要瞭解「執行速度」的實際含義。執行速度可以從計算費波那契數列到查詢資料庫等各種情境中有所差異。

在Web服務的上下文中,執行速度包括處理請求並向客戶端發送回應所需的一切。這是指從建立連接開始到客戶端接收回應結束之間花費的時間。現在,讓我們看幾點能幫助我們瞭解Node.js速度背後秘密。

Node.js是非同步和單線程的。這意味著所有I/O操作不會阻塞任何其他操作。這也意味著您可以同時發送郵件、讀取檔、查詢資料庫等等。

每次對Web伺服器的請求都不會建立一個單獨的Node.js進程。儘管如此,一個Node.js進程將始終運行以監聽連接。JavaScript代碼也在進程的主線程中執行,而所有其他I/O操作則在單獨的線程中執行,從而幾乎沒有延遲。

Node.js中的虛擬機器(V8)負責執行JavaScript並具有即時編譯(JIT)功能。虛擬機器可以將源代碼在運行時編譯成機器碼。這意味著所有「熱門」函數可以被編譯成機器碼,從而提高執行速度。

這些觀點幫助我們一窺Node.js之所以如此快速的原因。現在,讓我們看看是什麼使得Node.js中發生了所有這些事情。
優勢 劣勢
機會
  • 隨著serverless架構的興起,node.js因為其輕量級和高效能特性,變得在此架構中十分受歡迎。
  • 隨著javascript語言及其生態系統的不斷成長和發展,使得node.js有更大的使用場景和開發潛力。
  • 物聯網(iot)產業不斷成長,node.js由於其事件驅動的模型非常適合用於處理來自大量設備的同時連接。
  • node.js具有高效的性能,由於其非阻塞i/o模型,使得它在處理大量並發連接時表現出色。
  • node.js使用javascript作為開發語言,這種廣為人知和廣泛使用的語言降低了開發者學習新技術的門檻。
  • node.js擁有強大的生態系統,社區活躍且不斷成長。npm(node package manager)是全球最大的軟體庫之一,在其中可以找到各種模組和工具來加速和優化你的開發流程。
威脅
  • node.js雖然適合用於i/o密集型任務,但對於cpu密集型任務則可能不是最佳選擇。
  • 錯誤處理在node.js中可能會變得相當困難。由於其異步編程模型,未捕獲的異常可能會引起整個程序崩潰。
  • 由於javascript動態類型特性,使得在大規模專案中容易產生隱藏問題或bug。
  • 其他新興技術如deno、go等可能會對node.js造成挑戰。
  • javascript本身就存在一些固有問題(如全局變數污染、類型轉換不明確等),這可能會影響到node.js的穩定性和可靠性。
  • 由於大多數核心功能都依賴第三方模組,這可能會帶來安全風險。因此需要開發者對所使用模組或工具保持警覺並經常更新以防止漏洞攻擊。
表: 強弱危機分析(最後更新: 2022-07-26)

理解異步處理

讓我們透過一個例子來理解非同步處理的概念。假設你站在一座山頂上,手上有100顆球。你的任務是把所有球推到山腳下,並以最短的時間完成。

很明顯地,你無法一次推動所有球,所以你必須逐顆地推。現在,在這裡,你可以選擇兩種方式。第一種方式是推動一顆球並等待它到達山腳下後再推下一顆。

然而,這種方式會花費很長時間才能將所有球都推到山腳下。第二種方式是可以不用等待球到達山腳下就可以連續推動每一顆球。使用這種方式,你可以在最短的時間內將全部100顆球都推到底部。

在這個例子中,第一種方式是同步執行,而第二種方式則是非同步執行。以上述例子清楚地說明瞭非同步執行比同步執行更快速。 現在您已經理解了非同步的基本概念,接下來我們來看看它如何幫助提升網頁伺服器的效能。

假設每一顆球都等同於一個對資料庫的查詢。如果您以同步方式處理大型專案中的多個聚合、查詢等資料,則會阻塞程式碼執行。然而,如果您以非同步方式處理,那麼您可以一次執行所有查詢,然後在之後收集結果。

Node.js用於後端與Angular、React、React Native和Vue.js搭配使用,它能提供極快的處理和渲染速度。讓我們從下面的圖片中看看它有多快吧。 [插入圖片]

事件循環

事件循環是一種機制,負責在程式中分派事件,並與訊息發起者一起非同步運作。Node.js會將回調函式儲存起來,當進行輸入/輸出操作時指派給該操作,以便繼續處理其他事件。只有在收集到所有所需的資料後,才會觸發回調函式。

下麵的圖解釋了Node.js事件循環的工作機制。所有由網頁伺服器接收到的請求都會進入事件循環,在其中將操作註冊到執行緒池中並指派回調函式。當處理完請求後,就會觸發回調函式。

回調函式還可以執行其他各種密集型操作,例如查詢資料庫。

V8在優化你的代碼中所起的作用

V8由兩種編譯器組成,它們是:完整編譯器和曲軸編譯器。完整編譯器以運行速度快且生成通用代碼而聞名。它還將JavaScript函數的抽象語法樹(AST)轉換為通用本地代碼。

在此階段,它僅應用單一優化-內聯高速快取。當代碼運行並且函數被編譯時,V8啟動分析器執行緒來檢測哪些函數是“熱”的,哪些不是。此外,它還收集類型反饋資訊,以幫助V8記錄流過程中的類型資訊。

一旦V8識別出一個“熱”函數並收集到一些類型反饋資訊,然後試圖通過最佳化編譯器(也稱為“曲軸”編譯器)運行增強AST。 曲軸編譯器不夠快;然而,它試圖生成優化的代碼。它由兩個組件組成:氫和鋰。

氫編譯器的作用是從AST中構建控制流圖(CFG)。所得到的圖以靜態單賦值(SSA)形式呈現。通過SSA形式和高級中間表示的簡單結構,該編譯器還可以應用多種優化,例如方法內聯、常數折疊等。

鋰編譯器的主要目標是將優化後的HIR轉換為LIR。LIR與機器代碼非常相似,只是它們與平臺無關。只有在這之後,才會將舊的未優化代碼替換成優化後的代碼。

這有助於保持更快的代碼執行速度。

最佳的Node.js使用案例五選

除了速度快之外,Node.js 還具有許多功能,開發人員可以在各種使用情境中加以利用。讓我們來看看一些 Node.js 的最佳應用情況。 1. 建立即時應用程式:由於 Node.js 具有非同步事件驅動的特性,它非常適合建立即時通訊和聊天應用程式。

這是因為它能夠處理大量的同時連接並保持低延遲。 2. 微服務架構:Node.js 在微服務架構中表現出色。它的輕量級和可伸縮性使得建立和管理多個微服務變得更加容易。

3. RESTful API 開發:Node.js 提供了豐富而強大的工具和框架,使得開發 RESTful API 變得更加簡單。這使得與其他系統或平臺進行數據交換變得更加容易。 4. 實時分析和監控:Node.js 可以處理大量且高頻率的數據流。

這使其成為實時分析和監控系統的理想選擇。 5. 前端開發工具:Node.js 在前端開發中也有很大的用武之地。它提供了許多工具和框架,如Webpack、Gulp 和Babel,可以幫助開發人員更高效地編譯、壓縮和管理前端資源。

這些只是 Node.js 的一些最佳應用情況示例,但實際上它在各種不同領域都有廣泛的應用。無論是建立 Web 應用程式還是處理實時數據流,Node.js 都能夠提供可靠且高效的解決方案。

即時應用程式

如果有人問哪個是Node.js的最佳使用案例?那麼即時應用就是答案。這是Node.js表現出色的一個使用案例。讓我們來看看為什麼要使用Node.js來開發即時應用:Node.js可以重用和共用用於存儲庫代碼的Node.js包,從而實現伺服器和用戶端之間的快速資料同步。

它可以輕鬆處理多個用戶端請求。簡而言之,如果你考慮到即時資料處理和可擴展性這兩個因素,那麼Node.js是你專案中最好的技術選擇。不僅如此,在即時應用程式開發中使用Node.js還有許多其他優勢。

所以,如果有人問你為什麼選擇Node.js來開發即時應用程式,下面就是答案。 即時應用程式必須處理多個即時使用者。這就是Node.js派上用場的地方,因為它支持基於事件驅動伺服器的回應,並幫助實現非阻塞功能。

Node.js開發人員利用非阻塞I/O功能。它還能夠快速傳輸用戶端和伺服器之間的資料。每當需要仲介管理員時,Node都是最佳選擇。

開發人員只需添加20行代碼即可將Node.js伺服器作為代理伺服器使用。一旦完成後,您的應用程式將成為從各種來源資料流資料的理想選擇。 其他重要的即時應用程式使用案例 即時應用程式的使用案例非常廣泛。

這就是為什麼討論其他重要的即時應用程式使用案例非常重要。其中之一是應用監控儀錶板,它可以跟蹤網站上的訪問者並視覺化其所有即時互動。在這裡,您可以收集使用者的即時統計資料。

通過在用戶達到特定漏斗點時打開通信管道,您還可以進一步與用戶進行有針對性的互動。對於任何業務來說,這都是巨大的優勢,因為它使他們能夠瞭解用戶或訪問者的即時行為,並且可以將其視覺化呈現出來。這些資料至關重要,並可供企業用於改善其產品和服務。

Node.js強大而靈活的雙向通訊端使所有這些成為可能。 現在,讓我們看看基礎設施方面。想像一下,一個軟體即服務(SaaS)提供商想要為他們的使用者提供像GitHub狀態頁面那樣的服務監控頁面。

Node.js事件迴圈使您能夠創建一個功能強大、基於Web的儀錶板,可以非同步檢查服務狀態。此外,它還通過WebSockets將資料推送給用戶端。您可以利用該技術即時報告公共和內部服務的狀態。

再思考一下這個想法,想像一個在金融機構、電信運營商或雲/網路/託管提供商中運行的網路運營中心(NOC)監控應用程式,它使用的是支援WebSockets和Node.js而不是Java或Java Applets的開放式Web堆疊。

視頻串流

串流可以定義為將大量數據分成小包裹傳送,而不是一次性傳輸整個資料。Node.js是開發視頻串流應用的理想選擇,因為它具有支援視頻串流的內建模組。此外,它還能夠創建可寫和可讀的數據串流。

Node.js還能在文件上傳時進行處理。Netflix是全球最大的串流服務,在190多個國家都有業務存在,也使用Node.js。接下來我們來看看為什麼會這樣呢?

為何Netflix選擇Node.js?

Netflix的整個用戶介面是基於Node.js技術開發的。它運作得非常好,以至於Netflix迅速決定在各種其他層面上應用它。Netflix開發團隊使用Node.js的主要目標是獲得一個輕量級的應用程式,能夠提供高性能。

這個基於Node.js的新應用程式將加載時間提高了70%。除此之外,它還帶來了以下效果:改善性能、減少構建時間、實現用戶自定義功能。

高度可擴展的應用程式

Node.js已成為所有那些消費者基數持續增長的應用程式和平臺的首選。像Walmart、PayPal、Uber、Netflix、LinkedIn等眾多知名公司都使用Node.js,因為它能夠提供無縫可擴展性。Node.js這項尖端技術具有多個功能,例如群集模塊。

它可以在多個CPU核心上實現負載均衡,使通過較小的模塊交付所需結果變得更加簡單,同時不會耗盡RAM處理資源。此外,Node.js還採用非阻塞事件循環機制,使服務器能夠無縫處理請求。從開發角度來看,Node.js還能讓您利用微服務架構將應用程式分為更小的部分。

這使您可以通過高效地定義和分配任務給不同團隊,在快速跟蹤開發、部署和維護應用程式的同時提高效率。有了Node.js,現代應用程式可以根據需要無縫地調整規模大小。它還幫助企業以更少的資源實現更高的性能。


聊天室功能

一個即時且多使用者的應用程式最典型的例子就是聊天應用程式。聊天應用程式是Node.js最好的使用案例之一,因為它是一個資料密集、高流量且輕量化的應用程式,可以在多台分散裝置上運行。讓我們試著瞭解它是如何工作的。

假設我們在網站上有一個單一的聊天室,人們可以在其中交換訊息。假設我們有三個正在網站上連接到訊息板的使用者。在這種情況下,伺服器端的Express.js應用程式將實現以下兩點:第一,處理GET /請求,提供包含訊息板和「發送」按鈕的網頁;第二,在WebSocket伺服器上監聽所有由WebSocket客戶端發出的新訊息。

在客戶端還有HTML頁面以及幾個已建立好的處理程式。其中之一負責處理「發送」按鈕點擊事件,它負責取得輸入訊息並將其傳送到WebSocket;另外一個則用於監聽WebSocket客戶端發送的新訊息。現在讓我們瞭解當其中一個使用者發布一條訊息時會發生什麼:首先,瀏覽器通過JavaScript處理程式接收到「發送」按鈕的點擊事件。

然後,它從文字訊息輸入框中取得值。之後,它通過連接到初始化在網頁上的伺服器的WebSocket客戶端發送WebSocket訊息。這些訊息隨後由WebSocket連接的伺服器端組件接收。

該組件使用廣播方法將訊息轉發給所有其他已連接的客戶端。客戶端通過運行在網頁內部的WebSockets客戶端組件以推播訊息形式接收到該訊息。然後,他們只需提取出該訊息的內容並將其附加到畫板上來更新網頁。

這只是其中一個最簡單的例子,用於瞭解它是如何工作的。您還可以使用基於Redis存儲庫的簡單快取來實現強大而穩定的解決方案;或者您也可以使用消息隊列來管理所有訊息的路由,以及一個強大到足以在臨時連接中斷或使用者離線時保存所有已註冊使用者的訊息的傳遞機制。
相關數據:
  • 根據stack overflow的2020年開發者調查報告,約有51.4%的專業開發者使用node.js。 來源: stack overflow
  • 在全球范围内,node.js的下载量在2019年达到了超过10亿次。 來源: nodesource
  • 根據builtwith的數據,在全球超過185,000個網站正在使用 node.js,其中包括知名公司如netflix、trello、paypal等 來源: builtwith
  • linkedin曾公布他们将其移动应用后端从ruby切换到node.js后,性能提升了20倍。 來源: linkedin engineering blog
  • 美國有35%以上的開發人員每週都會使用 node.js進行開發工作 來源: statista

伺服器端代理

協力廠商代理在網絡應用程式中可能會造成混亂。即使許多標準的協力廠商服務器(如Nginx和HAProxy)有時也無法管理多個請求。Node.js可以成為救世主,因為它可以輕鬆地作為服務器端代理使用,它可以以非阻塞的方式管理大量同時連接。

BBC新聞就是一個使用Node.js的例子。BBC新聞網站與多個協力廠商服務器通信,從各種來源收集數據。在這裡,Node.js有助於代理具有不同響應時間的多個服務。

如果你的代理基礎設施不存在,或者你需要解決本地開發問題,那麼你可以使用Node.js。這意味著你可以使用Node.js開發服務器來處理資源和API請求的客戶端應用程式。在生產中,你可以使用專用的代理伺服器(如HAProxy和nginx)來管理這些交互動作。

留言

文章隨選