干货 | 浅谈Node.js在携程的应用

干货 | 从智行 Android 项目看组件化架构实践 作者简介陈杰,智行火车票高级开发工程师,目前主要负责智行火车票 Android 客户端的架构和公共基础业务开发,热衷于 Android 技术的研究和开源分享。一、前言智行... 阅读详情

作者简介

潘斐斐,携程无线平台研发部高级研发工程师。2008年加入携程,目前负责携程Node.js技术栈的基础平台研发工作。


携程在2017年9月份正式上线了Node.js应用,本文主要介绍近两年Node.js技术栈在携程的应用和体系情况。


一、技术栈



1.1 应用部署


640?wx_fmt=png

 

应用部署主要分为以上四个步骤:Develop-> Build ->Release -> Publish


  • Coding阶段会使用脚手架和中间件开发应用,中间件后面会介绍到。

  • Build Docker会负责源码的构建功能,包括一些C++模块的编译和集成环境,同时会设置构建的缓存机制。

  • Release Docker负责应用的启动和运行,相对轻量级,更需要关注的是Docker的数量、CPU、内存等基础信息。

  • Publish负责应用启动之后的健康检查,健康检查完成之后会将Docker拉入集群并提供外部访问。

 

1.2 版本选择


在Build阶段,会选择Node.js的版本。提供了三个固定版本分别是v6.10.2,v8.9.4 和 v10.15.1。目前 v6.10.2 版本已经基本进入非维护阶段,并逐步更新下线,版本的更迭与Node.js官方几乎保持同步,为保证性能最优,推荐优选最新的LTS。


当时选择Node.js固定版本是考虑到编译环境的简单和稳定性。Node.js中间件和第三方库都需要做预编译,为了保证编译环境的简单和应用稳定,会选择固定的某一个版本。


同时针对这3个固定的版本,中间件发布的时候,也会一并提供window/linux/mac这3个平台预编译的包。Linux预编译包是为了Build Docker和Release Docker准备的,windows和mac预编译的包是为了开发工程师本地开发的时候准备的。


640?wx_fmt=png


1.3 构建原则


“靠前构建原则”

 

如果能在线下编译的尽量线下编译,不要在运行构建。例如:


  • C++模块的预编译

  • 访问SOA或者数据库的环境配置

  • Babel或者TS

 

二、运维与监控



2.1 Docker化


Node.js应用部署在Docker上,采用Nginx+PM2的模式。

 

2.2 核心指标


640?wx_fmt=png

 

Nginx会监控整个Docker上所有应用的情况:


1)CPU util:CPU总的使用率

2)CPU throttle count&time:CPU被限制的次数和CPU使用率被限制的总时间。这两个指标的上升一般表示应用有CPU密集型操作,需要检查一下是否有大量的计算等操作。

3)Mem RSS used:这个指标上升一般显示应用内存泄漏的问题。

4)HTTP imcoming&outgoging:http request的数量变化趋势。如果有错误响应或者超过了告警的阈值,则会在趋势图中显示。

5)Connection reset:这个指标如果上升,表示应用出现了大量的拒绝请求,例如是服务器的并发数超过了原本的承载量等原因。


Nginx中监控的是整个Docker的情况,但是我们更需要的是监控应用的指标。


应用一般采用PM2 cluster – i max模式启动,最大化利用CPU。


1)Heartbeat(心跳信息)


每个worker一分钟发送一次Heartbeat(心跳信息)给到CAT数据中心。一般来说,如果Heartbeat告警的话,需要立刻查看一下错误日志,是不是有异常错误导致进程已经退出了。


Heartbeat主要包括CPU、Memory、网络信息等。这些信息和上述提到的Nginx信息不是一个维度的。这个更细节的关注了应用的情况,而不是整个Docker的情况。如果需要分析应用细节的问题,是需要查看这里的Heartbeat信息。


2)性能情况


一般来说,中间件会处理应用常规的性能日志记录。包括:


  • 每一个响应的请求耗时(服务端逻辑处理耗时,不包括网络耗时)

  • 每一个Transaction的耗时。一个Transaction可以简单理解为一个有功能意义的代码片段。

  • 跨应用调用的请求耗时

 

3)错误/告警信息


错误告警信息是应用中需要重点关注的,包括:


  • 应用逻辑出错,例如处理JSON数据出错等。

  • HTTP请求出错,会记录状态码、请求地址、返回内容

  • 应用中使用了不同版本的同一个包,会报一条告警信息通知开发工程师


