Articles of zeromq

在npm安装期间,在mac 10.5.8上findnode-gyp'pkg-config:command not found'

试图在github项目的mac-osx上进行npm安装。 不要在packages.json中看到pkg-config为什么node–gyp期望这样? 好像node-gyp应该包含pkg-config。 我认为这是节点工作的方式。 安装一个软件包,它可以根据需要进行安装。 我想这是不同的。 也想知道哪个版本的pkg-config其寻找。 是的,我一直在那里下载压缩包,但它的mac安装说明真的是无稽之谈。 它保持./configure然后进行安装。 但是,makefile不可用,一切都在同一目录级别,但它说cd到代码目录等 > node-gyp重build / bin / sh:找不到pkg-config:命令 gyp:调用'pkg-config libzmq –libs'返回退出状态127.试图加载binding.gyp gyp ERR! configuration错误 gyp ERR! 堆栈错误:`gyp`失败,退出代码:1 gyp ERR! 在ChildProcess.onCpExit(/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:343:16) gyp ERR! 在ChildProcess.emit(events.js:98:17) gyp ERR! 在Process.ChildProcess._handle.onexit(child_process.js:820:12) gyp ERR! 系统达尔文12.5.0 gyp ERR! 命令“node”“/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js”“rebuild” gyp ERR! cwd / Users / Mac1 / Downloads / projdirectory / node_modules / zmq […]

带有node.jspipe道接收器的ZeroMQ会在一段时间后停止接收消息

我一直在试图build立一个呼吸机/工作者/汇的模式,以抓取页面,但我从来没有超过testing阶段。 我的设置的一个特殊性在于,水槽与呼吸机的生命过程相同。 所有节点使用ipc:// transport。 目前只有testing消息被交换。 呼吸机发送任务,工作人员收到它们,然后等待发送确认信息。 症状 :一段时间后(通常less于5分钟),即使呼吸机继续发送任务,工作人员仍然接收并发送确认信息,接收机将停止接收确认信息。 我知道发送的确认信息,因为如果我重新启动我的接收器,启动时会得到所有丢失的消息。 我认为ZeroMQ处理自动重新连接。 通风机/宿 var push = zmq.socket('push'); var sink = zmq.socket('pull'); var pi = 0; setInterval(function() { push.send(['ping', pi++], zmq.ZMQ_SNDMORE); push.send('end'); }, 2000); push.bind('ipc://crawl.ipc'); sink.bind('ipc://crawl-sink.ipc'); sink.on('message', function() { var args = [].slice.apply(arguments).map(function(e) {return e.toString()}); console.log('got message', args.join(' ')); }); worker.js var pull = zmq.socket('pull'); var sink = […]

ZeroMQ与Socket.io

我想要zeroMQ和socket.io之间的主要区别 性能(速度更快吗?) 应用。 (用于实时服务吗?) 浏览器支持。 (支持哪些浏览器?)

node.js集群中的subprocess间通信选项

