李 鵬
(1.英業達集團(天津)電子有限公司 天津 300193;2.天津科技大學電子信息與自動化學院 天津 300457)
目前,國內外市場上的客戶關系管理系統(CRM)多采用Java作為基礎語言進行設計開發,其安全性、穩定性、系統完善度、架構安全性等得到了很好的保證。但是其開發周期相對較長,人力需求較多,最重要的是Java在高并發的處理上存在一些弊端,很容易造成Server端阻塞 。而Node.js高效的異步事件調度機制和基于javascript的閉包模式較好地解決了這些弊端。
Node.js是由 Ryan Dahl編寫的服務器端 javascript,其初衷是為了編寫更為高效的 Web服務器,它使用當前最快的谷歌V8 javascript引擎和單線程的模式。因為不需要考慮并發,因此也就不涉及鎖和阻塞的問題,大大簡化了編程。 它的事件回調模型均采用異步操作,如數據庫訪問都是通過事件來觸發的。
Node.js完全發揮了 javascript作為動態解釋語言的強大威力,開發人員可以自由使用 javascript的一切特性,如閉包(closure),并且不需要擔心跨瀏覽器支持(因為是服務端)。那么單線程如何處理多用戶請求呢?事實上,Ryan觀察到 Web訪問的一個事實:每次 Web請求服務周期最耗費時間的往往是 I/O 操作,包括讀寫文件、數據庫操作、開啟網絡等。真正Web 服務內部的運算只占很小的比例。例如瀏覽器訪問一個頁面,幾乎大部分時間都花在 I/O的讀寫上,從讀文件一直到向接口(socket)寫數據,花在頁面后端代碼的計算量則微乎其微。舉例來說,假設 Web Server是一個銀行,每個瀏覽器的訪問相當于客戶去窗口取一筆錢,客戶在某個窗口辦理業務相當于服務器從本地硬盤讀寫文件,這個操作會花很長時間,由于窗口數有限,所以需要一個排隊叫號系統,即Node.js線程。當窗口有空時,營業員就通知排號系統叫下一位,但是喇叭一次只播放一個叫號的聲音,所以所有通知都存放在了一個事件隊列中,排號系統報完一個號再處理下一個,直到隊列空為止,然后就處于空閑狀態。如果把叫號類比后端代碼執行,它的速度就會比處理銀行業務快得多,所以只需一個喇叭就足夠了。由于沒有多線程的切換消耗,所有運算都作用在實際的計算上,從而提高了處理量。
Node.js 在實時的 Web應用上采用了基于 WebSocket的推送技術。這意味著在經過了20多年的基于無狀態的請求-返回機制的無狀態交互之后,終于有了實時的、雙向連接的Web應用,客戶端和服務器端都可以發起通信,能夠自由地交換數據。與此形成鮮明對比的是傳統的 Web響應模式,客戶端總是主動發起通信而服務端被動返回。此外,這些都是基于運行在標準80端口上的開放Web組件(HTML、CSS和JS)。
盡管 Flash 和 Java Applet 的形式已經應用很多年了,但實際上這些方式只是使用網絡將數據傳遞到客戶端上的沙箱(Sandboxie)環境。它們都是隔離運行的,而且經常操作到需要額外的權限之類的非標準端口。憑借獨特的優勢,目前Node.js已在許多著名公司的產品中發揮了關鍵作用。
Node.js 的主要思路是:使用非阻塞的、事件驅動的 I/O操作來保持在處理跨平臺(across distributed devices)數據密集型實時應用時的輕巧高效。簡單講,Node.js 不是一個即將主導Web開發的銀彈(silver bullet)級的平臺。相反,它是一個滿足特別需求的平臺。事實上,使用它進行繁重的計算等于摒棄Node 所有的優點。Node 真正的亮點在于建設高性能、高擴展性的互聯網應用,因為它能夠處理龐大的、高吞吐量的并發連接。
傳統的網絡服務技術,是每新增一個連接(請求)便生成一個新的線程,這個新的線程會占用系統內存,最終會占據所有的可用內存。而 Node.js使用非阻塞的異步 I/O 調用,僅運行在一個單線程中,所有連接都由該線程處理,全部掛在該線程的事件循環中,可以允許其支持數萬個并發連接。
當所有客戶端請求共享單一線程時 Node.js也會出現問題,這也是編寫 Node.js 應用的潛在缺陷。首先,大量的計算可能會使 Node 的單線程暫時失去反應,并導致所有的其他客戶端的請求一直阻塞至計算結束。其次,開發人員需要非常小心地避免 Exception 阻塞核心的事件循環,因為這將導致Node.js 實例的終止(即程序崩潰)。
CRM管理系統的軟件架構組成如圖1所示:

圖1 CRM管理系統的軟件架構Fig.1 Software architecture of CRM management system
圖 1顯示了 CRM 系統的工作流程:瀏覽器端通過 Apps發送請求(Ajax)至后臺(Server),后臺尋找此請求所對應的方法,這些方法通過與數據庫的交互工具(MongoSkin等)來實現對數據的增、刪、改、查,再把相應的結果返給 Apps,然后通過 Html及 javescript顯示在瀏覽器(Browser)段,這樣就可以將客戶數據展示在瀏覽器端對應的功能區,也可以實現對數據庫中所存用戶數據的增、刪、改、查等處理。
CRM系統中的網頁主要是基于HTML、CSS和javascript技術實現的,再通過JQuery、Bootstrap等輔助工具來更好地實現所需功能和頁面的美觀。
開發一個 Web 應用程序,最重要的莫過于數據庫的使用。過去 PHP 有 MySQL 當最佳伙伴,而現在 Node.js 有MongoDB 做最佳的組合。MongoDB 是 NoSQL(非關系型數據庫)的代表之一,它是一個基于分布式文件存儲的數據庫,由 C++語言編寫,其采用 JSON/BSON 作為數據儲存和溝通的格式,亦使用 javascript 做為服務器端(Server-side)的執行語言,一切設計習慣都與 Node.js 非常吻合,搭配使用也方便快捷。
該系統使用MongoDB數據庫,它擁有 NoSQL 的普遍特性,不用預先定義數據結構(Schema),并且能夠勝任大數據量下任意字段的查詢,寫入性能高,可寫入百萬級別的數據。MongoDB比普通關系型數據庫快。因此,針對 CRM 系統大數據量的用戶數據和ESMS架構所采用的Node.js技術,使用MongoDB數據庫。
CRM 管理系統含用戶登錄、系統首頁平臺、用戶管理、商品分析等功能模塊,基于 Node.js、Html、javascript等技術應用MongoDb數據庫搭建了這些功能平臺,用戶可以依據興趣或需求點擊相關按鈕進入相關頁面查看。
用戶使用賬號、密碼完成登錄,登錄成功會看到系統首頁,如登錄失敗會有失敗提示。登錄界面如圖2所示。

圖2 登錄界面Fig.2 Login interface
系統首頁分為 3部分內容:①標題欄為業務功能區,通過點擊標題欄中的功能區可以進入到相對應的功能模塊;②報表分析區,通過采樣將客戶數據進行分析和整理,然后以圖形的方式直觀地顯示出來;③登入用戶顯示及注銷區,用戶點擊登錄名后的下拉箭頭,可以選擇退出系統,也可以修改個人信息情況。
系統首頁界面如圖3所示。
客戶管理模塊界圖面如圖4所示。
該模塊主要有:會員列表、會員自定義分組、會員等級設定等功能。用戶點選菜單中的 [客戶管理] → [會員列表] 功能,系統顯示會員列表界面。會員列表界面可以支持多種分類查詢,查詢功能包含分組查詢和條件查詢。

圖3 系統首頁界面Fig.3 Interface of system homepage

圖4 客戶管理模塊界面Fig.4 Interface of client management module
在頁面中輸入匯入渠道、姓名、性別、手機號等字段中任意要搜索的值,點擊確定,觸發以下方法并傳入相應參數:


最后將查找出的 json數據返回前臺,前臺會據此畫出對應的表格等操作。
通過以上前后臺數據傳遞代碼可以看出,當請求發到Node.js后,它會采用回掉(CallBack)的方式來處理事件,整個過程沒有阻塞也不需要等待?;谶@樣的機制,理論上陸續有用戶請求連接,Node.js都可以進行響應,因此 Node.js能支持比 Java、PHP程序更高的并發量,雖然 Java、PHP也可以通過子線程的方式來實現并發請求,但顯然 Node.js的回掉函數和異步機制性能更高。由于要實現的操作系統可能會有很多的并發情況和I/O請求,因此采用Node.js和MongoDB的開發模式會更加高效易用。
同樣,其他的一些功能模塊也是采用類似的邏輯,只是按照不同的需求而搭建不同的頁面結構來完成,如商品分析、客戶服務、系統數據管理等功能。
介紹了Node.js以及以Node.js為基礎開發框架的應用系統 CRM。它使用 Google的 V8虛擬機來解析和執行javascript代碼,也可以說 Node.js就等于“運行時環境+庫”。它使用單線程和非阻塞I/O,這使得架構性能更好,開發代碼更為整潔,同時 Node.js是一個非??拷讓拥墓ぞ邘旎蜻\行環境,可以精細控制 Request 和 Response 的時間和內容,而且它的異步回調模式能夠更好地處理大并發事件。因此,CRM 管理系統使用 Node.js可以更好地處理多人操作的并發情況以及大數據量所帶來的問題,通過 Node.js的異步模式和其特有的監聽方式,可以更好地對用戶數據進行統計和采樣,使操作人員更好地掌握用戶的相關數據。
隨著信息化服務時代的到來,Web服務的高效性和準確性也日益重要。綜合Node.js的優勢,其在未來的Web開發和其他軟件開發領域一定會得到廣泛應用■。
[1]李松峰.JQuery基礎教程[M].北京:人民郵電出版社,2012.
[2][美]Mike,Wilson著;林冀,范俊,張鵬譯.Node應用程序構建[M].北京:人民郵電出版社,2014.
[3]黃丹華.Node.js開發實戰詳解[M].北京:清華大學出版社,2014.
[4]郭遠威.大數據存儲MongoDB實戰指南[M].北京:人民郵電出版社,2015.
[5]Bowers M,Synodinos D,Sumner V.Pro HTML5 and CSS3 Design Patterns[Z].2013:1.
[6]李安瑜.Web Service技術與實現[M].北京:國防工業出版社,2003.