【青训营】- Node.js实战

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

    image-20210822202257994

  • lsof -p xxx

    image-20210822202441538

  • vmstat 1

    image-20210822202707739

  • iostat 1

    image-20210822202839330

在服务框架或容器镜像内封装通用的实时上报指标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查看结果

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享