使用node.js集羣共享TCP套接字/端口很容易,但使用UDP dgram進行此操作似乎不太可能。使用node.js子進程共享UDP套接字/端口
有沒有辦法做到這一點或者使用羣集,通過共享進程之間的文件描述符或其他?
使用node.js集羣共享TCP套接字/端口很容易,但使用UDP dgram進行此操作似乎不太可能。使用node.js子進程共享UDP套接字/端口
有沒有辦法做到這一點或者使用羣集,通過共享進程之間的文件描述符或其他?
我有很多問題,因爲node.js並不真正「分叉」,它「產生」或「fork/execs」。當我將羣集用於UDP服務器時,只有一個子進程會接收數據包,最後一個綁定。如果您只是「fork()」,則操作系統會將傳入的數據包發送給每個孩子。如果您「spawn()」遇到文件/套接字句柄的繼承權限問題,則必須設置選項等,並且基礎node.js udp服務器可能沒有應用這些選項。
我不得不編寫自己的擴展,簡單地稱爲底層OS 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 configure」
如果順利的話,
4)運行「節點-WAF」
5)一個名爲「打造」新目錄將被創建,以及您的分機「建設/默認/ util.node」將一直創建。複製該內容並在節點程序中使用它:
var util = require(「util.node」);
var pid = util.fork();
還包含util.pid()函數,因爲分叉後process.pid不能正常工作。它提供了父進程的pid。
我是一個初學者節點擴展編寫器,所以如果這是一個天真的方法,哦,但它迄今爲止服務得很好。任何改進,如「簡化」將不勝感激。
此問題已在node.js v0.10中得到解決
解釋如何使用它的任何代碼片段將是很好的 –
謝謝。 節點團隊已解決此問題 –
... udp-cluster-v0.8分支(https://github.com/StrongLoop/node/commits/udp-cluster-v0.8)並將其合併到主節點中。 –