騰訊 Node.js 非侵入開發框架 Tars.js 2.0 正式發佈

隨着互聯網的發展,愈來愈多的業務不只僅由單一節點或是單一語言就可承載,而是趨向多語言分佈式協同開發,例如接入層由 Node.js 完成,邏輯以及數據層由 C++/GO/Python 實現,並由此組成大型異構系統。html

基於 Tars 體系研發出 Tars.js 以便用戶在不改變異構系統總體架構的狀況下快速搭建及遷移 Node.js 服務,並可很是方便的將原來的單一服務拆分爲多個邏輯子服務,並在騰訊內支撐起了上百億的流量。前端


Tars.js 在騰訊內部通過 5 年多的沉澱與迭代(Node.js@0.10版本即提供支持),普遍運用於騰訊QQ瀏覽器、騰訊桌面瀏覽器、騰訊地圖、應用寶、騰訊手機管家、互聯網+、騰訊醫療、騰訊覓影、保險、彩票等幾十個重要業務中。node

Tars.js 2.0 發佈如下 9 大特性:git

l 100% 由 JavaScript 編寫,不包含任何 C/C++ 代碼。github

l 多進程負載均衡與管理。正則表達式

l 代碼異常監控與重啓。npm

l 服務日誌蒐集與處理。後端

l HTTP(s) 監控與上報,並支持自定義上報。api

l 符合 Tars IDL 編解碼規範。瀏覽器

l 支持 Tars RPC 調用與染色功能。

l 支持管理命令發送以及服務配置拉取。

l 首創 LongStackTrace 異常跟蹤機制。

l …… 更多特性可訪問 @tars/node-agent 瞭解

Tars.js 2.0 三大設計理念:

» 高自由度:

l 兼容全部(≥0.10)官方 Node.js 版本。

l 對 Node.js 源碼無侵入無修改。

l 底層對上層徹底透明,支持各類上層框架,無需變動。

也就是說:

您可使用任何您熟悉的框架(如 Express.js / Koa.js 等,包括但不只限於 Web 框架),也無需對框架進行任何修改(無需引入任何中間件)。便可經過 Tars.js 運行,享受平臺提供的各類監控與管理特性。

與此同時,Tars.js 所提供的模塊,也能夠根據您的需求引入(如未使用到則可不引入)。

» 高性能:

Tars.js 爲高性能與大併發量而設計,使用了大量的前端(V8)優化技巧(如 FlattenString/FastProperties 等)儘可能下降所提供的能力對於業務性能的影響。

通過咱們測試(Web Server),默認的旁路上報與監控對服務性能的影響≤ 5%,經常使用模塊(RPC、日誌等)性能位於業界前列。

» 差別化:

Tars.js 根據不一樣的業務類型提供差別化運營方案:

l 高流量業務:盡力下降框架對業務性能的影響。

l 低流量業務:充分利用硬件資源提高開發體驗。

"Hello World"

經過 Tars.js 來部署您的代碼,可直接擁有下文全部特性,而無修修改任何代碼


(甚至於 Node.js 官網 例子,均可以直接運行)

進程管理

默認基於 cluster 模塊進行負載均衡,進程數能夠配置爲1~max(CPU核心數)、還可配置爲 auto(物理核心數相同)以減少內存壓力提高「性價比」。


與此同時,進程僵死檢測也會同時啓動,實時監控業務進程。

» 案例說明

某服務在論壇 UBB 代碼轉 HTML 時,使用未優化的正則表達式進行 XSS 攻擊過濾,但因爲用戶發帖時圖片採用 BASE64 編碼,致使正則表達式計算時間過長,CPU 使用率飆漲到100%:


開啓僵死檢測後,Tars.js 監控到業務進程僵死時,自動重啓業務進程,從而縮短了業務無響應時間:


Tars.js 雖然沒法解決業務代碼的問題(BUG),但會盡最大努力保證業務的可用性。

服務監控

以服務名、接口名(URL-PATH 節)爲緯度,統計總流量、平均耗時、超時率、異常率:


其中返回碼大於 400 (可配置)做爲異常進行上報。

» 監控說明

