运行多个服务副本主要避免两个场景:服务器崩溃 & 高吞吐量。
集群模块
Node.js 内置了 cluster
模块,可以用来生成子进程,运行多个服务器实例。最好保持主进程简单。
当面临多个请求时,主进程会将请求循环地分配给工作进程(在 Windows 中会根据繁忙程度)。
集群的缺点
cluster
本质是网络的第 4 层(即 TCP/UDP 的同层)运行。当建立 HTTP 长连接时,主进程会始终将请求分配给原工作进程。
如果服务器是单核 CPU ,启用集群可能会更加消耗资源,实例之间可能会出现抢占 CPU 资源的情况。
反向代理
书中使用的 HAProxy 来作为反向代理,但我应该会去用 Ngnix ,所以我只从书中摘了些共同的概念。
- 负载均衡 & 健康检查;
- 压缩;
- 终止 TLS 会话;
- 限速(最大连接数);
Node.js 中 http.Server
也可以设置最大连接数,但是处理方式是直接阻止请求。如果反向代理也设置了最大连接数,则需要小于在 Node.js 中设置的最大连接数。
负载测试
对于软件即服务(Software as a Service, Sass),通常需要确定服务等级协议(Service Level Agreement, SLA),来协定服务质量。
SLA 会包含多个服务等级目标(Service Level Objective, SLO),比如正常的运行时间需求、API 请求延迟、故障率等。
可以用 Autocannon 来进行负载测试,同时应当在生产环境中做最后的测试。