单机上搭建Node集群

640?wx_fmt=png


搭建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


要使用Docker搭建ActiveMQ单机集群,你可以按照以下步骤进行操作: 1. 创建一个文件夹作为ActiveMQ的集群目录,可以使用命令`mkdir mq_cluster`来创建。 2. 进入这个目录,可以使用命令`cd mq_cluster`来切换到该目录下。 3. 使用命令`sudo cp -r /usr/local/apache-activemq-5.16.0/ mq_node01`复制ActiveMQ的安装目录到mq_node01文件夹中。同样地,可以使用命令`sudo cp -r /usr/local/apache-activemq-5.16.0/ mq_node02`和`sudo cp -r /usr/local/apache-activemq-5.16.0/ mq_node03`分别复制到mq_node02和mq_node03文件夹中。 4. 使用Docker运行三个ActiveMQ容器,可以使用`docker run`命令加上适当的参数来运行容器。这些参数可以指定容器的名称、网络设置、端口映射和挂载目录等。例如,可以使用命令`docker run --name activemq_node01 -p 61616:61616 -p 8161:8161 -v $(pwd)/mq_node01:/opt/apache-activemq-5.16.0 -d webcenter/activemq`来运行第一个ActiveMQ容器,其中`-p`参数指定了端口映射,`-v`参数指定了容器内外目录的挂载。同样地,可以运行第二个和第三个容器,并分别命名为activemq_node02和activemq_node03,并设置不同的端口映射和挂载目录。这样就成功搭建了一个ActiveMQ单机集群。 5. 如果需要进入容器内部进行操作,可以使用命令`docker exec -it 容器名称 bash`来进入容器。例如,可以使用命令`docker exec -it activemq_node01 bash`进入第一个容器。 请注意,这里的步骤是使用Docker运行ActiveMQ的一个简单示例,具体的操作可能会根据实际情况有所不同。在实际应用中,还需要根据需求进行配置和管理,比如配置集群的网络通信、负载均衡和故障转移等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [MQ(解耦、削峰、异步)之ActiveMQ消息中间件(包括搭建zookeeper+activemq集群)](https://blog.csdn.net/qq_26496077/article/details/111835569)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [RabbitMQ集群(docker简单搭建)](https://blog.csdn.net/weixin_52173120/article/details/115867624)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值