使用zeromq.js从nodejs应用程序与python后端进行通信

我有一个python程序,它将接受一个ZeroMQ REQ请求者,并根据给定的代码提供一些function。

所以如果一个客户端发送一个代码02 ,python会返回一个内存统计信息, 03一个CPU统计信息等等。

客户端使用nodejszeromq.js创build,以便与后端进行通信。 我不确定从前端发送多个消息的最佳方式是什么,因为我会每秒发送多个不同代码的消息。

我现在所拥有的是类似于这样的东西:

 module.exports = function(app) { var zmq = require('zeromq') , sock = zmq.socket('req'); var con_string = '' app.post('/connect', function(req, res) { protocol = 'tcp'; address = req.body.address; port = req.body.port; con_string = protocol + '://' + address + ':' + port; sock.connect(con_string); res.send('OK'); }); app.get('/workers', function(req, res) { sock.connect(con_string); sock.send(['client', 'echo', '02']); }); }; 

通过调用/workers函数,我可以看到第一个请求到达我的后端,但是除非我重新启动整个nodejs应用程序,否则不会有更多的后续请求到达。

为什么会发生这种情况,并且我还想发送很多消息,是否有更好的方法来构build我的nodejs应用程序,因为我在ZeroMQ指南中没有看到类似的例子。

为什么发生这种情况?

ZeroMQ在每个预定义的可扩展通信原型中使用分布式参与者模型来处理多方行为。

REQ只是这种多方分布行为的一部分。

相反的,对称的主要和必要的部分是REP节点。

这个分布式行为游戏(称为REQ/REP )的完整图像是这样的:

REQ问,
REP回复(是的,首先必须接收并确实阅读该消息然后发送答案),
REQ只能在从REP得到.recv().recv() un-loaded)这样的答案之后,去再次询问REP获得另一个答复…

这意味着,你的代码必须在内部与之协调并协调它的本地行为,以符合这种分布式计算行为游戏。

忽略这些硬连线的规则意味着一个问题 – 现在看来,你的REQ side代码只是在它自锁的FSA状态(想发送下一个消息)内部,它简单地忘了也忘记了.recv()第一个和后来的答案,在REQ的第一个.send()之后已经(或将要)从REP .send() ,因此REQ将永远不能再次(直到重置,如上所述)发送.send()任何“下一个” – 消息了REP部分。