CoffeeScript ZMQ Pub не отправляет сообщения

#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. Спасибо Джейсону за быструю поддержку.