- 原文地址:Will Node.js forever be the sluggish Golang?
- 原文做者:Alex Hultman
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:steinliber
- 校對者:Endone,JasonLinkinBright
Node.js 會永遠只是慢的 Golang 嗎?前端
這篇文章展現的 Node.js 新擴展將顛覆這種狀況node
你彷佛老是不可避免地聽到下一個據稱更快的所謂 Node.js 「Web 框架」。是的,咱們都知道 Express 很慢,可是存在另外一個 「Web 框架」能真正提高 I/O 性能嗎?答案是否認的,除了避免 Express 的運行開銷外,這些新框架在 I/O 性能上並不能作的更多。想要走的更遠,就須要對 Node.js 深刻挖掘並從新設計,而不只僅是在其基礎上加新的一層。android
Express 是 Node.js 生態中最古老的所謂「網絡框架」之一。它構建在由 Node.js 所提供的開箱即用功能的基礎之上,並提供了一個以 App 爲中心的接口來管理 URL、路由、參數、方法等。ios
固然,它既高效又優雅,可是在性能方面卻不盡人意。最近還浮現出像 Fastify 以及其它數百個相似的網絡框架。它們都旨在以較低的性能損失來提供 Express 中的功能。須要指出的是;這是一種性能的損失而不是提高。它們仍然被嚴格限制在 Node.js 所能提供的範圍內,這與其競爭對象相比還遠遠不夠:git
不管是 Fastify 仍是其它所謂基於 Node.js 的 「Web 框架」都不能越過 Node.js 的紅線。相對於像 Golang 這樣熱門的選擇方案來講,這樣的上限能夠說是至關低了。github
幸運的是,Node.js 支持 C++ 擴展,Google 的 V8 綁定把 JavaScript 連接到 C++ 而且容許你的 JavaScript 代碼調用其任何行爲,甚至是 Node.js 自己並不提供的行爲。golang
這使得擴展 JavaScript 成爲可能。並提供了全新的視角去探索 JavaScript 的更多用途,使之能夠充分發揮 Google V8 的功能,而不用限制於 Node.js 「核心開發者」 所認爲的足夠好的功能。npm
我將發佈全新的代碼 µWebSockets.js,今天就能夠在 Github 上看到:github.com/uNetworking…。後端
它是另外一個用於 JavaScript 後端的 Web 服務,由大概 6 千行 C 和 C++ 代碼編寫,在性能方面極大的超過了 Golang。Bitfinex.com 已經把他們的交易接口(REST 和 WebSocket)遷移到了這個服務而且正在逐步將之投入生產。瀏覽器
來自 Bitfinex 的 Paolo Ardoino 特別提到:「這是一個很是酷的項目」。
這項工做得以完成,須要感謝這些贊助者;BitMEX、Bitfinex 和 Coinbase 使這項工做成爲可能。多虧了他們,咱們如今有了一個新的版本!
這是在新的代碼許可 Apache 2.0 協議下一個新的項目,是所謂 「uws」 的繼任者。它是一個完整的棧,從系統內核到 Google V8 引擎,爲 Node.js 帶來穩定,安全,符合標準,快速且輕量級的 I/O:
在這個層級的軟件設計中,其中的每一層都只依賴先前的層級,這使得不管是追蹤和修復問題仍是擴展新的支持變得很簡單。
µSockets 其自己甚至還有 3 個子層級,從 eventing 到 networking 再到 crypto,每個子層只知道前面的層級。這使得更換部件,修復問題和添加替代的實現都不須要更改任何高層的代碼。
對 OpenSSL 感到疲倦了?那好,經過替換 ssl.c 和 它的 600 行代碼就能夠替換 OpenSSL。其它層甚至都不用知道 SSL 是什麼,所以很容易定位錯誤。
這和 Node.js 的實現有很大的不一樣,其設計的實現爲「把一切都堆在一塊兒」。在 Node.js 的一個源文件中,你能夠找到 libuv 調用,系統調用,OpenSSL調用,V8 調用。這一切都混成一團而沒有試圖去接耦分離使模塊獨立。這使得它很難作出任何真正的改變。
如下是一個 µWebSockets.js 的很是簡化的實現,爲了簡潔起見省略了不少概念,可是應該能讓你大概知道 µWebSockets.js 是什麼:
在某些方面相比於 Golang 的 Gorilla Gorilla,在 SSL 和 非 SSL 基礎上它可能表現的更好。也就是說,SSL 基礎上的 JS 代碼能夠比非 SSL 基礎上的 Golang(在某些方面)更快的發送消息。我認爲這真的很酷。
Socket.IO 在不少方面就是 Express 的「實時」等價物。它們都一樣的古老,優雅且受歡迎,可是也很是的慢:
大部分 Socket.IO 所能幫助你的功能能夠概括爲發佈/訂閱,即向包含多個接收者的房間發送信息的功能,以及與之對應接收消息的功能。
Fallbacks 在今天沒有任何意義,由於每一個瀏覽器都支持 WebSockets,並且這種狀況已經持續不少年了。SSL 的流量不會被企業的代理劫持,而且將像任何 Http 流量同樣經過,因此 SSL 上的 WebSockets 確定不會被阻塞。你仍然能夠有 fallbacks,可是它們毫無心義而且會產生沒必要要的複雜性。
μWebSockets.js 的一個目標是提供相似於 Socket.IO 中的功能,使之有可能被徹底替代,而不是在其頂部包裝一層。但這並非強制執行任何特定的非標準協議。
大多數公司當遇到 WebSockets 時都在和某些發佈/訂閱的問題做鬥爭。遺憾的是,高效的發佈/訂閱服務並無在此次發佈的最後期限提供,可是它立刻就要來了,以很是高的優先級。它會很是快(基準測試中已經比 Redis 更快了)。注意!
優化,添加特性和修正錯誤。剛開始開發,可能不可以徹底適應,因此須要有一些相關的介紹。請記住,它是一個由三個不一樣的倉庫組成包含成千上萬行代碼的大型項目:
一些在 I/O 上有巨大壓力的公司在使用這個項目。穩定性和安全性(天然且明顯的)是這個項目的最高優先級。記住要在早期的發佈版本中報告穩定性方面的問題,由於這個發佈版本是包含大量更改的大版本。
若是你做爲一家公司認爲這個項目是有意義的,而且是有經濟利益的,那麼請確保和咱們取得聯繫。我將提供各類各樣的諮詢工做。請聯繫:github.com/alexhultman
謝謝!
若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。