新華通訊社 主管 中國新聞技術工作者聯合會 主辦

自主研發自主掌控系列|使用Node.js技術,建設靈活高效的企業級Web系統

作者:胡揚帆
發布時間 2018-04-27



筆者作為新華社技術實驗室自主開發小組成員,近幾年使用Node.js相關技術,參與了新華社綜合評審系統、神筆大俠闖江湖在線游戲、中國重大外交表述語料庫等多個社內創新項目的技術設計和開發工作。本文通過總結Node.js技術在應用開發工作中的經驗與思路,旨在進一步提高自身能力素質,同時就Node.js技術如何在我社技術系統中全面推行,更好地應用于核心業務系統的建設進行了探討,提出了思路和建議。

1.        Node.js技術特性

Node.js是一個開源跨平臺的服務器端JavaScript運行環境。它以Google Chrome V8解析引擎為基礎,采用類似Nginx的以事件循環驅動的異步I/O模型提高運行效率,通常認為,異步I/O的并發性能是同步I/O的近10倍。Node.js的核心優勢在于通用、靈活、高性能。

Node.js高性能的本質,在于它使用了底層庫libuv與操作系統內核配合處理異步事件,libuv封裝了對各操作系統高效事件輪詢函數的調用,如LinuxepollUnixkqueueWindowsIOCPlibuvNode.js中高時延的網絡I/O和磁盤I/O的請求通過系統調用注冊給操作系統內核,操作系統內核準備好請求數據后回調libuv所注冊的用戶函數將數據送回用戶空間完成I/O。通過這種單線程非阻塞的異步分層協作機制,既解放了CPU的高速運算能力,又避免了多進程或多線程模型容易造成的資源調度與開銷問題,使得Node.js可以像Nginx那樣單個線程就能處理成千上萬的網絡請求。

Node.js暴露給開發者的編程接口十分簡潔,開發者只需以回調函數的方式操作I/O返回數據就能實現異步I/O。就這樣Node.js把易學易用的JavaScript和強大的Unix網絡編程模型結合在一起,在龐大的開源社區以及活躍的技術委員會的帶動下,逐漸從各類技術體系中脫穎而出。

Node.js的不足在于它單線程的運行方式不能有效利用多核CPU進行運算,雖然調用C++擴展模塊或Java Jar包可以彌補,但在原生語言方面它的效率不如多線程的靜態編譯型語言,因而Node.js通常采用Master-Worker的主-從多進程模式進行部署,以彌補單線程對CPU利用率的不足。

2.        Node.js技術的現狀

2.1.       全球生態發展現狀

筆者從語言生態、開源社區和Node.js官方組織的報告等方面調研了Node.js技術的現狀,近兩年Node.js相關技術被越來越多的開發者或企業所接受,在社區生態中呈現出前所未有的發展速度。具體情況見附件部分。

2.2.       行業應用現狀

美聯社早在2014年就用了Node.js技術對外提供新聞圖片查詢的公共接口服務。紐約時報在20176月改版了包括PC端和移動端的新聞發布產品線,新版后臺以Node.js服務提供統一支撐,前端使用React技術,整個新聞發布業務應用Node.jsJavaScript全棧技術,這使他們將多語言分別維護的代碼倉庫合并成了一份,業務變得更加高效、精簡。

阿里巴巴作為國內最早一批研究Node.js的互聯網企業,自2015年開始采用Node.js技術分擔“雙十一”線上大流量以來,已經積累了相當多的經驗。Node.js被運用于阿里內部的分布式基礎設施之上,替換了原來使用 PHPJava 開發的應用層的程序,利用其靈活高效和高性能的特點服務于數據I/O并發量高,運營和業務相關需求多變的應用訴求。使用Node.js進行全棧開發提高了開發效率并使前后端合作邊界后移。



1 Node.js在阿里的應用場景

 

在阿里的Java / C++Node.js多語言生態中,靜態編譯型語言開發的底層系統應對數據庫事物ACID、分布式和計算密集場景,業務相對成熟穩定;以Node.js為主的上層應用系統應對靈活多變的業務訴求和數據密集的場景,各取所長。除了阿里,國外的 PaypalNetflix 等體量比較大的公司也使用 Node.js 來做類似的分工。

2.3.       Web應用層對比Java的應用優勢

應用層的主要任務是與各種數據源和底層系統使用基于 HTTP 或者 RPC API 交流,加上一定的業務邏輯,對數據做適當的處理后,渲染 HTML 或者拼裝 JSON與客戶端溝通。應用層的特點在于業務需求多變,接口并發需求高。

首先,在語言方面,強類型靜態語言在需要大量處理HTML渲染或JSON拼裝的場景下,效率先天不如弱類型動態語言。比如當應用需要操作一個API返回的JSON數據時,Java需要預先定義好與這個JSON對應的POJO類(包括成員類型定義和get/set方法定義),并進行實例化后才能進行操作,而JavaScript可以直接將JSON字符串實例化成對象進行操作,當返回JSON數據的結構或類型發生變化時,Java相關代碼的維護量將比JavaScript多很多。

