端口查找竞争条件
Port finding race condition
我有一个master.js和一个slave.js
每当 master.js 需要更多的奴隶来处理数据时,它会 .fork 他们。
在 slave.js(截断)
portscanner.findAPortNotInUse(config.wss.start_port, config.wss.end_port)
.then((port) => {
httpsServer.listen(port);
process.send('Connected and listening on : ' + port);
})
起始端口为 11001,结束端口为 11100。
现在有时 slave4 和 slave5 都认为 11004 是空闲的,都绑定到那个端口并抛出 EADDRINUSE。
master.js
function CreateSlave(mode, amount) {
return new Promise((res) => {
var c = connected_slaves;
for (var i = 0; i < amount; i++) {
var id = uuid.v4().split("-")[0];
slaves[c] = fork('/opt/nodeapps/ass/slave/server.js',
[serverKeyForSession, mode]);
slaves[c].id = id;
slaves[c].mode = mode;
AttachHandlerToSlave(c).then((res) => {
if (res) return;
});
c++;
}
});
}
function AttachHandlerToSlave(c) {
return new Promise((res, rej) => {
slaves[c].on('message', (msg) => {
console.log('\x1b[33m['+ slaves[c].id +'] | \x1b[0m'+msg);
});
res(true);
});
}
如何防止此类行为?
您可以让您的 master 进程 将端口号传输到 slaves。
分叉时,您会自动打开 master 和 slave 之间的通信通道。使用它。
Here 是关于子进程的很好的教程。
我引用:
parent.js
const { fork } = require('child_process');
const forked = fork('child.js');
forked.on('message', (msg) => {
console.log('Message from child', msg);
});
forked.send({ hello: 'world' });
slave.js
process.on('message', (msg) => {
console.log('Message from parent:', msg);
});
let counter = 0;
setInterval(() => {
process.send({ counter: counter++ });
}, 1000);
我有一个master.js和一个slave.js
每当 master.js 需要更多的奴隶来处理数据时,它会 .fork 他们。
在 slave.js(截断)
portscanner.findAPortNotInUse(config.wss.start_port, config.wss.end_port)
.then((port) => {
httpsServer.listen(port);
process.send('Connected and listening on : ' + port);
})
起始端口为 11001,结束端口为 11100。
现在有时 slave4 和 slave5 都认为 11004 是空闲的,都绑定到那个端口并抛出 EADDRINUSE。
master.js
function CreateSlave(mode, amount) {
return new Promise((res) => {
var c = connected_slaves;
for (var i = 0; i < amount; i++) {
var id = uuid.v4().split("-")[0];
slaves[c] = fork('/opt/nodeapps/ass/slave/server.js',
[serverKeyForSession, mode]);
slaves[c].id = id;
slaves[c].mode = mode;
AttachHandlerToSlave(c).then((res) => {
if (res) return;
});
c++;
}
});
}
function AttachHandlerToSlave(c) {
return new Promise((res, rej) => {
slaves[c].on('message', (msg) => {
console.log('\x1b[33m['+ slaves[c].id +'] | \x1b[0m'+msg);
});
res(true);
});
}
如何防止此类行为?
您可以让您的 master 进程 将端口号传输到 slaves。
分叉时,您会自动打开 master 和 slave 之间的通信通道。使用它。
Here 是关于子进程的很好的教程。
我引用:
parent.js
const { fork } = require('child_process');
const forked = fork('child.js');
forked.on('message', (msg) => {
console.log('Message from child', msg);
});
forked.send({ hello: 'world' });
slave.js
process.on('message', (msg) => {
console.log('Message from parent:', msg);
});
let counter = 0;
setInterval(() => {
process.send({ counter: counter++ });
}, 1000);