从 zmq 套接字返回值

Posted

技术标签:

【中文标题】从 zmq 套接字返回值【英文标题】:return value from zmq socket 【发布时间】:2012-09-14 16:58:49 【问题描述】:

我正在使用 Socket.IO 让客户端网页从我的 Node.JS 服务器动态获取数据。在服务器端,我使用 zeromq 套接字库(REQ/REP 结构,参见 zguide 的 rrclient.js 示例)将请求转发到 Python 后端。

但是,由于我的服务器充当 socket.io 服务器,因此我必须将响应包装如下,以便将其发送回特定客户端:

socket.on('app_request',function(appRequest)
      //route this request to the backend.
      var results = fetch_data(appRequest);
      //return it to the client
      socket.emit('app_results',results);
  );

因此 fetch_data 函数使用 zmq 套接字 (socket.send) 将请求推送到服务器。

但是 Node ZMQ 套接字使用 socket.on('message',function()); 响应请求侦听器,实际上并没有返回任何东西。

如何使用 socket.on('message',function());向发起 socket.send() 请求的特定函数返回一个值?

换句话说,我怎样才能让客户端的 socket.io 请求让 Node.JS 使用 ZMQ 从 python 后端获取相关数据,然后将其返回给 socket.io 客户端? (当然是以非阻塞方式)

【问题讨论】:

顺便说一句,你可能想看看 gevent-socketio,并直接在 Python 中接收数据 【参考方案1】:

我做过类似的事情,你会想像这样重做它;

socket.on('app_request',function(appRequest)
  //route this request to the backend.
  fetch_data(appRequest, function(err, results) 
       socket.emit('app_results',results);
  );
);

zmq 是非阻塞的,因此在将响应发送到 socket.io 之前不会收到响应,使用此方法您可以调整 fetch_data 方法以存储回调,直到响应返回然后触发它。

仅用于灵感的粗略 fetch_data 未经测试;

var zmq = require('zmq'),
    req = zmq.socket('req'),
    count = 0,
    jobs = ;


req.on('message', function(response) 
    var args  = JSON.parse(response),
        reply = args[0],
        id    = args[i];

    if (id && jobs[id]) 
         jobs[id].apply(null, Array.isArray(reply) ? reply : [reply]);

         delete jobs[id];
    


function fetch_data(appRequest, callback) 
    var data = JSON.stringify([appRequest, count]);

    jobs[count] = callback;

    req.send(data);

    ++count;

然后在另一端解析 json 并保留 id 并将其与响应一起发送回来。

【讨论】:

看起来很有希望 - 但是,我的 fetch_data 函数仍然需要调用 zmq.socket.send() 函数并取回它的值,以便我可以将它返回给回调。但是,zmq 套接字似乎不能这样连接...... 是的,你必须连接交易,我会在上面添加一些额外的代码让你开始这个过程。 @ejang 这最终回答了你的问题吗?

以上是关于从 zmq 套接字返回值的主要内容,如果未能解决你的问题,请参考以下文章

ZeroMQ API 套接字

ZMQ 套接字连接超时

ZeroMQ API 代理

zmq 交换和 HWM

非套接字上的套接字操作,zmq 选项

Python zmq SUB 套接字未接收 MQL5 Zmq PUB 套接字