在框架方面,Java Spring追求用嚴格的代碼檢查和層層的封裝規定來保障穩定性,面對應用層MVC數據、視圖、控制器各層模型都需要靈活定制或擴展情況下,過多的儀式化代碼犧牲了開發效率。在沒有事務性的復雜要求,或者事務被服務進行封裝的情況下,傳統框架的穩定性優勢難以體現。而Node.js從開發、測試、部署、冷啟用方面的速度更快,效率更高。

在接口性能方面,以同步阻塞I/O為主的多線程Spring框架在處理大量網絡請求時的并發效率與異步I/O不在一個量級,只是目前多進程多服務器的集群部署方式在一定范圍內掩蓋了其并發性能的劣勢。

3.        在實踐中逐漸形成Node.js自研體系,完成初步探索

2014年以來,筆者所在的開發小組從最初的實踐項目《輕易輕應用制作工具》中開發提煉了一套自研的技術開發框架,并應用到近幾年的各類項目中。由于當時的早期社區沒有類似Java Spring的成熟型企業級框架,因此我們進行了大量的Web系統相關技術的研究和選型,涉及內容包括登錄與鑒權,CookieSession,數據庫ORM,異常處理,定時任務,模板渲染,日志,Web安全等方面。逐漸形成了一套相對完善的自有框架,可按需進行配置、集成和擴展。這個過程讓我們對開發框架的認識從過去的單方面依賴上升到了可自主掌控的程度,深入理解了框架的作用。

在《新華社綜合評審系統》項目中,我們使用有限狀態機模型管理投票的狀態與狀態轉換規則,使用WebSocket實現端到端的實時雙向通信,保證評委端在投票環節之外的所有頁面自動化切換,以數據庫存儲為中心的計算與I/O分離策略保證投票狀態的持久化和恢復能力,以確保在現場出現任何技術故障時可以做到服務的自動恢復和評委頁面的自動恢復。最終該項目以實際表現出來的穩定可靠和快捷易用受到廣泛好評。

在《神筆大俠闖江湖微信H5游戲》項目中,采用數據庫的存儲類型優化和稀疏化索引數據的手段提高積分排名接口對實時計算的性能要求,以單進程部署服務進行測試,復雜接口在5500并發的壓力下平均響應時間在2秒以內,符合性能預期。最終游戲靜態資源采用CDN分發,接口服務采用了單臺虛擬機部署,上線后接口服務快速平穩,應用內存占用平均300M左右,沒有觸及性能天花板。

在后續項目中我們開始實踐了整合度更高的全棧開發,例如使用流行的MVVM框架Vue.js進行前端業務的工程化開發,對接Node.js提供的RESTful接口服務,對全棧開發與集成的高效性和統一性有實際體會。

憑借Node.js技術的靈活特性和動態語言靈活易用的特點,各項開發工作在編碼、測試、部署、構建和冷啟動等方面效率都很高,使得開發小組在人手不足,任務緊急而艱巨的情況下經常能達到早于預期的進度,并且保障工作任務的完成質量。

4.        Node.js在我社具有廣泛的應用前景

隨著我社新聞業務向互聯網思路轉型,整體業務構建于互聯網數字化新聞的采集、編輯、發布體系之上,技術特點趨向于數據交互密集,新聞業務模式亦從穩定趨向于靈活創新。其中采集端重在上傳效率,編輯端重在協同、檢校與流轉,發布端重在高并發,稿件全域追溯與流程控制重在各系統服務間的高度整合。數據交互環節多,流程長,涉及數據存取、API網關、多協議通信、統一認證、實時消息、流式傳輸和模板渲染、協同編輯、持續集成等等,屬于Node.js相關全棧技術擅長的應用范圍。

對于社內業務穩定的基礎組件和基礎中間件,計算密集型業務,以及對事務性操作有極高一致性要求的業務應繼續保持Java/C++等靜態語言的既有優勢。其他以功能靈活,數據交互為主的,要求快速開發、高性能的Web服務,都可以選擇Node.js技術進行開發。

軟件的組織形式在向著靈活發展,無論從部署形式的IaaSCaaSPaaSSaaS到現在的FaaS(函數即服務,Serverless架構),從軟件組織形式的單一應用到微服務架構,指導思想都是盡量將變化約束到最小的獨立單元,以穩定的體系去支撐靈活多變的獨立自治的業務單元。因此,對技術選型的要求也從過去的大一統技術框架變成了依據業務特點靈活選擇。Node.js及其npm的開源生態踐行了單一職責原則的“微服務”的思想,各類技術框架都體現了極簡易集成的特點,因此在當前的微服務架構之下,Node.js可以很好地與不同語言的服務管理框架進行集成接入。

5.        應用Node.js技術,更好地進行技術系統的開發

