如何在Windows上运行Node集群?

12

有人知道如何在Windows上运行Node集群吗?我没有找到任何网上的文章,也似乎无法解决这个问题:

events.js:160
      throw er; // Unhandled 'error' event
      ^

Error: write ENOTSUP
    at exports._errnoException (util.js:1007:11)
    at ChildProcess.target._send (internal/child_process.js:634:20)
    at ChildProcess.target.send (internal/child_process.js:521:19)
    at sendHelper (cluster.js:751:15)
    at send (cluster.js:534:12)
    at cluster.js:509:7
    at SharedHandle.add (cluster.js:99:3)
    at queryServer (cluster.js:501:12)
    at Worker.onmessage (cluster.js:449:7)
    at ChildProcess.<anonymous> (cluster.js:765:8)

而且这段代码...

if (cluster.isMaster) {
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
    cluster.on('online', (worker) => {
        console.log('Worker ' + worker.process.pid + ' is online');
    });
    cluster.on('exit', (worker, code, signal) => {
        console.log(`Worker ${worker.process.pid} died with code ${code} and signal ${signal}`);
    });
} else {
    console.log('else part ');
    openPort();
}

function openPort() {
    let server = dgram.createSocket('udp4');
    server.bind(port, host);
    server.on('message', processMessage);
}

这段代码对我有效 - 你的其余代码在哪里,你的Node.js版本是多少? - AntonB
你正在运行哪个版本的Node.js?这个错误报告表明去年在Windows平台上修复了该领域的一个bug。我不确定修复程序被放到了哪些版本中。 - jfriend00
还有,openPort()函数是做什么的? - jfriend00
看起来在Windows上使用集群时出现此类错误的根本原因是在集群中使用了UDP套接字。您知道自己是否正在这样做或者是否正在使用使用UDP的库吗?如果是这样,似乎有一些解决方法可以通过适当地绑定UDP套接字来实现。如果您阅读此讨论,您将获得更多详细信息。 - jfriend00
抱歉回复晚了。我编辑了代码以包含openPort函数。是的,它是UDP。此外,Node版本为6.2.2。更重要的是,它在Linux上能够正常工作,不知道是否有一种方法可以兼容两者?@jfriend00 那个链接似乎他们已经解决了这个问题?谢谢。 - wayofthefuture
显示剩余2条评论
3个回答

2
在v0.11.14版中新增了对UDP集群的支持(仅适用于Linux和OSX)。请查看node.js主分支上的文件,其中指出“目前不支持Windows上的dgram集群”。请注意保留HTML标签。

使用版本6.2.2 - wayofthefuture
你知道除了dgram之外还有哪个模块可以完成这个任务吗? - wayofthefuture
你只需要使用UDP吗?确切的使用场景是什么? - Vibhaj
仅接收UDP,大约100-1000条消息/秒。 - wayofthefuture
为什么不能在不同的端口上运行多个服务器实例并使用像nginx这样的负载均衡?请参见https://www.nginx.com/blog/announcing-udp-load-balancing/。 - Vibhaj
显示剩余2条评论

1

在我当前使用的Node.js版本中,我使用以下代码在Windows上创建集群。

var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }


  cluster.on('exit', function(worker, code, signal) {
    console.log("worker ${worker.process.pid} died");
    cluster.fork();
  });
} else {
  var express = require('express');
  var http = require('http');

  // init app
  var app = express();

  function createServer(app) {
    return http.createServer(app);
  }

  app.locals.server = createServer(app);

  app.locals.server.listen(port, function() {
    console.info("server online");
  });
}

这将在同一端口上创建集群。

需要使用UDP端口。 - wayofthefuture

1
因此,为了在Windows上使用Node集群与UDP,您必须像这样调用server.bind:
server.bind({port: 1900, exclusive: true}, function () {
        console.log('PORT BIND SUCCESS');
        server.setBroadcast(true);
        server.setMulticastTTL(128);
        server.addMembership(multicastAddress, myIp);
    });

关键部分是将对象{port: PORT, exclusive: true}传递给bind函数。我在这里找到了答案:https://github.com/misterdjules/node/commit/1a87a95d3d7ccc67fd74145c6f6714186e56f571

补充一下:只要不绑定到UDP端口,Windows上的聚类就可以正常工作。如果这样做,您必须确保将“exclusive”属性设置为true,就像@Blighty建议的那样。此外,因为每个集群都会尝试bind()到相同的端口,只有第一个才能成功连接。其他人可能会抛出一个错误,说地址已经在使用中(bind EADDRINUSE 0.0.0.0:5007)。处理错误,它应该可以正常工作。 - Lothre1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接