我們在用 Node.js 處理知乎主站的 web 實時推送。你現在看到的 Feed 、訊息的實時更新,背後就是幾個 node 程序扛起來的。優點:
1. 處理高併發場景效能更高在用 socket.io 之前,推送服務是用 ajax polling 做的。我們用 Tornado 和 Node.js 做過兩個版本的推送服務。在當時的測試環境下,Node.js 的 CPU 時間是 Tornado 的三分之一,記憶體使用是 Tornado 的一半,程式碼行數只有 Tornado 的三分之一(Node.js 版是用 coffee 寫的)。後來我們使用了 socket.io,CPU 開銷進一步降低。
2. 函數語言程式設計非常適合寫非同步回撥鏈用 Node.js 配合 CoffeeScript 寫非同步操作鏈非常便利,相比之下 Tornado 無論是寫命名函式的回撥,還是 yield 一個 Task 都沒那麼自然。缺點:1. 大量匿名函式使異常棧變得不好看。2. 無法以 request 為單位 catch 異常,必須確保不要在不 catch 異常的第三方庫的回撥裡的拋異常,這在一個非同步操作鏈條裡是一件比較麻煩的事。解決方法之一是對那些不 catch 異常的第三方庫做一些封裝,把所有的異常變成事件,改成 on("error") 形式的 API。
我們在用 Node.js 處理知乎主站的 web 實時推送。你現在看到的 Feed 、訊息的實時更新,背後就是幾個 node 程序扛起來的。優點:
1. 處理高併發場景效能更高在用 socket.io 之前,推送服務是用 ajax polling 做的。我們用 Tornado 和 Node.js 做過兩個版本的推送服務。在當時的測試環境下,Node.js 的 CPU 時間是 Tornado 的三分之一,記憶體使用是 Tornado 的一半,程式碼行數只有 Tornado 的三分之一(Node.js 版是用 coffee 寫的)。後來我們使用了 socket.io,CPU 開銷進一步降低。
2. 函數語言程式設計非常適合寫非同步回撥鏈用 Node.js 配合 CoffeeScript 寫非同步操作鏈非常便利,相比之下 Tornado 無論是寫命名函式的回撥,還是 yield 一個 Task 都沒那麼自然。缺點:1. 大量匿名函式使異常棧變得不好看。2. 無法以 request 為單位 catch 異常,必須確保不要在不 catch 異常的第三方庫的回撥裡的拋異常,這在一個非同步操作鏈條裡是一件比較麻煩的事。解決方法之一是對那些不 catch 異常的第三方庫做一些封裝,把所有的異常變成事件,改成 on("error") 形式的 API。