4)详细数据日志


详细数据日志一般有开发工程师针对应用的逻辑埋点,而非中间件统一处理。这些日志会包括返回数据的记录,具体运行在哪一段transaction中。这些日志一般是故障发生时,用来复盘时的辅助手段。

 

2.3 监控模型


一开始的监控日志是扁平化的,只能看到一条一条简单的日志,但无法将他们的关系串联起来。为了方便排障,设计了调用树的模型,可以将应用中的多个transaction串联起来。


640?wx_fmt=png


2.4 日志排障


应用发布上线后,需要关注系统的保障通知。经常遇到的故障是发现随着时间的推移,Mem RSS Used这根线会不停的飙升。

 

640?wx_fmt=png

 

遇到这种情况,基本猜测是发生了Memory-Leak(内存泄漏)。我们需要分析heapdump来定位具体的问题点。

 

不建议在应用中定期发送heapdump的信息来监控,比较消耗内存。所以我们一般在发布到测试阶段,发现问题之后,采样几个不同时间点heapdumpsnapshot进行比对。使用的是开源的heapdump。

 

首先将两份snapshot文件加载到chrome中,查看statistics,对比这里的内存变化和Docker中的内存变化。


640?wx_fmt=png

 

如果两者的变化一致,那么就说明内存泄漏的确发生在Heap区域,那么就可以进行两份snapshot的对比。


640?wx_fmt=png


如果两者变化不一致,Docker变化量明显比Heapdump的多,那么就说明内存泄漏可能出现非Heap区域(堆外内存区域),需要查看一下snapshot中Buffer的数量是否有变化,是不是buffer导致的,或者查看一下Node.js的官方的changelog是否有提到memory issue。


三、公共服务



3.1 服务调用


SOA client:SOA客户端主要负责调用JAVA/.NET/Node.js等各技术栈的SOA服务。主要服务于数据聚合的场景。

 

3.2 存储服务


1)Ceph(资源存储客户端),主要存储静态资源,包含JS/CSS/图片等;

2)Redis(Redis客户端),为应用提供Redis缓存服务;

3)Kafka (消息系统)     消息生产者和消费者;

 

3.3 缓存服务


缓存中间件Cache主要解决以下问题:


实现跨进程共享内存和跨进程锁。(参考开源模块node-shared-cache )


3.4 公共业务

1)监控模块目前携程Node.js支持三种场景的日志


  • 场景一:CAT日志埋点,树状结构展示日志,监控服务运行快慢、监控异常、以及自定义事件监控告警。目前携程CAT已开源 CAT

  • 场景二:可通过特定事件、特定时间、特定tag值过滤查询日志

  • 场景三:可基于时间序列查看各种性能数据聚合结果,如统计某个中间件使用次数、某请求结果的平均值等。

 

2)foundation-framework基础模块


  • 为不同环境下所有应用提供统一的获取AppId、环境等基础配置的API

  • 提供IPv4、IPv6的检查和IPv6的全地址转换

 

3)qconfig-client 该中间件支持从携程内部服务配置中心获取不同文件类型的配置,支持配置热更新。

 

4)携程Node.js还提供:获取mysql数据库连接信息、ABTest、pm2跨进程通讯等功能模块。


3.5 DR (Disaster Recovery)


为支持DR,nodeJS中间件做以下处理:


1)服务连接失败重试机制。

2)通过IP地址访问服务时,需定时重新获取服务IP地址。

3)同一服务存在多个IP地址时,依次通过不同IP地址访问服务,直到成功或全部失败。

4)特定数据缓存。


在某个服务器宕机或某个IDC机房毁坏情况下,目前nodeJS中间件大部分无需任何操作,可自动恢复;部分中间件需重启应用,以保证应用可用性和数据的实时性。


四、应用场景



4.1 DA(DataAggregation)


640?wx_fmt=png

图3 Introduction of BFF(Backend for Frontend)

