隨着互聯網的發展,愈來愈多的業務不只僅由單一節點或是單一語言就可承載,而是趨向多語言分佈式協同開發,例如接入層由 Node.js 完成,邏輯以及數據層由 C++/GO/Python 實現,並由此組成大型異構系統。 基於 Tars 體系研發出 Tars.js 以便用戶在不改變異構系統總體架構的狀況下快速搭建及遷移 Node.js 服務,並可很是方便的將原來的單一服務拆分爲多個邏輯子服務,並在騰訊內支撐起了上百億的流量。 前端
Tars.js 在騰訊內部通過 5 年多的沉澱與迭代(Node.js@0.10版本即提供支持),普遍運用於騰訊QQ瀏覽器、騰訊桌面瀏覽器、騰訊地圖、應用寶、騰訊手機管家、互聯網+、騰訊醫療、騰訊覓影、保險、彩票等幾十個重要業務中。node
Tars.js 2.0 發佈如下 9 大特性: 100% 由 JavaScript 編寫,不包含任何 C/C++ 代碼。 多進程負載均衡與管理。 代碼異常監控與重啓。 服務日誌蒐集與處理。 HTTP(s) 監控與上報,並支持自定義上報。 符合 Tars IDL 編解碼規範。 支持 Tars RPC 調用與染色功能。 支持管理命令發送以及服務配置拉取。 首創 LongStackTrace 異常跟蹤機制。 …… 更多特性可訪問 @tars/node-agent 瞭解git
Tars.js 2.0 三大設計理念:github
» 高自由度: 兼容全部(≥0.10)官方 Node.js 版本。 對 Node.js 源碼無侵入無修改。 底層對上層徹底透明,支持各類上層框架,無需變動。 也就是說: 您可使用任何您熟悉的框架(如 Express.js / Koa.js 等,包括但不只限於 Web 框架),也無需對框架進行任何修改(無需引入任何中間件)。便可經過 Tars.js 運行,享受平臺提供的各類監控與管理特性。 與此同時,Tars.js 所提供的模塊,也能夠根據您的需求引入(如未使用到則可不引入)。正則表達式
» 高性能: Tars.js 爲高性能與大併發量而設計,使用了大量的前端(V8)優化技巧(如 FlattenString/FastProperties 等)儘可能下降所提供的能力對於業務性能的影響。 通過咱們測試(Web Server),默認的旁路上報與監控對服務性能的影響≤ 5%,經常使用模塊(RPC、日誌等)性能位於業界前列。後端
» 差別化: Tars.js 根據不一樣的業務類型提供差別化運營方案: 高流量業務:盡力下降框架對業務性能的影響。 低流量業務:充分利用硬件資源提高開發體驗。瀏覽器
"Hello World" 經過 Tars.js 來部署您的代碼,可直接擁有下文全部特性,而無修修改任何代碼。 架構
(甚至於 Node.js 官網 例子,均可以直接運行)併發
✓ 進程管理 默認基於 cluster 模塊進行負載均衡,進程數能夠配置爲1~max(CPU核心數)、還可配置爲 auto(物理核心數相同)以減少內存壓力提高「性價比」。 與此同時,進程僵死檢測也會同時啓動,實時監控業務進程。 » 案例說明 某服務在論壇 UBB 代碼轉 HTML 時,使用未優化的正則表達式進行 XSS 攻擊過濾,但因爲用戶發帖時圖片採用 BASE64 編碼,致使正則表達式計算時間過長,CPU 使用率飆漲到100%: app
開啓僵死檢測後,Tars.js 監控到業務進程僵死時,自動重啓業務進程,從而縮短了業務無響應時間: Tars.js 雖然沒法解決業務代碼的問題(BUG),但會盡最大努力保證業務的可用性。
✓ 服務監控 以服務名、接口名(URL-PATH 節)爲緯度,統計總流量、平均耗時、超時率、異常率:
其中返回碼大於 400 (可配置)做爲異常進行上報。 » 監控說明 Web 服務通常由靜態與動態資源(接口)組成,因爲靜態資源(本地文件)的請求耗時遠低於動態資源(業務邏輯),請求量每每又很高,拉低了服務總體耗時。 基於此,Tars.js 將請求 URL 中的 PATH 節做爲接口,每一個接口都可查看其總流量、平均耗時、異常率,便於用戶全面瞭解服務性能。
✓ 特性監控 不管您服務的類型是什麼,老是會上報下述特性,便於回溯問題與評估性能: memUsage:內存用量,將會上報 rss、heapUsed、heapTotal 這三個用量(單位爲字節) cpuUsage:CPU用量,將會上報CPU使用率,數據彙總爲邏輯單核(單位爲百分比) eventloopLag:(任務)隊列延遲,每隔2秒採樣(單位爲毫秒) 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 所提供的模塊(以下)實現: @tars/rpc : Tars RPC 調用模塊。 @tars/stream : Tars(Tup) 協議編解碼模塊。 @tars/logs:日誌組件,包含(按大小、時間)滾動與遠程日誌。 @tars/config:用於在線獲取服務配置文件。 @tars/monitor:提供服務監控、特性監控與PP監控上報支持。 @tars/notify:用於服務(告警)消息上報。 @tars/utils:輔助工具集合,包含 Tars 配置文件與 Tars RPC Endpoint 解析器。 @tars/dyeing:Tars RPC 染色定義模塊。 每一個模塊(點擊名稱跳轉)均有極爲詳細的文檔(README)方便您在任什麼時候候查閱。
在 Tars.js 的世界裏,您只須要專一於業務代碼,餘下的交給 Tars.js。
Github 開源地址: https://github.com/tars-node/Tars.js https://github.com/Tencent/Tars
做者介紹 @SuperZheng,騰訊 Tars 開源項目核心貢獻者,主要負責 Node.js 語言在 Tars 框架內的基礎運行架構開發,來自於騰訊 QQ 瀏覽器 [SuperTeam] 的全棧架構師,熟知 Web(3D) 、終端、後端與大數據計算。