单机上搭建 Node 集群

发布于 2025-01-18 09:45:24 字数 1999 浏览 2 评论 0

配置 Node 集群需要复制进程,而且通过主从模式并行处理业务。主进程不负责具体的业务处理,而是负责调度或管理工作进程,它是趋向于稳定的。工作进程负责具体的业务处理。

关于本 Node 进程的介绍请看 Node.js 中文网

复制进程

child_process.fork() 方法是专门用于衍生新的 Node.js 进程。

重要的是要记住,衍生的 Node.js 子进程独立于父进程,但两者之间建立的 IPC 通信通道除外。 每个进程都有自己的内存,带有自己的 V8 实例。 由于需要额外的资源分配,因此不建议衍生大量的 Node.js 子进程。

// master.js 文件
const fork = require('child_process').fork;
const cpus = require('os').cpus();
const net = require('net')

const list = []
for (let i = 0; i < cpus.length; i++) {
  const child = fork('./worker.js')
  list.push(child)
}

const server = net.createServer()

server.listen(8080, () => {
  list.forEach(child => {
    child.send('server', server)
  })
  server.close()
})

如果 Node.js 进程是通过进程间通信产生的,那么, process.send() 方法可以用来给父进程发送消息。 接收到的消息被视为父进程的 ChildProcess 对象上的一个 'message' 事件。

// worker.js 文件
const http = require('http')
const process = require('process')

const server = http.createServer(
  (req, res) => {
    res.writeHead(200, {
      'Content-Type': 'text/plain',
    })
    res.end(`handle by child ${process.pid}`)
  }
)


process.on('message', (m, tcp) => {
  if (m === 'server') {
    // 建立新的 TCP 流时会触发此事件
    tcp.on('connection', socket => {
      // 让工作进程去处理连接请求
      server.emit('connection', socket)
    })
  }
})

'connection' 事件,建立新的 TCP 流时会触发此事件。用户也可以显式触发此事件,以将连接注入 HTTP 服务器。

通过 node master 启动主进程文件,主进程发送完句柄并关闭监听。多个子进程可以同时监听相同
端口。这个服务器端套接字可以被不同的进程复用。

我们独立启动的进程中,TCP 服务器端 socket 套接字的文件描述符并不相同,导致监听到相同的端口时会抛出异常。

由于独立启动的进程互相之间并不知道文件描述符,所以监听相同端口时就会失败。但对于 send() 发送的句柄还原出来的服务而言,它们的文件描述符是相同的,所以监听相同端口不会引起异常。

多个应用监听相同端口时,文件描述符同一时间只能被某个进程所用。换言之就是网络请求向服务器端发送时,只有一个幸运的进程能够抢到连接,也就是说只有它能为这个请求进行服务。这些进程服务是抢占式的。

句柄

句柄是一种可以用来标识资源的引用,它的内部包含了指向对象的文件描述符。

套接字

TCP 用主机的 IP 地址加上主机上的端口号作为 TCP 连接的端点,这种端点就叫做套接字(socket)或插口。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

全部不再

暂无简介

文章
评论
27 人气
更多

推荐作者

迎风吟唱

文章 0 评论 0

qq_hXErI

文章 0 评论 0

茶底世界

文章 0 评论 0

捎一片雪花

文章 0 评论 0

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文