【问题标题】:Port finding race condition端口查找竞争条件
【发布时间】:2017-11-15 12:52:16
【问题描述】:

我有一个 master.js 和一个 slave.js

每当 master.js 需要更多的 slave 来处理数据时,它就会 .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);
    });
}

如何防止此类行为?

【问题讨论】:

    标签: javascript node.js port race-condition


    【解决方案1】:

    您可以让您的主进程将端口号传输给从属进程

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

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

    【讨论】:

    • 哦,我也可以使用 .send 吗?好的。我只是在从站上使用 process.send 来获取状态更新
    • @DatNoHand 我已经添加了完整的通信示例,您可以在提供的链接中找到。
    • 但是父级应该如何知道哪些端口是开放的呢?
    • 当您是主服务器时,您可以保存有关您拥有的从服务器数量和可用端口的数据。当你启动一个新的 slave 时,给它一个可用的端口,你可以从你保留的端口数组中删除它。
    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2022-01-23
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多