Node.js实战
01服务开发
Node.js适用场景
通用场景
- 通用的HTTP/RPC接口
- 通用的定时任务/队列消费任务
- 能够胜任的大部分的业务逻辑
优势场景
- BFF前端胶水层
- SSR服务端页面渲染
- 同构的Web应用
- 实时通信服务(websocket)
稳定性保障
如何判定一个服务的稳定性
稳定性的统计指标:SLA
- 3个9:99.9% = 8760 * 0.1% = 8760 * 0.001 = 8.76小时
- 4个9:99.99% = 8760 * 0.0001 = 0.876小时 = 0.876 * 60 = 52.6分钟
- 5个9:99.999% = 8760 * 0.00001 = 0.0876小时 = 0.0876 * 60 = 5.26分钟
性能的统计指标:
- 响应时间RTT
- 单位时间处理能力QPS/TPS
- 并发数Concurrency
- 错误率Error Rate
资源的统计指标
- CPU Load
- Memory Usage
- FD Count 文件描述符
- Disk Read/Write
- Network Send/Recv
在开发阶段保障服务稳定性
- 异常捕获
- 自动重启
- 健康检查
利用Node.js API获取指标
Node.js
内部process
模块提供了一些指标的API
CPU Usage
- user cpu time
- system cpu time
Memory Usage
- heapTotal/heapUsed
- external
- aeeray buffers
- rss
IO Usage
- fsRead / fsWrite
- ipcSent / ipcReceived
还可以通过系统指令来获取服务容器指标
-
top/htop
-
lsof -p xxx
-
vmstat 1
-
iostat 1
在服务框架或容器镜像内封装通用的实时上报指标metrics,收集数据并通过可视化看板展示,有助于我们时刻掌握当前服务的状态
02发布部署
早期部署方案
-
购买/租用服务器/公网IP域名
-
安装操作系统、搭建内网环境以及一系列基础设施工具
-
通过FTP/RSYNC等手段上传生产环境代码包
-
在对应路径下执行启动命令
-
早期通过
nohup
实现以daemon
方式运行nohup `NODE_ENV=production node test.js` 2>&1 & 复制代码
-
通过pm2/夸奖相关启动脚本运行
pm2 start app.js -i max 复制代码
-
-
购买域名,配置DNS,以及反向代理到服务下
IaaS/PaaS/FaaS的发展路线
IaaS
云计算的初级阶段
基础设施即服务(Infrastructure as a Service
)是云服务厂商提供消费者处理、存储、网络以及各种基础运算资源,以部署1与执行操作系统或应用程序等各种软件。
IaaS是云服务的最底层,主要提供一些基础资源。用户无须购买服务器、软件等网络设备,即可任意部署和运行处理、存储、网络和其他基本的计算资源,不能管控或控制底层的基础设施,但是可以控制操作系统、存储装置、已部署的应用程序。
虚拟主机/VPS代表产品
- AWS EC2
- Aliyun ECS
- 腾讯云 云服务器
技术实现
- 虚拟机KVM/OpenVZ/Hyper-V
- OpenStack
- Docker
PaaS:主流的应用托管发布形态
平台即服务(英语: Platform as a Service
,缩写:PaaS)是一种云计算服务,提供运算平台与解决方案。
PaaS 提供软件部署平台(runtime),抽象掉了硬件和操作系统细节,可以无缝地扩展(scaling)。开发者只需要关注自己的业务逻辑,不需要关注底层。
PaaS代表产品
- Google AppEngine
- Heroku
- AWS Elastic Beanstalk
- Vercel
技术实现
- Docker容器部署应用 / Docker Swarm
- Kubernetes
- 服务编排
- 弹性扩缩容
基于PaaS的发布流程
大多数PaaS平台都提供了Node.js
服务的运行支持
我们根据PaaS平台提供的Node.js Runtime
规范给应用编写
构建脚本(npm install)、启动脚本(npm start)以及应用配置脚本(app.yml)
基础Runtime
不满足应用要求时,PaaS
平台也支持通过Dockerfile
定制特殊的功能以
及启动命令
PaaS与DevOps
DevOps(Development和Operations的组合词)是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。
现代PaaS平台提供了基础的DevOps流程,通过绑定Git Branch实现自动化集成发布到Preview环境,极大地简化了发布测试上线的流程。
PaaS与自动扩缩容
得益于Kubernetes的能力,以及通用的PaaS应用Runtime现代PaaS服务支持定义实例的性能,并支持在请求激增、CPU/内存吃紧时快速扩容实例以及在请求量小、资源充裕时缩容,从而减少运维成本和服务费用当然,快速扩缩容的前提是在Runtime侧已经实现了性能指标监控与数据上报的能力。
Serverless
理念和产品
Serverless的理念
“Serverless computing is a cloud computing execution model in which the cloud provider allocates machine resources on demand, taking care of the servers on behalf of their customers. “
Serverless最佳形态:FaaS + BaaS
- FaaS (Lambda): “函数即服务”,是一种在无状态容器中运行的事件驱动型计算执行模型,这些函数将利用服务来管理服务器端逻辑和状态。它允许开发人员以功能的形式来构建、运行和管理这些应用包,无需维护自己的基础架构。
- AWS Lambda
- Google Cloud Function
- Aliyun 函数计算 FC
- 腾讯云函数
- BaaS: 后端即服务 (BaaS) 使开发人员可以专注于应用程序的前端,无需构建或维护后端服务即可利用。
- Google Firebase
FaaS实现(Lambda)的局限性
FaaS按量计费的原则在传统容器部署的技术方案下较难实现
- 容器冷启动+服务启动需要秒级的时间
- 常驻实例+待命模式可以保证首次访问的效率,则按量计费要求无法满足
Node.js 基于VM模块实现“高密度部署”
- 函数之间的隔离性?
- 死循环的恢复?
另辟蹊径: WASM/V8 Worker替代Node.js
- Deno Deploy
- Cloudflare Workers
- Wasm Edge
FaaS vs PaaS
- FaaS与PaaS在开发体验上的对比
- 函数模型过于简单
- 编写多个云函数的对工程化不友好
- 应用开发者更希望编写/发布一个完整的Node.js WebApp
Jamstack模式与Vercel的探索:将PaaS应用构建成若干FaaS函数后发布
03运维监控
日志埋点与监控报警
-
日志
- process.stdout / process.stderr
- send through udp socket
-
埋点报警
- Metrics
- Span
- Trace
线上问题排查
前置流程:实例拉出集群
诊断生产服务前,请务必拉出集群,以免影响外部用户
Node.js Inspector
Node.js 提供了Inspector模块,支
持对运行中的服务开启调试
Inspector还支持在运行时打
HeapSnapshot / CPUProfile,排
查CPU/内存问题
strace与tcpdump: 更通用的系统诊断工具
- tcpdump可以捕获实际在网络中传输的数据,对于Web Server的开发场景来说十分有用
- strace则可以明确输出applications和kernel之间的每一个syscall的参数及返回结果,是
了解系统调用的万用工具。
strace: 查看syscall的利器
tcpdump: 通用抓包工具
tcpdump作为跨平台抓包工具,可以让我们看到在网络设备中传输的每一个请求包,
并且在Windows/Mac/Linux上都可用
常用筛选命令
- host/net 用于指定请求host/ip
- port 用于指定请求的端口
- dst和src 用于指定规则是用于指定一个packet的来源还是去向
- and和or 逻辑上的与、或关系,用于组合起多组筛选规则。
tcpdump: 使用Wireshark查看抓包结果
tcpdump支持将抓包的报文写入文件,并通过Wireshark查看结果