(摘自https://www.jianshu.com/p/eb1875c62ad3)

 

DA这一层主要的功能是能够提升加载速度,降低重复的数据逻辑处理。


在DA之前,前端展示一般需要请求多条服务做数据聚合。更复杂的情况是,如果需要适配多个平台(Web/Android/IOS),那么就需要服务写多个接口,造成重复的开发和维护工作。


DA主要负责将数据做逻辑处理,包括缓存、展示限制等,为前端提供更轻量级的服务。

 

本着“服务自治,服务于UI”的原则,我们用前端工程师更熟悉的JavaScript开发是非常合适的选择,可以降低学习和开发成本,带来更大的灵活性和高效性。实践下来,引入了数据聚合层之后,性能提升在20%左右。

 

4.2 SSR(Server-SideRendering)


服务端在携程的引入主要考量有几点:


1)SEO的.NET+V8的老架构

2)SPA模式首屏性能问题

3)JS技术栈陈旧等诸多问题

4)不同平台重复编码,无法实现代码同构


所以设计一套SSR的框架来解决历史问题,最终带来了30%的开发效率提升和20%的性能优化。


目前携程的SSR框架是NFES,感兴趣的同学可以点击详细了解。

 

4.3 内部工具


Node.js技术栈的内部工具,主要在几个方向:


1)构建工具,例如发布平台中的Node.js应用的构建工具

2)跨平台的GUI的工具,一般基于electron框架开发

3)静态资源的发布


五、小结



经过一年多的积累,携程已经上线500+的应用。这一年多,我们比较关注的方向是中间件建设和应用性能的监控优化,后续将计划实践一些Node.js技术栈的框架建设和工程化方向,希望能通过更稳定的基础设施,探索新的应用场景,提升开发效率。


【推荐阅读】



640?wx_fmt=jpeg

rk3588s-摄像头适配gc8034 若还打开失败,需要看下XML中文件配置是否与DTS配置信息一致,或者XML参数配置是否有异常;MIPI摄像头是有上电时序要求,具体时序要查看sensor芯片对应的datasheet进行修改,如果时序不满足,sensor无法正常,此时用i2ctool去查看设备可能无法扫面到设备,即是i2c设备找不到。RK3588或者RK3588S有路MIPI-PHY,驱动开发工程师需要根据对应的硬件原图进行配置,以下会讲解分别使用MIPI-DPHY和MIPI-D/CPHY如何在DTS配置mipi摄像头的回环链路。 阅读详情

相关推荐

跨厂商网络设备的RADIUS认证:Windows NPS的兼容性与最佳实践

本文详细探讨了Windows NPS在多厂商网络环境中的RADIUS认证实践,特别针对华为、华三、思科等主流设备的兼容性问题提供解决方案。从基础配置到高级优化,涵盖VSA属性映射、认证协议选择及安全加固措施,帮助企业实现统一身份认证并提升网络安全性。

weixin_29213827的博客 421

干货 | 响应式设计在携程火车票的应用

作者简介永利,携程开发经理,专注于Web领域的探索。一、什么是响应式设计?可能很多人脑海中已经出现了这样一个动画,当浏览器中页面尺寸不断变化时,内容也在随之变化。简单说,响应式网站设计...

携程技术 449

清华电子系保研面试全记录:五轮硬核考核+工程硕博专项解析(附真题)

本文详细解析了清华大学电子工程系保研面试的完整流程,重点剖析了其标志性的五轮专业面试(涵盖电路、电磁场、信号系统、计算机与AI)和综合组群面,并深入解读了工程硕博改革专项的考核要点与备战策略。文章提供了各专业组的真题示例与应对方法,旨在帮助电子信息相关专业学子系统准备,从容应对这场高强度的知识与综合素质挑战。

u0v1w2x3的博客 587

干货 | 携程小程序内嵌webview实践指南

作者简介思语,携程高级前端开发工程师,关注互动营销领域;Olivio,携程高级前端开发工程师,关注React Node 组件化;Stone,携程高级研发经理,关注跨端解决方案,云原生落地等领域。一、背景这篇文章将向大家分享团队在小程序 webview 方面的开发心得,以微信小程序为主要环境,介绍在业务开发中处理小程序webview内嵌H5所遇到的问题及解决方案。具体将从小程序平台与H5差异、小程序...

携程技术 2771

MATLAB实战:手把手教你搭建构网逆变器同步稳定性仿真模型(附避坑指南)

本文详细介绍了如何在MATLAB/Simulink平台上搭建构网逆变器同步稳定性仿真模型,涵盖从基础模块配置到虚拟同步机控制实现的完整流程。针对电力电子工程师常见的控制参数整定困难、仿真结果偏差等问题,提供了LCL滤波器谐振抑制、虚拟惯量优化等关键技术解决方案,并附有避坑指南和工程实践技巧,助力研究者高效完成仿真建模。

