腾讯开源大规模 Node.js 微服务框架 Tars.js
2018-07-25 来源:oschina
随着互联网的发展,越来越多的业务不仅仅由单一节点(或是单一语言)就可承载,而是趋向多语言分布式协同开发(如接入层由 Node.js 完成,逻辑(数据)层由 C++/GO/Python 实现)并由此组成大型异构系统。
我们(现 SuperTeam)基于 Tars 体系研发出 Tars.js 以便用户在不改变异构系统整体架构的情况下快速搭建(迁移) Node.js 服务,并可非常方便的将原来的单一服务拆分为多个(逻辑)子服务。
Tars.js 包含下述特性:
100% 由 JavaScript 编写,不包含任何 C/C++ 代码。
多进程负载均衡与管理。
代码异常监控与重启。
服务日志搜集与处理。
HTTP(s) 服务监控与用量自动上报,并支持用户自定义维度上报(PP 监控)。
符合 Tars(IDL) 规范的编解码模块。
支持 Tars RPC 调用与染色(模调自动上报)。
支持在线发送管理命令、拉取服务配置。
独创 LongStackTrace? 异常跟踪机制。
…… 更多特性可访问 @tars/node-agent 了解
设计理念
高自由度
兼容所有(≥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
我们来看 Node.js 官网的 例子 (如下),无需任何变更,直接通过 Tars.js 进行部署,它会拥有哪些特性?
? 进程管理
默认基于 cluster 模块进行负载均衡,进程数可以配置为1~max(CPU核心数)、还可配置为%20auto(物理核心数相同)以减小内存压力提升“性价比”。
与此同时,进程僵死检测也会同时启动,实时监控业务进程。
? 案例说明
某服务在论坛%20UBB%20代码转%20HTML%20时,使用未优化的正则表达式进行%20XSS%20攻击过滤,但由于用户发帖时图片采用%20BASE64%20编码,导致正则表达式计算时间过长,CPU%20使用率飙涨到100%:
开启僵死检测后,Tars.js%20监控到业务进程僵死时,自动重启业务进程,从而缩短了业务无响应时间:
Tars.js 虽然无法解决业务代码的问题(BUG),但会尽最大努力保证业务的可用性。
? 服务监控
以服务名、接口名(URL-PATH%20节)为纬度,统计总流量、平均耗时、超时率、异常率:
其中返回码大于%20400%20(可配置)作为异常进行上报。
? 监控说明
Web%20服务一般由静态与动态资源(接口)组成,由于静态资源(本地文件)的请求耗时远低于动态资源(业务逻辑),请求量往往又很高,拉低了服务整体耗时。
基于此,Tars.js%20将请求%20URL%20中的%20PATH%20节作为接口,每个接口均可查看其总流量、平均耗时、异常率,便于用户全面了解服务性能。
? 特性监控
无论您服务的类型是什么,总是会上报下述特性,便于回溯问题与评估性能:
memUsage:内存用量,将会上报%20rss、heapUsed、heapTotal%20这三个用量(单位为字节)
cpuUsage:CPU用量,将会上报CPU使用率,数据汇总为逻辑单核(单位为百分比)
eventloopLag:(任务)队列延迟,每隔2秒采样(单位为毫秒)
libuv:I/O用量,将会上报%20activeHandles、activeRequests%20这两个用量
各策略以平均值(Avg)、最大值(Max)、最小值(Min)分节点进行统计:
? 日志输出
所有通过%20Console%20模块(如%20console.log)输出的日志,都会输出到服务本地文件内。并附加相关信息(如下),方便定位问题。
日志格式:日期时间|进程PID|日志级别|输出文件名与行号|日志内容
2018-07-01%2012:00:00|332|DEBUG|app.js:13|Server%20running%20at%20http://127.0.0.1:3000/
? LongStackTrace?
由于%20Node.js%20采用异步机制,在发生异常时堆栈不完整,导致定位问题复杂。
鉴于此,我们提供了长链路跟踪技术在产生异常时自动附加前序调用堆栈,同时还支持在异常堆栈中过滤出用户代码部分。
由于开启此特性时会造成性能损耗,故默认关闭,管理平台等性能不敏感业务可直接通过配置开启。
? 案例说明
执行上述代码会抛出下述异常:
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/registry:用于 Tars 名字服务查询(Servant ===> Endpoint)。
每个模块(点击名称跳转)均有极为详细的文档(README)方便您在任何时候查阅。
总之在 Tars.js 的世界里,您只需要专注于业务代码,余下的交给 Tars.js。
Github 开源地址:
github.com/tars-node/Tars.js
公有云地址:
tars.tencent.com/
github.com/Tencent/Tars
请给 Tars/Tars.js 一个 Star/Watch !
并提出你的 Issue 与 PR。
团队介绍
SuperTeam 来自于腾讯 QQ 浏览器前端团队,由 @SuperZheng 创立于 2017 年。 团队成员均为全栈架构师(Super 寓意 Superman —— 无所不能),熟知 Web(3D) 、终端、后端与大数据计算,并由传统前端向互联网从业者方向发展。 欢迎前端牛人加入,共创前端美好未来。
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。