相同的pub-sub代码适用于本地计算机(Linux zephyr 3.13.0-27-generic #50-Ubuntu SMP Thu May 15 18:08:16 UTC 2014 i686 i686 i686 GNU/Linux).
然而,在EC2机器(Linux <host> 3.2.0-60-virtual #91-Ubuntu SMP Wed Feb 19 04:13:28 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux)
上它失败了。
安全组设置为允许19019端口的所有端口,以及从0开始的所有TCP端口。
我尝试在NodeJS ZMQ模块中添加打印件,并且能够在我将其添加到flush函数时获取我发送的数据。
还有什么可能是问题?
我尝试在端口19019上使用tcpflow监听酒吧流量,但它没有用。我怎么能听这个流量?
sudo tcpflow -i eth0 port 19019
和sudo tcpflow -i lo port 19019
两者都没有用。有没有可以调试它的工具?
Pub.coffee
zmq = require 'zmq'
dpush_socket = zmq.socket 'pub'
dpush_socket.bind 'tcp://127.0.0.1:19019', (err) ->
if not err?
console.log "Bind successful"
dpush_socket.send 'pid' + ' req ' + req.query.pid
Sub.coffee
zmq = require "zmq"
endPoint = "tcp://0.0.0.0:19019"
sub = zmq.socket "sub"
sub.identity = 'worker' + process.pid;
sub.connect endPoint
console.log "worker connected!"
sub.subscribe('')
sub.on "message", (msg) ->
console.log(sub.identity + 'got ' + msg.toString())
答案 0 :(得分:0)
<强>子强> .coffee
zmq = require "zmq"
# # rather set URL, where PUB .bind() listens
endPoint = "tcp://127.0.0.1:19019" # endPoint = "tcp://0.0.0.0:19019"
答案 1 :(得分:0)
部分答案可能是user3666197所指出的:你需要在同一个IP上绑定和连接。我不确定您对0.0.0.0
地址的意图,除非您发现网络堆栈的某个未记录的角落支持此行为,否则它甚至不应该在您的本地计算机上工作。
另一个原因是你想要在你的回调中包含你的send
调用,或者可能想要使用bindSync
来确保在你尝试发送任何内容之前绑定套接字。可能发生的情况是套接字正在丢弃您发送的消息,因为套接字在您到达呼叫时尚未完成绑定。不同的机器之间可能会有所不同。
答案 2 :(得分:0)
问题是我使用了一个nodejs集群模块,并且在每个工作中都创建了一个zmq pub套接字,它绑定在同一个端口上,这会混淆问题。在我的本地机器上,它是一个单独的工人产卵。