2

使用 node.js 集群共享 TCP 套接字/端口很容易,但使用 UDP dgram 似乎不可能做到这一点。

有没有办法使用集群,通过在进程之间共享文件描述符或其他方法来做到这一点?

4

2 回答 2

0

我对此有很多问题,因为 node.js 并没有真正“分叉”,它“产生”或“分叉/执行”。当我将集群用于 UDP 服务器时,只有一个子进程会接收数据包,最后一个是绑定的。如果您只是“fork()”,操作系统会轮询传入的数据包给每个孩子。如果您“spawn()”遇到文件/套接字句柄的继承权问题,则必须设置选项等,并且底层 node.js udp 服务器可能没有应用这些选项。

我必须编写自己的扩展,简单地调用底层操作系统 fork() 并使其像普通的分叉网络服务器一样工作。

Windows 没有 fork(),所以这种方法行不通,这可能是 node.js 没有普通、普通、花园品种 fork() 的原因。这样做会使它无法移植到 Windows。

1)创建一个目录,我叫我的“util”。

2)将这两个文件放在该目录中。

------------------- 切到这里,命名如下“util.cc” -------

#include <v8.h>    //needed for extension infrastructure
#include <node.h>  //needed for extension infrastructure

#include <iostream>  // not part of extension infrastructure, just for the code I'm adding and only while developing to output debugging messages

using namespace node;
using namespace v8;

// The following two functions are examples of the minimum required for a node.js     extension that does anything

static Handle<Value> spoon(const Arguments& args)
{
    pid_t rval = fork();
    if (rval < 0)
    {
        return ThrowException(Exception::Error(String::New("Unable to fork daemon, pid < 0.")));
    }
    Handle<Value> n = v8::Number::New(rval);
    return n;
}

static Handle<Value> pid(const Arguments& args)
{
    pid_t rval = getpid();
    Handle<Value> n = v8::Number::New(rval);
    return n;
}

extern "C" void init(Handle<Object> target)
{
    NODE_SET_METHOD(target, "fork", spoon);
    NODE_SET_METHOD(target, "pid", pid);
}

-------- 剪到这里,命名下面的“wscript” --------

def set_options(opt):
  opt.tool_options("compiler_cxx")

def configure(conf):
  conf.check_tool("compiler_cxx")
  conf.check_tool("node_addon")

def build(bld):
  obj = bld.new_task_gen("cxx", "shlib", "node_addon")
  obj.cxxflags = ["-g", "-D_FILE_OFFSET_BITS=64", "-D_LARGEFILE_SOURCE", "-Wall"]
  obj.target = "util"
  obj.source = "util.cc"

--------- 切割结束,给我们留刀------

3) 运行“node-waf 配置”

如果顺利的话,

4)运行“节点waf”

5) 将创建一个名为“build”的新目录,并且将创建您的扩展“build/default/util.node”。将其复制到任何地方并在您的节点程序中使用它,例如:

var util = require("util.node");

var pid = util.fork();

还包括一个 util.pid() 函数,因为 process.pid 在分叉后不能立即工作。它提供父进程的pid。

我是一个初学者节点扩展作家,所以如果这是一种天真的方法,哦,好吧,但到目前为止它对我很有帮助。任何改进,如“简化”,将不胜感激。

于 2012-12-28T23:09:15.943 回答
0

此问题已在 node.js v0.10 中解决

于 2013-07-12T20:49:23.333 回答