- Welcome to the Node.js Platform
- Node.js Essential Patterns
- Asynchronous Control Flow Patterns with Callbacks
- Asynchronous Control Flow Patterns with ES2015 and Beyond
- Coding with Streams
- Design Patterns
- Writing Modules
- Advanced Asynchronous Recipes
- Scalability and Architectural Patterns
- Messaging and Integration Patterns
- Welcome to the Node.js Platform
- Node.js 的发展
- Node.js 的特点
- 介绍 Node.js 6 和 ES2015 的新语法
- reactor 模式
- Node.js Essential Patterns
- Asynchronous Control Flow Patterns with Callbacks
- Asynchronous Control Flow Patterns with ES2015 and Beyond
- Coding with Streams
- Design Patterns
- Writing Modules
- Advanced Asynchronous Recipes
- Scalability and Architectural Patterns
- Messaging and Integration Patterns
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
Scalability and Architectural Patterns
cluster
模块
cluster
模块主进程负责产生大量进程( worker
),每个进程代表我们想要扩展的应用程序的一个实例。每个传入连接然后分布在克隆的 worker
,分散在他们的负载。
const cluster = require('cluster');
const os = require('os');
if(cluster.isMaster) {
const cpus = os.cpus().length;
for (let i = 0; i < cpus; i++) { // [1]
cluster.fork();
}
} else {
require('./app'); // [2]
}
零宕机重启
当代码需要更新时, Node.js
应用程序也可能需要重新启动。因此,在这种情况下,拥有多个实例可以帮助维护我们应用程序的可用性。 当我们不得不故意重新启动一个应用程序来更新它时,会出现一个小窗口,在这个窗口中应用程序将重新启动并且无法为请求提供服务。如果我们正在更新我们的个人博客,这是可以接受的,但对于具有服务水平协议( SLA
)的专业应用程序就不行了,或者作为持续交付过程的一部分经常更新的专业应用程序。解决方案是实现零宕机重新启动,更新应用程序的代码而不影响其可用性。
使用 cluster
模块,这又是一项非常简单的任务;该模式包括一次重启一个 worker
。这样,剩余的 worker
可以继续操作和维护可用应用程序的服务。
然后,让我们将这个新模块添加到我们的集群服务器;我们所要做的就是添加一些由主进程执行的新代码(看 clusteredApp.js
文件):
const cluster = require('cluster');
const os = require('os');
if (cluster.isMaster) {
const cpus = os.cpus().length;
for (let i = 0; i < cpus; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code) => {
if (code != 0 && !worker.exitedAfterDisconnect) {
console.log('Worker crashed. Starting a new worker');
cluster.fork();
}
});
process.on('SIGUSR2', () => {
console.log('Restarting workers');
const workers = Object.keys(cluster.workers);
function restartWorker(i) {
if (i >= workers.length) return;
const worker = cluster.workers[workers[i]];
console.log(`Stopping worker: ${worker.process.pid}`);
worker.disconnect();
worker.on('exit', () => {
if (!worker.suicide) return;
const newWorker = cluster.fork();
newWorker.on('listening', () => {
restartWorker(i + 1);
});
});
}
restartWorker(0);
});
} else {
require('./app');
}
粘性负载均衡
- 反向代理
- nginx 的负载均衡
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论