在如今開源社區繁榮生態的支撐下,各類通用性的開發、測試和部署的工具庫百花齊放,開箱即用,應用開發人員的核心任務逐漸聚焦于自身業務的實現。通常,我們可以參考工具庫提供的應用案例來實現應用功能,可以參考業界高性能架構案例來實現更高性能的服務。但是,業務模型和代碼架構只能由我們自己深入理解業務需求后自行設計,因此應用開發的難點在于深度理解業務模型,并對框架和業務代碼進行高度抽象以形成高內聚,低耦合的易復用易擴展的結構。

為了更好地將Node.js技術應用于系統建設,應努力做到工程的結構清晰、功能靈活、部署穩定、代碼便于擴展與維護,主要體現在以下四個方面:

從業務層面,要聯系實際抓業務重點,分清主次,了解使用場景,掌控工程實現細節和粒度,廣泛了解各種技術框架的特點并做到合理選型,整合人力資源,技術資源,時間資源做切實可行的開發計劃。

從技術層面,要有在開源庫中找“輪子”,選“輪子”和集成“輪子”的能力;靈活利用開發框架提供的結構性優勢;明確業務代碼與框架的職責邊界;梳理業務代碼的層次并實現通用代碼的復用;在保證工具、架構和開發流程穩定的情況下實現功能和性能的擴展;配置統一化標準化;使用云計算或容器進行應用部署;實現持續交付。

從運行層面,要考察系統各項APM性能監測指標,包括運行進程、線程的穩定性,接口性能,日志追蹤,內存占用以及Web安全。

從迭代層面,要根據系統運行指標或者新業務訴求對系統進行持續升級改進,當功能依賴開源工具時,按需做到隨工具的升級而更新。

綜合Node.js相關技術以及JavaScript技術通用、靈活、高效的特點,全球性的高速發展態勢,以及本社新媒體創新業務對技術系統提出的高效性、靈活性、可控性要求,Node.js相關技術的應用潛力巨大。


 

附件:Node.js全球生態現狀調研

截止20182月,根據modulecounts.com發布的各語言包管理器公共模塊數量統計排名,Node.js包管理工具npm誕生3年后在2015年超越了Java Maven成為第一,當前npm的模塊數量已經數倍于其后的JavaPHP


 

1 公共模塊數量統計排名(來自modulecounts.com

 

根據 GitHub.com發布的 Octoverse報告,JavaScript成為2017 GitHub 上最受歡迎的編程語言,JavaScript技術棧的項目數量超過PythonJava的兩倍。


 

2 2017年最受歡迎的編程語言排名(來自github.com

 

2017 Stack Overflow 年度開發者報告中最受開發者歡迎的技術框架部分Node.js排名第一。


 

3 最受開發者歡迎的技術框架(來自Stack Overflow

 

Node.js基金會發布的Node.js 2017用戶調查報告顯示,Node.js覆蓋了前端、后端以及全棧應用的開發,最多涉及Node.js的工具和技術包括數據存儲,前端框架,后端框架,負載均衡,云和容器,持續集成工具,Node.jsWeb應用開發中最受歡迎,占比達84%


      圖涉及Node.js開發的工具技術                                                  

 


                                                                                                                                        


      圖5 Node.js開發場景類型

                                         

 

             

 

       Node.js繼續保持著前所未有的發展速度,如今它已經成為一個通用的開發框架,被廣泛地應用于各種數據數字化的應用程序中。


 

參考文獻

 [1]    Node.js,維基百科[OL]. https://zh.wikipedia.org/zh-hans/Node.js

 [2]    Ngnix,維基百科[OL]. https://zh.wikipedia.org/wiki/Nginx

 [3]    LibuvGithub[OL]. https://github.com/libuv/libuv

 [4]    W. Richard Stevens, Stephen A. Rago. UNIX環境高級編程[M]. 人民郵電出版社. 2014

 [5]    樸靈. 深入淺出NodeJS[M]. 人民郵電出版社. 2013

 [6]    Module counts[OL]. http://www.modulecounts.com/

 [7]    The State of the Octoverse 2017[OL].  https://octoverse.github.com/

 [8]    Stack Overflow Developer Survey 2017[OL]. https://insights.stackoverflow.com/survey/2017

 [9]    Node.js State of the Union 2017[OL]. https://foundation.nodejs.org/announcements/2017/10/04/node-js-state-of-the-union-2017

[10]    解讀 V8 GC Log(一): Node.js 應用背景與 GC 基礎知識[OL]. http://alinode.aliyun.com/blog/37

[11]    Egg.js開發者文檔[OL]. https://www.eggjs.org/zh-cn/intro/index.html

[12]    React, Relay and GraphQL: Under the Hood of The Times Website Redesign[OL]. https://open.nytimes.com/react-relay-and-graphql-under-the-hood-of-the-times-website-redesign-22fb62ea9764

 

 

Copyright 1993-2018 Chinese Mass Media Technology, All Rights Reserved
中國傳媒科技雜志社版權所有 京ICP備16053505號-1
伊人成人综合,伊人成综合人网,伊人222综合网图片,Av在线伊人综合网 <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>