随着互联网的发展,越来越多的业务不再是单一节点或单一语言承载,而是趋向于多语言分布式协作开发,比如接入层由Node.js完成,逻辑和数据层由C++/GO/Python实现,从而形成一个庞大的异构系统。Tars.js是基于Tars体系开发的,让用户可以在不改变异构系统整体架构的情况下,快速搭建和迁移Node.js服务,并且非常方便的将原来的单一服务拆分成多个逻辑子服务,支持腾讯百亿级流量。经过腾讯内部5年多的沉淀和迭代(Node.js@0.10版本提供支持),Tars.js广泛应用于腾讯QQ浏览器、腾讯桌面浏览器、腾讯地图、应用宝、腾讯手机管家、互联网+、腾讯医疗、腾讯觅影、保险、彩票等数十项重要业务。Tars.js2.0发布了以下9大特性:?100%由JavaScript编写,不包含任何C/C++代码。?多进程负载均衡和管理。?代码异常监控和重启。?服务日志收集和处理。?HTTP(s)监控上报,支持自定义上报。?符合TarsIDL编解码规范。?支持TarsRPC调用和染色功能。?支持发送管理命令和拉取服务配置。?独创的LongStackTrace异常跟踪机制。?…更多特性请访问@tars/node-agent了解Tars.js2.0的三大设计理念:?高自由度:?兼容所有(≥0.10)官方Node.js版本。?不得侵入或修改Node.js源代码。?底层对上层完全透明,支持各种上层框架,无需任何改动。也就是说:你可以使用任何你熟悉的框架(如Express.js/Koa.js等,包括但不限于web框架),你不需要对框架做任何修改(无需引入任何中间件)。您可以通过Tars.js运行它,享受平台提供的各种监控和管理功能。同时,也可以根据需要导入Tars.js提供的模块(如果没有使用,可以不导入)。?高性能:Tars.js专为高性能和大并发而设计,大量使用前端(V8)优化技术(如FlattenString/FastProperties等),最大限度降低所提供能力对业务性能的影响.经过我们的测试(WebServer),默认绕过上报和监控对服务性能的影响≤5%,常用模块(RPC、日志等)性能处于业界前列。?差异化:Tars.js根据不同的业务类型,提供差异化??的运营方案:?大流量业务:尽量降低框架对业务性能的影响。?低流量业务:充分利用硬件资源,提升开发体验。《HelloWorld》通过Tars.js部署你的代码,无需修改任何代码,即可直接拥有以下所有功能。(连Node.js官网例子都可以直接运行)?进程管理默认基于集群模块的负载均衡。进程数可以配置为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:CPUusage,会上报CPU使用率,数据汇总为逻辑单核(百分比)?eventloopLag:(任务)队列延迟,每2秒采样一次(单位毫秒)?libuv:I/Ousage,activeHandles和activeRequests的使用情况会上报,每个策略会使用平均值(Avg)、最大值(Max)、最小值(Min)进行统计:?日志输出全部通过Console模块输出(如console.log)日志将输出到服务本地文件。并附上相关信息(如下),方便定位问题。日志格式:日期时间|进程PID|日志级别|输出文件名及行号|日志内容2018-07-0112:00:00|332|DEBUG|app.js:13|服务器运行于http://127.0.0.1:3000/?LongStackTrace由于Node.js采用异步机制,异常时栈不完整,导致定位问题复杂。鉴于此,我们提供了长链接追踪技术,在异常产生时自动附加前序调用栈,同时也支持过滤掉异常栈中的用户代码部分。由于开启该特性会造成性能损失,默认关闭,管理平台等对性能不敏感的服务可以直接通过配置开启。?案例描述执行以上代码会抛出如下异常:ReferenceError:ThisMayThrowErrorisnotdefinedatTimeout.setTimeoutas_onTimeoutatontimeout(timers.js:427:11)attryOnTimeout(timers.js:289:5)atlistOnTimeout(timers.js:252:5)在Timer.processTimers(timers.js:212:10)处,setTimeout的前序堆栈丢失,导致问题难以追踪。启用该功能(并过滤掉用户代码)后,上述代码抛出的异常(无需修改)会自动附加preordercallstack(如下):ReferenceError:ThisMayThrowErrorisnotdefinedatTimeout.setTimeout[as_onTimeout](test.js:4:13)atPromise.resolve.then.val(test.js:2:5)atObject.
