返回介绍

Scalability and Architectural Patterns

发布于 2025-01-25 22:50:10 字数 2099 浏览 0 评论 0 收藏 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文