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

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

复制进程

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 http = require('http') const list = []
for (let i = 0; i < cpus.length; i++) {   const child = fork('./worker.js')    list.push(child)
}   const server = http.createServer((req, res) => {   res.end('handle by parent')
})  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() 发送的句柄还原出来的服务而言,它们的文件描述符是相同的,所以监听相同端口不会引起异常。

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

句柄

句柄就是个数字,一般和当前系统下的整数的位数一样,比如32bit系统下就是4个字节。这个数字是一个对象的唯一标识,和对象一一对应。

套接字

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

References

[1] Node.js 中文网: http://nodejs.cn/api/child_process.html#child_process_child_process_fork_modulepath_args_options

单机上搭建Node集群相关推荐

  1. 在windows上搭建redis集群(主从复制)

    Redis集群策略主要有: 主从复制 哨兵模式 (在windows上搭建redis集群(Redis-Sentinel)) 集群 (在windows上搭建redis集群(Redis-Cluster)) ...

  2. 在windows上搭建redis集群(Redis-Sentinel)

    Redis集群策略主要有: 哨兵模式 主从复制(在windows上搭建redis集群(主从复制)) 集群 (在windows上搭建redis集群(Redis-Cluster)) 分片 本文主要讲解如何 ...

  3. 在windows上搭建redis集群(Redis-Cluster)

    Redis集群策略主要有: 集群 主从复制(在windows上搭建redis集群(主从复制)) 哨兵模式 (在windows上搭建redis集群(Redis-Sentinel)) 分片 本文主要讲解如 ...

  4. 微信公众号 多台服务器,在多台 Linux 服务器上搭建 Pulsar 集群

    作者:高天赐 编辑:Irene Pulsar 是一个支持多租户的.高性能的消息中间件.上一篇我们介绍了如何在 Mac 上搭建 Pulsar 集群,本文详细介绍如何在 3 台 Linux 服务器上搭建 ...

  5. CentOS7上搭建Hadoop集群(入门级)

    场景 Hadoop Apache Hadoop是一款支持数据密集型分布式应用并以Apache 2.0许可协议发布的开源软 件框架,支持在商品硬件构建的大型集群上运行应用程序.Hadoop是根据Goog ...

  6. 在centos上搭建redis集群并附测试(真集群非伪集群)

    环境:centos6.5 x86 32位 redis3.2.8 ruby-2.2.3 一. redis集群原理 redis是单线程,但是一般的作为缓存使用的话,redis足够了,因为它的读写速度太快了 ...

  7. 在Ubuntu18上搭建K8s集群(1.19.3)

    环境准备 为了演示简单,准备两台4GB内存,20GB硬盘的虚拟机,操作系统为ubuntu18.04-server 角色 IP HostName Master 192.168.47.144 master ...

  8. CentOS 7 上搭建 ZooKeeper 集群

    ZooKeeper 是什么? ZooKeeper 是分布式系统中的分布式协调服务,用于实现分布式同步,维护配置信息,分组和命名服务. 软件版本: CentOS 7.9 ZooKeeper 3.5.5 ...

  9. redis映射的概念_在K8S上搭建Redis集群

    今天让我们试着在k8s里部署一个redis集群,了解更多k8s的细节和特性. 环境:minikube v0.30 (kubernetes 1.10) 问题分析 本质上来说,在k8s上部署一个redis ...

最新文章

  1. AI 重新定义金融,颠覆投资模式
  2. 解决苹果APP审核需要的IPv6地址的问题
  3. Android系统中标准Intent的使用
  4. 父亲和女儿同为互联网大佬, 但不幸都得癌症
  5. 【Java3】封装,对象数组,构造器,this/super/继承,抽象
  6. How UI5 element is rendered
  7. 来客推仿拼多多电商商城小程序源码
  8. Xcode7 出现-fembed-bitcode错误的解决办法
  9. 方便面为什么要是波浪形的 它是怎么做到的?
  10. postman支持socket吗_如何使用postman测试接口webservice?
  11. 博途TIA Portal STEP 7 Professional WinCC Advanced V15.0安装报错解决
  12. 云教务学校管理系统源码
  13. 4G网络起源及发展历程
  14. 怎样恢复计算机程序打开文件名,Word提示如何解决使用文本恢复转换器打开文件的问题...
  15. 洪水填充算法_优化洪水相似算法(渗流理论)
  16. 【Windows】无法访问指定设备,路径或文件,您可能没有合适的权限访问这个项目
  17. Tribler for Mac(BT资源搜索下载器)
  18. python 执行shell_从python执行Shell脚本与变量
  19. 7-3 找零钱***分数 20作者 李祥单位 湖北经济学院
  20. 如何用电脑制作Excel表格

热门文章

  1. 《原力计划【第二季】》第 2 周周榜揭晓!!!
  2. 自动驾驶即将迎来下一个飞跃?
  3. 一文详解 Java 的几把 JVM 级锁
  4. 超低代码拓荒记 | 工业互联网新边疆
  5. 华为双 11 发 20 亿奖金!?
  6. 没有学历文凭,如何成为一名优秀的 Java 程序员?
  7. 【快报】程序员,别再埋头学Python了!
  8. 不止鸿蒙 OS,华为的备用操作系统还有“极光”?
  9. WWDC 2019 大会前瞻:暗黑模式来袭、iOS 与 macOS 互通?
  10. 鏖战九载,Google 是否会因 Oracle 而弃用 Java?