一、nodejs具有事件驅動、異步編程的特點。
事件驅動這個詞並不陌生,在某些傳統語言的網絡編程中,我們會用到回調函數,比如當socket資源達到某種狀態時,注冊的回調函數就會執行。Node.js的設計思想中以事件驅動為核心,它提供的絕大多數API都是基於事件的、異步的風格。以Net模塊為例,其中的net.Socket對象就有以下事件:connect、data、end、timeout、drain、error、close等,使用Node.js的開發人員需要根據自己的業務邏輯注冊相應的回調函數。這些回調函數都是異步執行的,這意味著雖然在代碼結構中,這些函數看似是依次注冊的,但是它們並不依賴於自身出現的順序,而是等待相應的事件觸發。事件驅動、異步編程的設計,重要的優勢在於,充分利用了系統資源,執行代碼無須阻塞等待某種操作完成,有限的資源可以用於其他的任務。此類設計非常適合於後端的網絡服務編程,Node.js的目標也在於此。在服務器開發中,並發的請求處理是個大問題,阻塞式的函數會導致資源浪費和時間延遲。通過事件注冊、異步函數,開發人員可以提高資源的利用率,性能也會改善。從Node.js提供的支持模塊中,我們可以看到包括文件操作在內的許多函數都是異步執行的,這和傳統語言存在區別,而且為了方便服務器開發,Node.js的網絡模塊特別多,包括HTTP、DNS、NET、UDP、HTTPS、TLS等,開發人員可以在此基礎上快速構建Web服務器。
二、nodejs的性能分析
Node.js的性能不錯。按照創始人Ryan Dahl的說法,性能是Node.js考慮的重要因素,選擇C++和V8而不是Ruby或者其他的虛擬機也是基於性能的目的。Node.js在設計上也是比較大膽,它以單進程、單線程模式運行(很吃驚,對吧?這和Javascript的運行方式一致),事件驅動機制是Node.js通過內部單線程高效率地維護事件循環隊列來實現的,沒有多線程的資源占用和上下文切換,這意味著面對大規模的http請求,Node.js憑借事件驅動搞定一切,習慣了傳統語言的網絡服務開發人員可能對多線程並發和協作非常熟悉,但是面對Node.js,我們需要接受和理解它的特點。由此我們是否可以推測出這樣的設計會導致負載的壓力集中在CPU而不是內存。既然Node.js采用單進程、單線程模式,那麼在如今多核硬件流行的環境中,單核性能出色的Node.js如何利用多核CPU呢?創始人Ryan Dahl建議,運行多個Node.js進程,利用某些通信機制來協調各項任務。目前,已經有不少第三方的Node.js多進程支持模塊發布