在大多數情況下,eBay基於Java的技術運轉著。我們整個工作流程的中心圍繞著Java和JVM。考慮到網絡訪問的規模以及像ebay.com這樣類型的網站所需要的穩定性,采用成熟的技術是一個顯而易見的選擇。但我們一直對新技術持開放態度,Node.js摘得候選人名單中最受關注技術已經有相當長的一段時間了。這篇文章對我們如何開發eBay的第一個Node.js應用的幾個方面做了重點闡述。
這開始於一些eBay工程師(Steven,Venkat和Senthil)想把“eBay Hackathon”編程大賽的獲獎作品"Talk"用於生產環境。當時我們發現java不適合項目要求(沒要冒犯的意思),於是開始研究Node.js。現在我們完全使用Node.js開發並投入運行。
這個項目有兩個核心要求。第一是盡可能的實時性,也就是維護活動連接。第二是組織各種eBay服務的信息顯示在頁面,即處理有I/O限制的操作。開始時用Java搭建基礎,但比預想的資源要多,伸縮性很有問題。這些障礙令我們從草稿裡做了新中間編配器(orchestrator),並發現Node.js似乎是更好的選擇。
eBay由Java開發,Java是高效的強類型語言,那時很難說服人們用JavaScript做後端,有類型安全、錯誤處理、延展性等問題。而且,JavaScript(世界上最被誤解的語言)本身也給爭論添油加醋。為了解決問題,我們做一個內部備忘,請工程師們提意見,問題,疑慮和一切與Node.js相關的。
幾天後,我們有了詳盡的工作列表。如預料中,主要的問題集中在堆棧可靠性和處理之前Java實現的功能的效率。我們回答每個問題,提供實際例子的細節。同時這些例子讓大家開眼界,並發現一些以前沒考慮到的問題。最後,大家都理解了Node.js的核心價值,明白了其美妙之處。
經過同行們的測試,我們明白,可以開搞了。
我們從一張白紙開始。想先構建一個足夠小的Node.js底板然後擴展,而不是引入一個專用的框架。最先的四個Node模塊是express,cluster,request和async。數據儲存采用MongoDB,易用而且eBay已經有內部建設。基本設置好,我們的服務可以在開發沙盒中運行了,接受請求,處理一些eBay的API,存儲數據。
為了端對端測試,我們配置了一些前端服務器指向Node.js服務,看起來一切良好,可以繼續下一步。我們列出了所有用戶用例,明確REST節點,設計數據模型和模式,確定最佳的Node模塊以使用,並開始實現各節點。接下來的幾周,我們低著頭,coding和coding。
當應用開發到一個穩定點時,就是時候開始從開發狀態轉向階段測試環境了。這時我們開始查看有關部署的Node.js技術棧。我們部署的目標很明確:自動化部署,一次構建,處處運行。這是Java的部署方式,我們也希望Node.js部署也盡可能的無縫而簡單。
我們可以使用我們已有的基於雲的部署環境。我們所要做的就是編寫一個shell腳本並讓其在我們的Hudson 持續集成服務器(CI)上運行。一旦新的代碼被提交到master分支上,Hudson CI就開始自動部署。使用這個腳本,服務器就可以構建並打包Node.js應用並將其部署到雲上。雲端提供了簡單的接口來選擇運行環境(QA、階段測試、預發布),然後我們就可以在有關的機器上運行了。
現在我們有了自己的Node.js Web服務運行在許多穩定環境中。整個部署步驟比我們想象的要更快、更簡單。
在eBay,我們有專門的日志API與Java線程和JVM集成在一起。一個好的基於這些日志數據的監控面板可以很好的隨時反應可能出現的問題。我們與中央日志系統進行對接,為Node.js也創建了類似的監控系統。我們很幸運,我們有現成的日志API。我們開發了一個日志模塊並實現了三種不同的日志API:
源碼級日志 - 這個等級包括錯誤/異常,數據庫隊列,HTTP請求,元數據交易等等。
機器級日志 - 這個等級包括CPU/內存和其他操作系統的運行狀況。機器級日志運行於集群模塊層中,我們擴展了npm cluster module並創建了eBay定制版。
負載均衡器級日志 - 所有的使用Node.js的機器都工作於一個負載均衡器之後,它負責向機器周期性地發送信息並保證一切運轉良好。一旦有一台機器宕掉,負載均衡器就會緊急啟用備用機器,並向運維和工程小組發出警告。
我們確保其生成的日志文件格式與Java版本的日志相一致,這樣就可以生成與原來相同的大家熟悉的面板和報告了。
一個有關日志的主要難題在於Node.js event loop的異步特性。這將導致各項業務的順序完全混雜在一起。下面這個例子可以讓你更好的了解這個問題:Node通過異步調用啟動了一次URL處理並訪問數據庫。這個過程將在數據庫訪問完成之前和下一次請求一並進行。這在諸如Node.js一類的事件驅動引擎中非常普遍,各種日志關於URL處理的日志混雜在一起,報告工具會生成混亂的輸出。我們同時必須給出這個問題的短期和長期解決方案。
完成了以上這些工作,我們可以讓Hackathon項目運行起來了。這是eBay第一個以Node.js作為後端的應用。我們已經在內部員工之間進行了測試,有關其性能的反饋都相當不錯。未來將更加精彩!
我們要為我們內部的Node.js專家Cylus Penkar喝彩,他一直在為這個項目進行引導並作出了貢獻。有了這次Node.js後端的成功,eBay的技術團隊正在使用Node.js打造一個完善的前端技術棧。這將包括我們現在大部分資源,這些功能包括本地化、資源管理(JS/CSS/images)以及項目跟蹤。對於前端工程師來說,夢想實現了。我們可以自豪的說: “JavaScript is EVERYWHERE.”