Javascript ZeroMQ的预期性能是什么?

Javascript ZeroMQ的预期性能是什么?,javascript,performance,coffeescript,message-queue,zeromq,Javascript,Performance,Coffeescript,Message Queue,Zeromq,我涉足过程间的沟通;其目的是让工作进程执行一些计算并将结果传递回控制进程。我在coffeescript中安装并设置了一个简单的请求者和响应者 请求者: # requester.coffee zmq = require 'zmq' context = new zmq.Context() socket = zmq.socket 'req' socket.bind 'tcp://1

我涉足过程间的沟通;其目的是让工作进程执行一些计算并将结果传递回控制进程。我在coffeescript中安装并设置了一个简单的请求者和响应者

请求者:

# requester.coffee

zmq                       = require 'zmq'
context                   = new zmq.Context()
socket                    = zmq.socket 'req'

socket.bind 'tcp://127.0.0.1:5555', ( error ) =>
  throw error if error?
  console.log 'Requesting writer bound to port 5555'
  setInterval ( -> socket.send 'helo world' ), 1


response_count  = 0
t0              = new Date() / 1000

socket.on 'message', ( message ) ->
  response_count += 1
  # x = message.toString 'utf-8'
  if response_count % 1000 is 0
    t1              = new Date() / 1000
    console.log "received #{ parseInt response_count / ( t1 - t0 ) + 0.5 } messages per second"
    response_count  = 0
    t0 = new Date() / 1000
响应者:

# responder.coffee

zmq                       = require 'zmq'
context                   = new zmq.Context()
socket                    = zmq.socket 'rep'

socket.connect 'tcp://127.0.0.1:5555'
console.log 'Responder bound to port 5555'
process.stdin.resume()

request_count   = 0
t0              = new Date() / 1000

socket.on 'message', ( message ) ->
  request_count += 1
  # message = message.toString 'utf-8'
  # console.log message
  socket.send 'helo back'
  if request_count % 1000 is 0
    t1              = new Date() / 1000
    console.log "received #{ parseInt request_count / ( t1 - t0 ) + 0.5 } messages per second"
    request_count  = 0
    t0 = new Date() / 1000
现在,当我在ubuntu(11.10,8GB,Intel Duo Core 3GHz,NodeJS 0.8.6)机器上的不同终端窗口中运行它们时,我得到以下输出:

received 135 messages per second
received 6369 messages per second
received 6849 messages per second
received 6944 messages per second
received 7042 messages per second
received 7143 messages per second
received 5952 messages per second
received 2967 messages per second
received 914 messages per second
received 912 messages per second
received 928 messages per second
received 919 messages per second
received 947 messages per second
received 906 messages per second
received 918 messages per second
received 929 messages per second
received 916 messages per second
received 917 messages per second
received 916 messages per second
received 928 messages per second
这(1)看起来有点像几秒钟后传输信道中出现某种饱和;(2) 感觉不够快。据我所知,我应该每秒收到数十万条(而不是数千条)的消息,这是由(“ZeroMQ:接收10000条消息大约需要15毫秒”)所证实的

我还尝试使用python 3编写的响应程序,得到了完全相同的数字。此外,我还编写了另一对脚本,其中主进程将生成一个子进程,并通过stdout/stdin与之通信;我每秒获得大约750条消息(当我增加消息长度时,我看不出有多大差异),这与zeromq实验的大致情况相同


这些数字是预期的吗?这里的限制因素是什么?

我认为有两件事正在发生。首先,您有
setInterval(->socket.send'helo world'),1
。这将每毫秒发送一个请求,因此将限制为每秒1000个请求

此外,请求/响应模型是同步的。请求通过套接字进入并阻塞,直到给出响应。通过响应,处理并阻止下一个请求

我将请求者脚本从
socket=zmq.socket'req'
更改为
socket=zmq.socket'push'
setInterval(->socket.send'helo world')、0
更改为
socket.send'helo world',而为true
。然后,我将响应程序脚本
socket=zmq.socket'rep'
更改为
socket=zmq.socket'pull'
,并获得了此输出

$ coffee responder.coffee
Responder bound to port 5555
received 282 messages per second
received 333357 messages per second
received 249988 messages per second
received 333331 messages per second
received 250003 messages per second
received 333331 messages per second
received 333331 messages per second
received 333331 messages per second
...

请求程序没有得到任何输出,因为它在while循环上阻塞,但它确实证明了ØMQ可以获得更好的性能。

同步REQ-REP是主要限制,请参阅指南以获得更多异步示例以提高性能。我不确定我是否正确理解您,但无论我打开了多少响应程序终端,请求者报告的速率始终保持在900 mps范围内。现在请求者肯定没有阻塞,它以尽可能快的速度发送请求——就像nodejs上的javascript一样,肯定快于每毫秒1个请求?您有
setInterval…1
,这不意味着它每毫秒只发送一条消息吗?这将给你一个1k毫秒/秒的上限。删除setInterval,并将socket.send放入请求者的“message”上的
块中,如果你真的想看到它的限制。Steve-o是对的,REQ-REP是同步的,并且总是慢得多,因为它必须等待响应。您希望通过推拉实现的性能。@flow看起来像是评论者已经离开了;你能把你的代码的推/拉版本作为答案吗?(因为这似乎没有得到回答)