weixin_29051193的博客 297

python 爬取携程旅游景点评论

python爬取携程旅游景点评论 爬取网址:https://you.ctrip.com/ 爬取评论全部代码 ##全部代码 代码片. import requests import json import re import time import pandas as pd # 转换毫秒时间戳 1.转换成localtime 2.转换成新的时间格式(精确到秒) def trans(timestamp): time_local = time.localtime(int(timestamp) / 1000)

qq_41487749的博客 4624

Roboflow 与 YOLOv11 数据集全流程:从获取到训练,让你数据无忧

上传图像:点击“Upload”按钮,批量上传本地图像(支持 JPG、PNG 格式,单张最大 10MB)。智能标注:利用 Roboflow 的“Auto-Annotate”功能,基于预训练模型自动生成标注,再手动微调,标注效率提升 70%。格式导出:标注完成后,同样选择“YOLOv11”格式导出,流程与公开数据集一致。

m0_71589036的博客 271

Node.js在携程的落地和最佳实践

但同时他们也是有差异的,例如 Desktop Tools 和 Web Application 的应用模型不一样, Desktop 有 UI 层,那么 UI 层和应用层上的应用日志和用户行为如何关联,方便后续的排障;一般我们排查问题的时候,会先通过 Metric 的聚合指标发掘出异常,然后追踪到某一批有异常的 Tracing,可以查看到调用链、耗时等具体情况,也可以跟踪到某一个请求,查看里面的事件埋点。也有其他方式的排障,例如下图中展示,可以在线直接通过一个特殊的地址访问到的一张火焰图,非常迅速地排障。

油墨香^-^的博客 743

【ComfyUI】Wan2.2 Animate 动作迁移重绘视频生成

本文介绍了一个基于ComfyUI的Wan2.2 Animate视频生成工作流,通过动作迁移和视频重绘技术实现高质量视频创作。该系统融合视频帧重建、动作迁移、图像重绘和音频合成等多种AI技术,核心采用Wan2.2 Animate 14B_fp8模型配合专属VAE解码器和LoRA微调模块。工作流程包含输入预处理、模型加载、特征提取、动作采样生成、解码输出和资源清理六个阶段,通过WanVideo系列节点实现从图像/视频输入到最终视频输出的完整处理。系统支持对参考图像进行视觉特征提取和嵌入生成,结合文本/动作嵌入进

Mr数据杨 2444

训练YOLOv11 | Pytorch和Pycharm的安装教程适用W11系统(附详细的系统变量添加过程)

根据你之前下载的版本选择对应的选项即可,然后复制底下的绿色代码到Anaconda的命令行输入即可(这里要在你安装的python环境里进行安装,例如我的环境名字是PyTorch,那么就是activate PyTorch里进行安装)然后同之前一样会加载一会,然后会询问我们是否下载配件,我们输入Y等待即可(下载过程中我们要确保网络通常如果有波动可能会下载失败)。类似于我的电脑是Windows11选择上面红框内的选项即可点击后即下载,(注意这里下载的是zip文件)下载完成后复制下面几个文件。

Snu77的博客 1万+

js 点击选择前和选择后的数据对比_干货 | 浅谈Node.js在携程的应用

作者简介潘斐斐,携程无线平台研发部高级研发工程师。2008年加入携程,目前负责携程Node.js技术栈的基础平台研发工作。携程在2017年9月份正式上线了Node.js应用,本文主要介绍近两年Node.js技术栈在携程的应用和体系情况。一、技术栈1.1 应用部署应用部署主要分为以上四个步骤:Develop-> Build ->Release -> PublishCodi...

weixin_39883065的博客 307

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

js 怎么建立外部公共指标_干货 | 浅谈Node.js在携程的应用

作者简介潘斐斐,携程无线平台研发部高级研发工程师。2008年加入携程,目前负责携程Node.js技术栈的基础平台研发工作。携程在2017年9月份正式上线了Node.js应用,本文主要介绍近两年Node.js技术栈在携程的应用和体系情况。一、技术栈1.1 应用部署应用部署主要分为以上四个步骤:Develop-> Build ->Release -> PublishCodi...

weixin_31907553的博客 178

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

干货 | 你们要的PPT和视频@大前端工程实践沙龙

