端口查找竞争条件

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

分叉时,您会自动打开 masterslave 之间的通信通道。使用它。

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);