节点集群:仅向一名工作人员处理任务
Posted
技术标签:
【中文标题】节点集群:仅向一名工作人员处理任务【英文标题】:Node cluster: Handle task only to one worker 【发布时间】:2016-01-15 14:54:59 【问题描述】:我正在尝试将集群设置为多线程我的应用程序,但不是为每个工作人员委派一个任务,而是将每个任务委派给所有工作人员。
我的代码如下:
//main.js
var cluster = require('cluster');
//Code executed by the master process.
if (cluster.isMaster)
var numWorkers = require('os').cpus().length;
console.log('Setting up ' + numWorkers + ' workers.');
for (var i = 0; i< numWorkers; i++)
cluster.fork();
cluster.on('online', function(worker)
console.log('Worker ' + worker.process.pid + ' is online');
);
//Spawn a new worker on unexpected events.
cluster.on('exit', function(worker, code, signal)
console.log('Worker ' + worker.process.pid + ' died with code: ' + code + ', and signal: ' + signal);
console.log('Starting a new worker');
cluster.fork();
);
else
//Set up DB
var pg = require ('pg');
var db = 'tcp://username:password@localhost/dbname';
var pg_client = new pg.Client(db);
pg_client.connect();
//Set up Listener
var query = pg_client.query('LISTEN newevent');
pg_client.on('notification', function(not)
console.log(not.payload + ' added to queue by ' + process.pid);
)
每个工作人员都在处理 else
块的内容,所以每次我在表中插入一个值(触发器启动并通知我的 pg_client 正在监听)我得到的 console.log
s 与工作人员 @987654324 一样多@ setup 但是我希望只有一个工作人员会处理每个 postgres 事件。如何修复我的代码以实现上述行为?
【问题讨论】:
您需要一种锁定任务的方法,以便第一个获得它的工作人员会以某种方式导致其他工作人员提前退出。不过....这听起来很容易受到竞争条件的影响。 【参考方案1】:这样就不需要使用集群了。集群平均分配处理。
您需要更改 if-else-logic 然后完全是因为...
for (var i = 0; i< numWorkers; i++)
cluster.fork();
...明确表示您需要 N-Processes。
而不是child_process.fork();
,它将在主线程上显式执行not。阅读它here。
【讨论】:
你是对的,这不是集群的正确用例,child_process.fork();
似乎是一个更好的选择,谢谢!
点赞!如果你想要两者,我想要 4 个工作进程来处理使用 socketio 的快速请求,但同时,我有 4 个不相等的任务,我想在每个工作人员上运行,比如工作人员 1 上的任务 1,工作人员 2 上的任务 2 等等。 .
@PirateApp 晚了 2 年,但情况相似......我用 PM2 生成了我的应用程序的多个实例,因此我确定了主进程并在那里启动了我的 RabbitMQ 消费者工作者。现在我已经在 assert 上锁定了对邮件队列的独占访问,因为我确信我将永远只有一个消费者在整个集群中运行。以上是关于节点集群:仅向一名工作人员处理任务的主要内容,如果未能解决你的问题,请参考以下文章