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

騰訊開源發表於2018-08-14

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

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

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

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

Tars.js 2.0 釋出以下 9 大特性:

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

l 多程式負載均衡與管理。

l 程式碼異常監控與重啟。

l 服務日誌蒐集與處理。

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

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 非侵入開發框架 Tars.js 2.0 正式釋出騰訊 Node.js 非侵入開發框架 Tars.js 2.0 正式釋出


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

程式管理

預設基於 cluster 模組進行負載均衡,程式數可以配置為1~max(CPU核心數)、還可配置為 auto(物理核心數相同)以減小記憶體壓力提升“價效比”。

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

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

» 案例說明

某服務在論壇 UBB 程式碼轉 HTML 時,使用未優化的正規表示式進行 XSS 攻擊過濾,但由於使用者發帖時圖片採用 BASE64 編碼,導致正規表示式計算時間過長,CPU 使用率飆漲到100%:

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

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

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

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

服務監控

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

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

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

» 監控說明

Web 服務一般由靜態與動態資源(介面)組成,由於靜態資源(本地檔案)的請求耗時遠低於動態資源(業務邏輯),請求量往往又很高,拉低了服務整體耗時。

基於此,Tars.js 將請求 URL 中的 PATH 節作為介面,每個介面均可檢視其總流量、平均耗時、異常率,便於使用者全面瞭解服務效能。

特性監控

無論您服務的型別是什麼,總是會上報下述特性,便於回溯問題與評估效能:

l memUsage:記憶體用量,將會上報 rss、heapUsed、heapTotal 這三個用量(單位為位元組)

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

l eventloopLag:(任務)佇列延遲,每隔2秒取樣(單位為毫秒)

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

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

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

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

日誌輸出

所有通過 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 採用非同步機制,在發生異常時堆疊不完整,導致定位問題複雜。

鑑於此,我們提供了長鏈路跟蹤技術在產生異常時自動附加前序呼叫堆疊,同時還支援在異常堆疊中過濾出使用者程式碼部分。

由於開啟此特性時會造成效能損耗,故預設關閉,管理平臺等效能不敏感業務可直接通過配置開啟。

» 案例說明

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

執行上述程式碼會丟擲下述異常:

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) 、終端、後端與大資料計算。


相關文章