#node.js #amazon-ec2 #coffeescript #zeromq #publish-subscribe
#node.js #amazon-ec2 #CoffeeScript #zeromq #опубликовать-подписаться
Вопрос:
Тот же код 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, а также для всех портов TCP, начиная с 0. Я попытался добавить отпечатки в модуль NodeJS ZMQ и смог получить данные, которые я отправляю, когда добавил их в функцию flush. В чем еще может быть проблема?
Я пытался прослушивать трафик паба с помощью tcpflow на порту 19019, но это не сработало. Как я могу прослушать этот трафик?
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
Суб.кофе
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())
Ответ №1:
Транспортные классы должны скорее встречаться друг с другом на одном и том же IP:ПОРТУ#
Суб.кофе
zmq = require "zmq"
# # rather set URL, where PUB .bind() listens
endPoint = "tcp://127.0.0.1:19019" # endPoint = "tcp://0.0.0.0:19019"
Ответ №2:
Часть ответа, вероятно, заключается в том, что указал пользователь3666197: вам нужно привязать и подключиться к одному и тому же IP. Я не уверен, что вы собираетесь использовать с 0.0.0.0
адресом, и он не должен работать даже на вашем локальном компьютере, если вы не нашли какой-то недокументированный уголок вашего сетевого стека, который поддерживает это поведение.
Другое дело, что вы либо хотите включить свой send
вызов в свой обратный вызов, либо, вероятно, хотите использовать bindSync
, чтобы убедиться, что сокет привязан, прежде чем пытаться что-либо отправить. Возможно, происходит то, что сокет отбрасывает ваше отправленное сообщение, потому что сокет не завершил привязку к тому времени, когда вы перейдете к вызову. Это вполне может отличаться на разных машинах.
Комментарии:
1. Ранее это было на самом деле 127.0.0.1, а также пробовал общедоступный DNS. Когда это не удалось на сервере ec2, только тогда я попробовал 0.0.0.0. Я попробую bindSync
2. Даже bindSync не сильно помог.
Ответ №3:
Проблема в том, что я использую кластерный модуль nodejs, и в каждой работе создается сокет zmq pub, который привязывается к тому же порту, что портит проблему. На моей локальной машине появляется один рабочий.
Комментарии:
1. Это имеет смысл. Пожалуйста, не забудьте отметить свой ответ принятым, как только вы сможете это сделать.
2. Спасибо Джейсону за быструю поддержку.