分布式Node.js--03-扩展

运行多余的副本有两个重要的原因:

1、可以达到高可靠性,考虑到进程、整机、偶发性崩溃,只有一个producer实例运行如果出现崩溃,用户只能在重启之后才能继续使用,用更多的副本在跑,可以从其他副本中获取数据

2、一个Node.js实例只能处理那些吞吐量,大概是40000个每秒最小的请求,这其中还不包括,序列化和反序列化,其他的CPU密集型操作

有三个工具可以对工作进行分割:Cluster Module、HAProxy、SLA

Cluster Module

Node.js提供了cluster模块,在同一个机器上运行多个Node.js副本,可以分发网络信息到副本,这个模块与child_process module很相似,提供了fork()方法给Node.js的子进程,主要的区别是添加了路由传入请求机制。

cluster提供了简单的API可以立即访问任何一个Node.js程序,由于通常是下意识的解决方案,但不一定是最适合的方案,需要了解相关原理在合适的时候使用。

基本使用

JavaScript 复制代码
const cluster = require('cluster')

console.log(`master pid=${process.pid}`);

cluster.setupMaster({
  exec: __dirname+'/producer_http_basic.js'
})
// 调用一次创建一个worker
cluster.fork()
cluster.fork()

cluster
.on('disconnect', (worker) => { //监听断开连接
  console.log('disconnect', worker.id);
}).on('exit', (worker, code, signal) => {
  console.log('exit', worker.id, code, signal)
}).on('listening', (worker, {address, port}) => {
    console.log('listening', worker.id, `${address}:${port}`);
});

监听到同一端口的两个工作

通过重复使用命令进行测试,连续三次

bash 复制代码
curl http://localhost:4000/recipes/42

可以看的不同的work进程被使用

kill掉7737,监听到断开连接,再次命令请求会使用保留的7738进程

cluster的缺点

cluster模块比较适合CPU密集操作,不适合I/O密集操作,这是因为JavaScript是单线程,也因为libuv处理异步操作非常有效率

另一个问题,cluster是在第四层TCP/UDP运行,不了解HTTP层的状况,如果是HTTP2以上的gRPC,那么连接会打开更长时间,不会分配到多个进程中,导致无法达到分布式的部署效果。

以下是关于Node.js Cluster模块的补充与优化分析,结合其原理、适用场景及局限性,并提供优化建议:

二、HAProxy:跨节点负载均衡的关键组件

1. 核心能力解析
  1. 多协议支持与智能调度
    HAProxy支持四层(TCP)和七层(HTTP)协议,弥补Cluster的HTTP层感知缺陷。通过最少连接(LeastConn)或源IP哈希(Source Hash)算法实现智能调度。
  2. 健康检查与故障转移
    自动剔除异常后端节点,例如当Node.js实例崩溃时,HAProxy停止向其分发请求,确保服务可用性。
  3. 与Cluster的协同场景
  • HTTP/2/gRPC场景:HAProxy解析应用层协议,动态分发请求至不同Worker。
  • 跨机器扩展:将Cluster部署在多台物理机,HAProxy统一管理后端节点。

配置示例(HTTP与gRPC分流)

sql 复制代码
frontend http-in
    bind *:80
    acl is_grpc path_beg /grpc
    use_backend grpc_servers if is_grpc
    default_backend nodejs_servers

backend nodejs_servers
    balance roundrobin
    server node1 192.168.1.10:4000 check
    server node2 192.168.1.11:4000 check

backend grpc_servers
    balance leastconn
    server grpc1 192.168.1.20:50051 check

三、SLA(服务等级协议)的工程化实践

1. 核心指标定义
  1. 可用性与响应时间
  • 可用性SLA:如99.95%正常运行时间(年均宕机≤4.38小时)。
  • 响应SLA:工单30分钟内响应,故障2小时内恢复。
  1. 性能基线设定
    基于Cluster多进程QPS(如单机8万/秒)定义吞吐量目标,结合Prometheus监控CPU/内存指标。
2. 实施流程
  1. 协议制定:明确服务范围、指标阈值(如API平均延迟≤100ms)。
  2. 监控工具链:使用Grafana可视化HAProxy的请求成功率、Node.js进程负载。
  3. 自动化赔偿:通过账单系统触发违约金计算(如月度费用5%折扣)。

四、工具链对比与架构演进建议

工具 适用场景 优势 局限性与补充方案
Cluster模块 单机多核CPU密集型任务 开发简单,内置进程级容错 长连接支持差,需配合HAProxy
HAProxy 跨节点负载均衡、复杂协议路由 七层协议感知,智能健康检查 需独立部署,增加运维复杂度
Kubernetes 分布式集群、弹性扩缩容 跨节点扩展,容器化部署灵活 架构复杂,适合中大型项目

架构演进建议

  1. 中小规模系统:Cluster + PM2(单机) + 基础SLA(响应时间监控)
  2. 分布式高并发:HAProxy(跨节点LB) + Kubernetes(容器化Cluster) + 多级SLA(含数据库响应指标)

五、总结

Node.js通过Cluster模块实现单机级高并发,HAProxy突破跨节点负载均衡瓶颈,SLA量化服务质量形成闭环。未来可探索:

  • 混合架构:Cluster + Kubernetes实现资源利用率与扩展性平衡。
  • QUIC协议适配:解决HTTP/3长连接负载均衡难题。
  • 智能SLA引擎:结合AI预测流量峰值并动态调整集群规模。

通过工具链的合理选型与持续优化,Node.js在高并发场景下仍能保持强大竞争力。

相关推荐
萧门竹巷8 分钟前
你可能不知道的 HTML5 新特性——「鲷哥」真的好用!
javascript
LemonDu9 分钟前
Cursor入门教程-JetBrains过度向
人工智能·后端
谁还不是一个打工人12 分钟前
vue2实现在屏幕中有一个小机器人可以随意移动
前端·javascript
LTPP15 分钟前
掌握Rust Web开发的未来:Hyperlane框架全方位教程 🎓🔧
前端·后端·github
Dragon Wu22 分钟前
前端 React 弹窗式 滑动验证码实现
前端·javascript·react.js·typescript·前端框架·reactjs
翠莲23 分钟前
vue中使用swiper坑记录
前端·javascript·vue.js
Monly2133 分钟前
Uniapp:获取当前定位坐标
前端·javascript·uni-app
LemonDus35 分钟前
Cursor入门教程-JetBrains过度向
后端·工具·技术知识
CrawlerCracker37 分钟前
小程序逆向|六六找房|请求头Authorization
javascript·爬虫·python·小程序·网络爬虫·js
荼靡799737 分钟前
在 ESM 中引入 CommonJS 模块
node.js