3月30日周六,“携程技术沙龙——大前端工程实践”在携程上海总部凌空SOHO如期举行。活动邀请了阿里、京东、陆金所、美团点评、腾讯、携程的8位技术大咖,分享了处于技术生命...

携程技术中心 707

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

2017-2018 年度个人阅读过的文章整理集

文章目录ReactReact NativeVueFlutterJavaScriptCSSHTMLNodeWebpackGitOthersChinese Documents React 【React & PWA】Twitter Lite and High Performance React Progressive Web Apps at Scale 【React & PWA】大型高...

__F5 410

javascript基础-多线程、携程

js任务分同步任务和异步任务。 在异步任务中,分为宏任务和微任务。 通常微任务的执行是在当前主线程宏任务执行完毕之前,当前没有可执行的微任务时,才会开启下一个宏任务。

quanxin0222的博客 1735

linux 内存性能评估工具 free/smem

内存监控命令free free命令输出中显示了系统的各种内存状态,具体包括物理内存和swap,物理内存中又分为已使用内存(used)、空闲内存(free)、共享内存(shared)、系统缓存(buff/cache)和目前可用内存(available)。 看下面一个输出:(它只能显示某一时刻的内存状态,不能做到实时的去显示)在Mem这行的输出中,其实是有个等式关系的: Used+free+buff/cache=total avaliable=buff/cache - shared,别看占用很多,当物理内存

小楼一夜听春雨,深巷明朝卖杏花 1550

深入解密Node共享内存:这个原生模块让你的多进程应用性能翻倍

但是尽管如此,其实NAN的跨版本是有局限性的,这个项目我想应该是历史原因使用的NAN,每个Node.js版本都需要重新编译,维护成本较高,分发和部署复杂。Node-API运行时兼容,无需多个版本分别编译,而且Node-API是Node项目中的一部分,不需安装模块。进程锁是一种同步机制,用于进程锁是一种同步机制,用于协调多个进程对共享资源的访问,确保在任何时刻只有一个进程可以访问该资源。Node-API 官方地址:https://nodejs.org/api/n-api.html。其核心价值在于解决了。

程序员成长指北 1012

node.js开发中遇到的问题(不定期更新)

1. 首先是让人头疼的数据库,遇到了无法连接mongodb的情况,Mongoose failed to connect to [localhost:27017]是因为我没装mongo Σ( ° △ °|||)︴,按照 http://www.cnblogs.com/mecity/archive/2011/06/11/2078527.html 一步步来才解决这个问题。

空気力学少女の诗 632

实测!undervolt在10款热门笔记本上的降压效果与稳定性报告

undervolt是一款专为Linux系统设计的Intel CPU降压工具,通过调整CPU电压平面、温度目标和功率限制,帮助用户在保证系统稳定的前提下降低功耗、减少发热。本文基于实际测试数据,分析undervolt在10款热门笔记本上的降压效果与稳定性表现,为Linux用户提供实用的硬件优化参考。 ## 为什么需要CPU降压? 现代笔记本CPU在出厂时通常留有一定的电压余量以确保稳定性,但这也

gitblog_01061的博客 646

Ceph RBD Docker 插件使用教程

Ceph RBD Docker 插件使用教程 1. 项目介绍 rbd-docker-plugin 是一个用于 Docker 的 Ceph RBD 卷驱动插件。它允许 Docker 容器使用 Ceph RBD(Rados Block Device)作为持久化存储。通过该插件,用户可以轻松地将 Ceph RBD 映像挂载到 Docker 容器中,实现数据的持久化存储和管理。 该插件支持 Docker ...

gitblog_00094的博客 619

JS渲染携程旅游并点击换----动态图

【代码】JS渲染携程旅游并点击换----动态图。

2302_79245293的博客 119

用js做点击切换携程旅游

【代码】用js做点击切换携程旅游。

2302_79245293的博客 790

redis info命令 memory内存信息说明

源文地址 https://www.runoob.com/redis/server-info.html memory : 内存信息,包含以下域: used_memory : 由 Redis 分配器分配的内存总量,以字节(byte)为单位 used_memory_human : 以人类可读的格式返回 Redis 分配的内存总量 used_memory_rss : 从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致。 used_memory_.

wejack的专栏 3362
上一篇: 携程是如何借助“预测式外呼”提高呼叫效率的
下一篇: 活动报名 | 新终端新技术应用实践,5月25日上海(免费)
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值