Web 服務通常由靜態與動態資源(接口)組成,因爲靜態資源(本地文件)的請求耗時遠低於動態資源(業務邏輯),請求量每每又很高,拉低了服務總體耗時。

基於此,Tars.js 將請求 URL 中的 PATH 節做爲接口,每一個接口都可查看其總流量、平均耗時、異常率,便於用戶全面瞭解服務性能。

特性監控

不管您服務的類型是什麼,老是會上報下述特性,便於回溯問題與評估性能:

l memUsage:內存用量,將會上報 rss、heapUsed、heapTotal 這三個用量(單位爲字節)

l cpuUsage:CPU用量,將會上報CPU使用率,數據彙總爲邏輯單核(單位爲百分比)

l eventloopLag:(任務)隊列延遲,每隔2秒採樣(單位爲毫秒)

l libuv:I/O用量,將會上報 activeHandles、activeRequests 這兩個用量


各策略以平均值(Avg)、最大值(Max)、最小值(Min)分節點進行統計:


日誌輸出

全部經過 Console 模塊(如 console.log)輸出的日誌,都會輸出到服務本地文件內。並附加相關信息(以下),方便定位問題。

日誌格式:日期時間|進程PID|日誌級別|輸出文件名與行號|日誌內容

2018-07-01 12:00:00|332|DEBUG|app.js:13|Server running at http://127.0.0.1:3000/

LongStackTrace

因爲 Node.js 採用異步機制,在發生異常時堆棧不完整,致使定位問題複雜。

鑑於此,咱們提供了長鏈路跟蹤技術在產生異常時自動附加前序調用堆棧,同時還支持在異常堆棧中過濾出用戶代碼部分。

因爲開啓此特性時會形成性能損耗,故默認關閉,管理平臺等性能不敏感業務可直接經過配置開啓。

» 案例說明

執行上述代碼會拋出下述異常:

ReferenceError: ThisMayThrowError is not defined

at Timeout.setTimeout as _onTimeout

at ontimeout (timers.js:427:11)

at tryOnTimeout (timers.js:289:5)

at listOnTimeout (timers.js:252:5)

at Timer.processTimers (timers.js:212:10)

setTimeout 的前序堆棧都丟失了,致使問題難以追溯。

開啓此特性(且過濾出用戶代碼)後,上述代碼(不作修改)拋出的異常就會自動附加前序調用堆棧(以下):

ReferenceError: ThisMayThrowError is not defined

at Timeout.setTimeout [as _onTimeout] (test.js:4:13)

at Promise.resolve.then.val (test.js:2:5)

at Object.<anonymous> (test.js:1:82)

以便於用戶定位問題,這也體現了 Tars.js 差別化運營理念。



上述這些特性均無需修改業務代碼(無需引入任何模塊)便可以擁有。

因爲篇幅有限未能展現全部能力,若是您有更多需求(如 RPC 調用等)可以使用 Tars.js 所提供的模塊(以下)實現

l @tars/rpc : Tars RPC 調用模塊。

l @tars/stream : Tars(Tup) 協議編解碼模塊。

l @tars/logs:日誌組件,包含(按大小、時間)滾動與遠程日誌。

l @tars/config:用於在線獲取服務配置文件。

l @tars/monitor:提供服務監控、特性監控與PP監控上報支持。

l @tars/notify:用於服務(告警)消息上報。

l @tars/utils:輔助工具集合,包含 Tars 配置文件與 Tars RPC Endpoint 解析器。

l @tars/dyeing:Tars RPC 染色定義模塊。

每一個模塊(點擊名稱跳轉)均有極爲詳細的文檔(README)方便您在任什麼時候候查閱。

在 Tars.js 的世界裏,您只須要專一於業務代碼,餘下的交給 Tars.js。

Github 開源地址:

github.com/tars-node/T…

github.com/Tencent/Tar…

做者介紹

@SuperZheng,騰訊 Tars 開源項目核心貢獻者,主要負責 Node.js 語言在 Tars 框架內的基礎運行架構開發,來自於騰訊 QQ 瀏覽器 [SuperTeam] 的全棧架構師,熟知 Web(3D) 、終端、後端與大數據計算。

相關文章
相關標籤/搜索