所以我现在在做一个node.js游戏服务器应用程序,在这里我碰到了一些问题。 我的问题是,我使用socket.io接受来自游戏客户端的入站连接。 这些客户端可能连接到游戏世界的几个区域或区域之一。 基本架构如下所示。 主进程为运行区域pipe理器进程的每个游戏区域分配一个subprocess; 一个专门维护区域数据的过程(三维模型,玩家/实体的位置等)。 主进程然后为其创build的每个区域pipe理器分派多个“通信线程”。 这些线程创build一个socket.io的实例并侦听该区域的端口(多个线程在单个端口上侦听)。 这些线程将在自己的进程中处理大部分游戏逻辑,并与支持游戏服务器的数据库进行通信。 唯一的问题是,在某些情况下,他们可能需要与区域经理沟通,以获得关于区域,球员等的信息。 举个例子:一个玩家想要在该区域内购买/出售/交易非玩家angular色(NPC)。 区域通信线程需要询问区域pipe理器线程,以确定玩家是否足够接近NPC进行交易,然后才允许交易发生。 我在这里遇到的问题是我打算利用node.js集群function,并使用进程的send()和on()方法来回传递消息。 除了我遇到的一个警告之外,这将是很好的。 由于cluster.fork()所有subprocess都只能与“主”进程通信。 node.js根进程成为所有通信的瓶颈。 我使用一个脚本在我的系统上运行了一些基准testing,它使用集群的进程间通信(IPC)来回传递消息,并跟踪每秒钟执行多less次中继。 看起来,最终节点以每秒约20k的速度在它可以中继的IPC数量方面达到最大值。 这个数字在Phenom II 1.8ghz四核笔记本电脑和FX-8350 4.0ghz 8核心桌面电脑上都是一致的。 现在这听起来相当高,除了这基本上意味着无论有多less区域或通信线程,所有的IPC仍然是通过一个单一的进程瓶颈,作为整个应用程序的“中继”。 这意味着尽pipe看起来每个单独的线程可以每秒钟接续20k个IPC,但是由于所有的通信都是通过一个线程进行的,整个应用程序作为一个整体将永远不会中继,即使是在一些疯狂的32核心系统上。 所以这就是我遇到的问题。 现在困境。 我已经阅读了很多有关其他各种选项,并阅读了20个不同的问题在这里堆栈关于这个话题,我已经看到了一些事情经常popup: Redis :我实际上是在我的服务器上运行Redis,并将其用作socket.io数据存储,以便多个线程中的socket.io可以共享连接数据,以便用户可以连接到N个socket.io线程为他们的区域,所以服务器可以自动负载平衡input连接。 我关心的是它贯穿networking堆栈。 对于同一台服务器上的多个进程之间的通信几乎不是理想的 我觉得延迟将是一个长期的主要问题。 0MQ(zeromq / zmq) :我以前从来没有用过这个,但最近我已经听到了一些。 根据我所做的阅读,我发现了很多人使用TCP套接字的例子,但是对于使用IPC的人来说并没有太多的嗡嗡声。 我希望也许有人在这里为IPC工作过0MQ(甚至可能在node.js中),并且可以为我提供一些启示。 dnode :我再也没有用过这个,但是从我所看到的看来,这是另外一个devise用于TCP的选项,这意味着networking堆栈再次成为可能。 node-udpcomm :有人在这里的另一个问题(这是我不能再次不幸find)连接这个。 我从来没有听说过,它看起来像一个非常小的解决scheme,打开和侦听UDP连接。 虽然这可能仍然会比TCP选项更快,但我们仍然有networking堆栈的方式吗? 我肯定喜欢在我的“程序员区”以外的一英里,就像这里,以及我不太了解的networking/计算机体系结构的东西。 无论如何,底线是我完全卡在这里,不知道在这种情况下IPC是最好的select。 我现在假设0MQ是我上面列出的最好的select,因为它是唯一一个似乎为通信协议提供了“IPC”选项,我认为这意味着它使用UNIX套接字或者是不通过networking堆栈,但我不能确认,或任何东西。 我想我只是希望这里的一些人能够足够的了解我的方向,或者告诉我我已经去了那里。 我正在开发的这个项目是一个多人游戏服务器,devise用来与多人游戏客户端“开箱即用”,并以Three.js为3Dgraphics/计算器提供动力。 客户端和服务器将在所有人都满意的情况下成为开放源代码,并且我希望确保架构尽可能地具有可扩展性,这样人们就不会在此基础上构build游戏,然后进行扩展并最终撞墙。 无论如何感谢您的时间,如果你真的读这一切:)

Node.js socket.send()函数在退出前无法完成

在我编写的一些Node.js脚本中,我注意到即使最后一行是同步调用,有时在Node.js退出之前也不会完成。 我从来没有见过一个console.log语句在退出之前无法运行/完成,但是我已经看到一些其他语句在退出之前无法完成,我相信它们都是同步的。 我可以看到为什么在这种情况下,asynchronous函数的callback将无法启动。 有问题的代码是一个ZeroMQ .send()调用如下所示: var zmq = require('zmq'); var pub = zmq.socket('pub'); pub.bindSync('tcp://127.0.0.1:5555'); setInterval(function(){ pub.send('polyglot'); },500); 上面的代码按预期工作…但是,如果我删除setInterval() ,只是这样调用它: var zmq = require('zmq'); var pub = zmq.socket('pub'); pub.bindSync('tcp://127.0.0.1:5555'); pub.send('polyglot'); //this message does not get delivered before exit process.exit(0); 那么这个消息就不会被传递 – 程序在pub.send()调用完成之前显然会退出。 在退出Node.js之前,确保语句完成的最佳方法是什么? closures钩子可以在这里工作,但是恐怕只是掩盖了问题,因为你不能把你需要的所有东西都保证在closures钩子中运行。 这个问题也可以用这种方式来certificate: if (typeof messageHandler[nameOfHandlerFunction] == 'function') { reply.send('Success'); messageHandler[nameOfHandlerFunction](null, args); } else […]

使用zeromq与Python与Java的node.js性能

我已经使用node.js,Python和Java为zeromq写了一个简单的echo请求/回复testing。 代码运行一个100K请求的循环。 该平台是一个5yo的MacBook Pro,2个内核和运行Snow Leopard的3G内存。 node.js一直比其他两个平台慢一个数量级。 Java: real 0m18.823s user 0m2.735s sys 0m6.042s Python: real 0m18.600s user 0m2.656s sys 0m5.857s node.js: real 3m19.034s user 2m43.460s sys 0m24.668s 有趣的是,在Python和Java中,客户端和服务器进程都使用大约一半的CPU。 node.js的客户端使用了大约一个完整的CPU,而服务器使用了大约30%的CPU。 客户端进程也有大量的页面错误导致我相信这是一个内存问题。 另外,在10K请求节点只有3倍慢; 它的运行时间肯定会减慢。 这是客户端代码(请注意,process.exit()行也不起作用,这就是为什么除了使用time命令外还包含一个内部定时器的原因): var zeromq = require("zeromq"); var counter = 0; var startTime = new Date(); var maxnum = 10000; var socket = zeromq.createSocket('req'); socket.connect("tcp://127.0.0.1:5502"); […]