cluster是否能够分别运行两组或更多组worker?
发布于 6 年前 作者 bi-kai 3514 次浏览 来自 问答

我想用cluster实现两组以上的worker,分到不同的文件。

现状描述

  1. cluster.isMaster内fork 一组worker后,worker进程会将这个脚本cluster.isMaster{}之外的逻辑都运行一次。
  2. 用全局变量,启动的worker不受cluster.isMaster内修改的影响,因为是隔离的,porcess变量也不互通,也就是说不能在cluster.isWorker{}中写分支做不同的工作。

我的问题

现在能实现的只有将多个任务写到一个worker中,通过IPC让master来调度worker执行哪段任务。 我想实现一组worker工作完,退出,master再启动一组worker做其他工作,是否能实现?

9 回复

你可以通过 redis 订阅发布机制来做, master 发布任务,worker 订阅任务。

@cd-xulei hi, 我有使用redis的消息订阅和发布,主要用于非master worker的代码间的通信。 我目前的问题是,有两组“独立的任务”,如果写在一个worker模块中,是可以实现的,message+switch就能粗暴的实现,但是业务是独立的,想放到不同的文件中,突然发现实现不了。

你写一个 entry 入口,然后不同任务逻辑的代码写到不同的 Strategy 里面。 根据消息订阅的类型,entry 去调用不同的 Strategy 不就行了。。。

@atian25 大神来答复啦。 是这样的,我目前就是这样实现的:

if (cluster.isMaster) {
	cluster.workers[id].send({ order: `xxx`});
} else if (cluster.isWorker) {
    require('./worker');
}

不同的业务,都写在workerjs中,一组完成通过IPC汇总到master里,但是worker中放独立的逻辑不美观,然后做模块化,这样:

//worker.js
require('./task/worker1');
require('./task/worker2');

switch case
...

这只是强行分了文件,代码还hi在一个模块里,我想问这是否是cluster下多组worker的最佳方式? 其实我是想,是否能完全隔离worker呢,比如同时fork多组worker,一组结束就kill掉,想再执行一遍就再fork,进程完全独立开。

之前就关注过napa,现在看还真是满足我需求的模块了。

image.png 想起来了,之前安装napajs失败了,外层用淘宝源可以下载,公司内无法下载其内部的预编译文件。 https://github.com/Microsoft/napajs/issues/248 等回家再试试。

估计你需要 node-resque

[CNodeMD]

webworker-threads和napajs一样

来自酷炫的 CNodeMD

回到顶部