应用场景
- 通用的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%=8760 × 0.001=52.6分钟
- 5个9:99.999%=8760 × 0.00001%=8760 × 0.001=5.26分钟
性能的统计指标:
- 响应时间RTT
- 单位时间处理能力QPS/TPS
- 并发数Concurrency
- 错误率Error Rate
资源的统计指标:
- CPU Load
- Memory Usage
- FD Count
- Disk Read/Write
- Network Send/Recv
稳定性保障
在process上做异常捕获
unhandledRejection和uncaughtException都为异常捕获
自动重启
基于cluster模块下,在子进程退出捕获后,自动fork重启子进程,保证在多进程的架构模式下,单进程挂了之后,可以迅速的通过fork的方式去新启一个进程,避免服务器宕机。
健康检查
一个主动的方式,定时的去检查服务器。
Node.js指标统计工具
利用Node.js API获取指标
CPU Usage
- user cpu time
- system cpu time
Memory Usage
- heapTotal/heapUsed
- external
- array buffers
- rss
IO Usage
- fsRead/fsWrite
- ipcSent/ipcReceived
通过系统指令获取服务容器指标
- top/htop
- lsof -p xxx
- vmstat 1
- iostat 1
可以方便获取、监控内存,不断地监控服务器稳定状态,从而对一些问题快速的采取措施
数据手机 && 可视化
在服务框架或容器镜像内封装通用的实时上报指标Metrics,收集数据并通过可视化看板展示,有助于我们时刻掌握当前服务的状态
- Grabfana埋点看板示例
发布部署
早期服务部署方案
-
购买/租用服务器/公网IP域名
-
安装操作系统、搭建内网环境以及一系列基础设施工具
-
通过FTP/ RSYNC等手段上传生产环境代码包
-
在对应路径下执行启动命令
-
早期通过nohup实现以daemon方式运行
-
- 早期通过nohup实现以daemon方式运行
- 购买域名,配置DNS,以及反向代理到服务下
IaaS:云计算的初级阶段
基础设施即服务(英语:Infrastructure as a Service,简称laaS)是云服务厂商提供消费者处理、储存、网络以及各种基础运算资源,以部署与执行操作系统或应用程序等各种软件。
laaS是云服务的最底层,主要提供一些基础资源。用户无须购买服务器、软件等网络设备,即可任意部署和运行处理、存储、网络和其它基本的计算资源,不能控管或控制底层的基础设施,但是可以控制操作系统、储存装置、已部署的应用程序。
虚拟主机/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)
以Vercel为例,我们可以绑定Git Repository后直接发布
础Runtime不满足应用要求时,PaaS平台也支持通过Dockerfile定制特殊的功能以及启动命令 以Heroku为例,支持通过CLI的方式发布一个Container
PaaS与DevOps
DevOps (Development和Operations的组合词)是一种重视“软件开发人员(Dev)”和"IT运维技术人员(Ops)"之间沟通合作的文化、运动或惯例。透过自动化"软件交付”和“架构变更"的流程,来使得构建、,测试、发布软件能够更加地快捷、频繁和可靠。
现代PaaS平台提供了基础的DevOps流程,通过绑定Git Branch实现自动化集成发布到Preview环境,极大地简化了发布测试上线的流程。850
PaaS与自动扩缩容
得益于Kubernetes的能力,以及通用的PaaS应用Runtime
现代PaaS服务支持定义实例的性能,并支持在请求激增、CPU/内存吃紧时快速扩容实例以及在请求量小、资源充裕时缩容,从而减少运维成本和服务费用
当然,快速扩缩容的前提是在Runtime侧已经实现了性能指标监控与数据上报的能力
Serverless理念
"Serverless computing is a cloud computing execution model in which the cloudprovider allocates machine resources on demand, taking care of the servers onbehalf of their customers.
Serverless最佳形态:PaaS与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应用拆分构建成静态资源CDN+若干FaaS函数
监控运维
日志埋点与监控报警
日志
- 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的利器
编写一个http server,启动后通过strace -p查看并分析系统调用
tcpdump:通用抓包工具
tcpdump作为跨平台抓包工具,可以让我们看到在网络设备中传输的每一个请求包,并且在Windows/Mac/Linux上都可用
常用筛选命令
- host/net用于指定请求host/ip
- port用于指定请求的端口
- dst和src用于指定规则是用于指定一个packet的来源还是去向
- and和or逻辑上的与、或关系,用于组合起多组筛选规则。
tcpdump:使用wireshark查看抓包结果
tcpdump支持将抓包的报文写入文件,并提供Wireshark查看结果