随着互联网的发展, 越来越多的业务不仅仅由单一节点 (或是单一语言) 就可承载, 而是趋向多语言分布式协同开发 (如接入层由 Node.js 完成, 逻辑(数据) 层由 C++/GO/Python 实现)并由此组成大型异构系统.
我们 (现 SuperTeam) 基于 Tars http://tars.tencent.com/ 体系研发出 https://github.com/tars-node/Tars.js 以便用户在不改变异构系统整体架构的情况下快速搭建 (迁移) Node.js 服务, 并可非常方便的将原来的单一服务拆分为多个(逻辑) 子服务.
Tars.js 在腾讯内部经过 5 年多的沉淀与迭代(Node.js@0.10 版本即提供支持), 广泛运用于腾讯 QQ 浏览器, 腾讯桌面浏览器, 腾讯地图, 应用宝, 腾讯手机管家, 互联网 +, 腾讯医疗, 腾讯觅影, 保险, 彩票等几十个重要业务中, 日承担了上百亿流量.
Tars.js 包含下述特性:
l 100% 由 JavaScript 编写, 不包含任何 C/C++ 代码.
l 多进程负载均衡与管理.
l 代码异常监控与重启.
l 服务日志搜集与处理.
l HTTP(s) 服务监控与用量自动上报, 并支持用户自定义维度上报(PP 监控).
l 符合 Tars(IDL) 规范的编解码模块.
l 支持 Tars RPC 调用与染色(模调自动上报).
l 支持在线发送管理命令, 拉取服务配置.
l 独创 LongStackTrace 异常跟踪机制.
l ...... 更多特性可访问 https://www.npmjs.com/package/@tars/node-agent 了解
设计理念:
» A.高自由度:
l 兼容所有 (0.10) 官方 Node.js 版本.
l 对 Node.js 源码无侵入无修改.
l 底层对上层完全透明, 支持各种上层框架, 无需变更.
也就是说:
您可以使用任何您熟悉的框架(如 Express.js / Koa.js 等, 包括但不仅限于 web 框架), 也无需对框架进行任何修改(无需引入任何中间件). 即可通过 Tars.js 运行, 享受平台提供的各种监控与管理特性.
与此同时, Tars.js 所提供的模块, 也可以根据您的需求引入(如未使用到则可不引入).
» B.高性能:
Tars.js 为高性能与大并发量而设计, 使用了大量的前端 (V8) 优化技巧 (如 FlattenString/FastProperties 等) 尽量降低所提供的能力对于业务性能的影响.
经过我们测试 (Web Server), 默认的旁路上报与监控对服务性能的影响 5%, 常用模块(RPC, 日志等) 性能位于业界前列.
» C.差异化:
Tars.js 根据不同的业务类型提供差异化运营方案:
l 高流量业务: 尽力降低框架对业务性能的影响.
l 低流量业务: 充分利用硬件资源提升开发体验.
Hello World
我们来看 Node.js 官网的 例子 http://nodejs.org/en/about/ (如下), 无需任何变更, 直接通过 Tars.js 进行部署, 它会拥有哪些特性?
进程管理
默认基于 https://nodejs.org/dist/latest-v10.x/docs/api/cluster.html 模块进行负载均衡, 进程数可以配置为 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 https://www.npmjs.com/package/@tars/rpc : Tars RPC 调用模块.
l https://www.npmjs.com/package/@tars/stream : Tars(Tup) 协议编解码模块.
l https://www.npmjs.com/package/@tars/logs : 日志组件, 包含 (按大小, 时间) 滚动与远程日志.
l https://www.npmjs.com/package/@tars/config : 用于在线获取服务配置文件.
l https://www.npmjs.com/package/@tars/monitor : 提供服务监控, 特性监控与 PP 监控上报支持.
l https://www.npmjs.com/package/@tars/notify : 用于服务 (告警) 消息上报.
l https://www.npmjs.com/package/@tars/utils : 辅助工具集合, 包含 Tars 配置文件与 Tars RPC Endpoint 解析器.
l https://www.npmjs.com/package/@tars/dyeing :Tars RPC 染色定义模块.
每个模块 (点击名称跳转) 均有极为详细的文档 (README) 方便您在任何时候查阅.
总之在 Tars.js 的世界里, 您只需要专注于业务代码, 余下的交给 Tars.js.
Github 开源地址:
https://github.com/tars-node/Tars.js
公有云地址:
- https://tars.tencent.com/
- https://github.com/Tencent/Tars
请给 Tars/Tars.js 一个 Star/Watch !
并提出你的 Issue 与 PR.
团队介绍
SuperTeam 来自于腾讯 QQ 浏览器前端团队, 由 @SuperZheng http://superzheng.com/ 创立于 2017 年. 团队成员均为全栈架构师(Super 寓意 Superman -- 无所不能), 熟知 Web(3D) , 终端, 后端与大数据计算, 并由传统前端向互联网从业者方向发展. 欢迎前端牛人加入, 共创前端美好未来.
来源: https://juejin.im/post/5b56f7d7f265da0f6d72dadb