編者注:本文來自 eBay 技術團隊的博客。javascript
在大多數狀況下,eBay基於Java的技術運轉着。咱們整個工做流程的中心圍繞着Java和JVM。考慮到網絡訪問的規模以及像ebay.com這樣類型的網站所須要的穩定性,採用成熟的技術是一個顯而易見的選擇。但咱們一直對新技術持開放態度,Node.js摘得候選人名單中最受關注技術已經有至關長的一段時間了。這篇文章對咱們如何開發eBay的第一個Node.js應用的幾個方面作了重點闡述。html
這開始於一些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的核心價值,明白了其美妙之處。
通過同行們的測試,咱們明白,能夠開搞了。java
咱們從一張白紙開始。想先構建一個足夠小的Node.js底板而後擴展,而不是引入一個專用的框架。最早的四個Node模塊是express,cluster,request和async。數據儲存採用MongoDB,易用並且eBay已經有內部建設。基本設置好,咱們的服務能夠在開發沙盒中運行了,接受請求,處理一些eBay的API,存儲數據。
爲了端對端測試,咱們配置了一些前端服務器指向Node.js服務,看起來一切良好,能夠繼續下一步。咱們列出了全部用戶用例,明確REST節點,設計數據模型和模式,肯定最佳的Node模塊以使用,並開始實現各節點。接下來的幾周,咱們低着頭,coding和coding。node
當應用開發到一個穩定點時,就是時候開始從開發狀態轉向階段測試環境了。這時咱們開始查看有關部署的Node.js技術棧。咱們部署的目標很明確:自動化部署,一次構建,到處運行。這是Java的部署方式,咱們也但願Node.js部署也儘量的無縫而簡單。
咱們可使用咱們已有的基於雲的部署環境。咱們所要作的就是編寫一個shell腳本並讓其在咱們的Hudson 持續集成服務器(CI)上運行。一旦新的代碼被提交到master分支上,Hudson CI就開始自動部署。使用這個腳本,服務器就能夠構建並打包Node.js應用並將其部署到雲上。雲端提供了簡單的接口來選擇運行環境(QA、階段測試、預發佈),而後咱們就能夠在有關的機器上運行了。
如今咱們有了本身的Node.js Web服務運行在許多穩定環境中。整個部署步驟比咱們想象的要更快、更簡單。git
在eBay,咱們有專門的日誌API與Java線程和JVM集成在一塊兒。一個好的基於這些日誌數據的監控面板能夠很好的隨時反應可能出現的問題。咱們與中央日誌系統進行對接,爲Node.js也建立了相似的監控系統。咱們很幸運,咱們有現成的日誌API。咱們開發了一個日誌模塊並實現了三種不一樣的日誌API:
源碼級日誌 - 這個等級包括錯誤/異常,數據庫隊列,HTTP請求,元數據交易等等。
機器級日誌 - 這個等級包括CPU/內存和其餘操做系統的運行情況。機器級日誌運行於集羣模塊層中,咱們擴展了npm cluster module並建立了eBay定製版。
負載均衡器級日誌 - 全部的使用Node.js的機器都工做於一個負載均衡器以後,它負責向機器週期性地發送信息並保證一切運轉良好。一旦有一臺機器宕掉,負載均衡器就會緊急啓用備用機器,並向運維和工程小組發出警告。github
咱們確保其生成的日誌文件格式與Java版本的日誌相一致,這樣就能夠生成與原來相同的你們熟悉的面板和報告了。
一個有關日誌的主要難題在於Node.js event loop的異步特性。這將致使各項業務的順序徹底混雜在一塊兒。下面這個例子可讓你更好的瞭解這個問題:Node經過異步調用啓動了一次URL處理並訪問數據庫。這個過程將在數據庫訪問完成以前和下一次請求一併進行。這在諸如Node.js一類的事件驅動引擎中很是廣泛,各類日誌關於URL處理的日誌混雜在一塊兒,報告工具會生成混亂的輸出。咱們同時必須給出這個問題的短時間和長期解決方案。mongodb
結論shell
完成了以上這些工做,咱們可讓Hackathon項目運行起來了。這是eBay第一個以Node.js做爲後端的應用。咱們已經在內部員工之間進行了測試,有關其性能的反饋都至關不錯。將來將更加精彩!
咱們要爲咱們內部的Node.js專家Cylus Penkar喝彩,他一直在爲這個項目進行引導並做出了貢獻。有了此次Node.js後端的成功,eBay的技術團隊正在使用Node.js打造一個完善的前端技術棧。這將包括咱們如今大部分資源,這些功能包括本地化、資源管理(JS/CSS/images)以及項目跟蹤。對於前端工程師來講,夢想實現了。咱們能夠自豪的說: 「JavaScript is EVERYWHERE.」數據庫
原文:How eBay built the first Node.js application
轉載自:開源中國 - DrZ, 傅小黑, LeoXu