腾讯 Node.js 非侵入开发框架 Tars.js 2.0 正式发布

随着互联网的发展,越来越多的业务不仅仅由单一节点或是单一语言就可承载,而是趋向多语言分布式协同开发,例如接入层由 Node.js 完成,逻辑以及数据层由 C++/GO/Python 实现,并由此组成大型异构系统。

基于 Tars 体系研发出 Tars.js 以便用户在不改变异构系统整体架构的情况下快速搭建及迁移 Node.js 服务,并可非常方便的将原来的单一服务拆分为多个逻辑子服务,并在腾讯内支撑起了上百亿的流量。

Tars.js 在腾讯内部经过 5 年多的沉淀与迭代(Node.js@0.10版本即提供支持),广泛运用于腾讯QQ浏览器、腾讯桌面浏览器、腾讯地图、应用宝、腾讯手机管家、互联网+、腾讯医疗、腾讯觅影、保险、彩票等几十个重要业务中。


Tars.js 2.0 发布以下 9 大特性:

  • 100% 由 JavaScript 编写,不包含任何 C/C++ 代码。
  • 多进程负载均衡与管理。
  • 代码异常监控与重启。
  • 服务日志搜集与处理。
  • HTTP(s) 服务监控与用量自动上报,并支持用户自定义维度上报(PP 监控)。
  • 符合 Tars(IDL) 规范的编解码模块。
  • 支持 Tars RPC 调用与染色(模调自动上报)。
  • 支持在线发送管理命令、拉取服务配置。
  • 独创 LongStackTrace™ 异常跟踪机制。
  • …… 更多特性可访问 @tars/node-agent 了解

Tars.js 2.0 三大设计理念:

» A.高自由度:

  • 兼容所有(≥0.10)官方 Node.js 版本。
  • 对 Node.js 源码无侵入无修改。
  • 底层对上层完全透明,支持各种上层框架,无需变更。

也就是说:

您可以使用任何您熟悉的框架(如 Express.js / Koa.js 等,包括但不仅限于 Web 框架),也无需对框架进行任何修改(无需引入任何中间件)。即可通过 Tars.js 运行,享受平台提供的各种监控与管理特性。

与此同时,Tars.js 所提供的模块,也可以根据您的需求引入(如未使用到则可不引入)。

» B.高性能:

Tars.js 为高性能与大并发量而设计,使用了大量的前端(V8)优化技巧(如 FlattenString/FastProperties 等)尽量降低所提供的能力对于业务性能的影响。

经过我们测试(Web Server),默认的旁路上报与监控对服务性能的影响≤ 5%,常用模块(RPC、日志等)性能位于业界前列。

» C.差异化:

Tars.js 根据不同的业务类型提供差异化运营方案:

  • 高流量业务:尽力降低框架对业务性能的影响。
  • 低流量业务:充分利用硬件资源提升开发体验。

“Hello World”

通过 Tars.js 来部署您的代码,可直接拥有下文所有特性,而无修修改任何代码

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

(甚至于 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 节作为接口,每个接口均可查看其总流量、平均耗时、异常率,便于用户全面了解服务性能。

✓ 特性监控

无论您服务的类型是什么,总是会上报下述特性,便于回溯问题与评估性能:

  • 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|1332|DEBUG|app.js:13|Server running at http://127.0.0.1:3000/

✓ LongStackTrace™

由于 Node.js 采用异步机制,在发生异常时堆栈不完整,导致定位问题复杂。

鉴于此,我们提供了长链路跟踪技术在产生异常时自动附加前序调用堆栈,同时还支持在异常堆栈中过滤出用户代码部分。

由于开启此特性时会造成性能损耗,故默认关闭,管理平台等性能不敏感业务可直接通过配置开启。

» 案例说明

Promise.resolve(1).then(val => {
    setTimeout(()=>{
        try {
            ThisMayThrowError;
        } catch(err) {
            console.error(err);
        };
    }, 1000);
});

执行上述代码会抛出下述异常:

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 染色定义模块。

在 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) 、终端、后端与大数据计算。

原文发布于微信公众号 - 腾讯开源(tencentopen)

原文发表时间:2018-08-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

谈谈分布式事务之四: 两种事务处理协议OleTx与WS-AT

在年前写一个几篇关于分布式事务的文章,实际上这些都是为了系统介绍WCF事务处理体系而提供的相关的背景和基础知识。今天发最后一篇,介绍分布式事务采用的两种协议,即...

21680
来自专栏雨过天晴

初窥dep

74880
来自专栏腾讯开源的专栏

腾讯与阅文技术合作 微服务框架 Tars 再添 PHP

TARS 作为由腾讯公司开源的优秀 RPC 框架与服务部署运维解决方案,被阅文集团引入了实际实践中,同时阅文集团对 TARS 在 PHP 语言层面进行了能力的补...

51010
来自专栏小白课代表

百度有广告?电影没处下?网页不让复制?贴吧页面太丑?今天课代表全方位强化你的浏览器。

在百度搜索了某个问题却发现第一页都是广告?好不容易找到了一篇文档却发现不让复制?在豆瓣看到一个评分很高的电影,想看却找不到资源?看到一张图片还要打开才能看高清大...

19020
来自专栏腾讯Bugly的专栏

《手Q Android线程死锁监控与自动化分析实践》

手Q每个版本上线以后研发同学都会收到各种问题反馈。在跟进手Q内部用户反馈的问题时,发现多例问题,其表象和原因如下:

1.1K80
来自专栏腾讯Bugly的专栏

Android 插件技术实战总结

前言 安卓应用开发的大量难题,其实最后都需要插件技术去解决。 现今插件技术的使用非常普遍,比如微信、QQ、淘宝、天猫、空间、携程、大众点评、手机管家等等这些大家...

39560
来自专栏大宽宽的碎碎念

你对Redis的使用靠谱吗?Redis的性能高,吗?Redis可以保证原子性,吗?用Redis可以实现事务,吗?用Redis可以当队列,吗?Redis适合用来做什么?

684100
来自专栏jojo的技术小屋

原 荐 如何扒视频

94150
来自专栏iOSDevLog

应用程序内购买教程:入门

更新说明:Pietro Rea为Xcode 10,Swift 4.2和iOS 11/12更新了本教程。Ray Wenderlich写了原文。

34120
来自专栏腾讯移动品质中心TMQ的专栏

流量都去哪儿了 —— 三板斧搞定Android网络流量测试

流量是什么? 为什么要进行流量测试? 流量测试方法有哪些? 怎么统计流量并进行结果分析? 带着这些疑问,小编带您探寻Android网络流量的测试方法。 1 ...

53360

扫码关注云+社区

领取腾讯云代金券