单机上搭建 Node 集群
配置 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 技术交流群。
上一篇: webpack 打包原理
下一篇: 不要相信一个熬夜的人说的每一句话
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论