【青训营】 - Node.js实战

515 阅读7分钟

应用场景

  • 通用的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都为异常捕获

image.png

自动重启

基于cluster模块下,在子进程退出捕获后,自动fork重启子进程,保证在多进程的架构模式下,单进程挂了之后,可以迅速的通过fork的方式去新启一个进程,避免服务器宕机。

image.png

健康检查

一个主动的方式,定时的去检查服务器。

image.png

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

image.png

通过系统指令获取服务容器指标

  • top/htop

image.png

  • lsof -p xxx

image.png

  • vmstat 1

image.png

  • iostat 1

image.png

可以方便获取、监控内存,不断地监控服务器稳定状态,从而对一些问题快速的采取措施

数据手机 && 可视化

在服务框架或容器镜像内封装通用的实时上报指标Metrics,收集数据并通过可视化看板展示,有助于我们时刻掌握当前服务的状态

  • Grabfana埋点看板示例

image.png

发布部署

早期服务部署方案

  • 购买/租用服务器/公网IP域名

  • 安装操作系统、搭建内网环境以及一系列基础设施工具

  • 通过FTP/ RSYNC等手段上传生产环境代码包

  • 在对应路径下执行启动命令

    • 早期通过nohup实现以daemon方式运行

image.png

-   早期通过nohup实现以daemon方式运行 

image.png

  • 购买域名,配置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后直接发布

image.png

础Runtime不满足应用要求时,PaaS平台也支持通过Dockerfile定制特殊的功能以及启动命令 以Heroku为例,支持通过CLI的方式发布一个Container

image.png

PaaS与DevOps

DevOps (Development和Operations的组合词)是一种重视“软件开发人员(Dev)”和"IT运维技术人员(Ops)"之间沟通合作的文化、运动或惯例。透过自动化"软件交付”和“架构变更"的流程,来使得构建、,测试、发布软件能够更加地快捷、频繁和可靠。

image.png

现代PaaS平台提供了基础的DevOps流程,通过绑定Git Branch实现自动化集成发布到Preview环境,极大地简化了发布测试上线的流程。850

PaaS与自动扩缩容

得益于Kubernetes的能力,以及通用的PaaS应用Runtime

现代PaaS服务支持定义实例的性能,并支持在请求激增、CPU/内存吃紧时快速扩容实例以及在请求量小、资源充裕时缩容,从而减少运维成本和服务费用

当然,快速扩缩容的前提是在Runtime侧已经实现了性能指标监控与数据上报的能力

image.png

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.

image.png

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函数

image.png

监控运维

日志埋点与监控报警

日志

  • process.stdout/process.stderr
  • send through udp socket

image.png

埋点/报警

  • Metrics
  • Span
  • Trace

image.png

线上问题排查

前置流程:实例拉出集群

image.png

诊断产生服务前,请务必拉出集群,以免影响外部用户

Node.js Inspector

Node.js提供了Inspector模块,支持对运行中的服务开启调试

image.png

Inspector还支持在运行时打HeapSnapshot/CPUProfile,排查CPU/内存问题

image.png

strace与tcpdump:更通用的系统诊断工具

image.png

  • tcpdump可以捕获实际在网络中传输的数据,对于Web Server的开发场景来说十分有用
  • strace则可以明确输出applications和kernel之间的每一个syscall的参数及返回结果,是了解系统调用的万用工具

strace:查看syscall的利器

编写一个http server,启动后通过strace -p查看并分析系统调用

image.png

image.png

tcpdump:通用抓包工具

tcpdump作为跨平台抓包工具,可以让我们看到在网络设备中传输的每一个请求包,并且在Windows/Mac/Linux上都可用

常用筛选命令

  • host/net用于指定请求host/ip
  • port用于指定请求的端口
  • dst和src用于指定规则是用于指定一个packet的来源还是去向
  • and和or逻辑上的与、或关系,用于组合起多组筛选规则。

image.png

tcpdump:使用wireshark查看抓包结果

tcpdump支持将抓包的报文写入文件,并提供Wireshark查看结果

image.png

image.png