node-nanomsg — подписчик не получает сообщения

У меня есть два .js файла - pub.js для публикации и sub.js для подписки. Эти файлы на самом деле являются «разделенной» версией примера, показанного на node-nanomsg GitHub. сайт. pub.js пишет в tcp://127.0.0.1:7789, а sub.js читает из него же. Сначала я запускаю sub.js, а затем pub.js. В то время как pub.js завершается быстро, sub.js никогда не получает сообщение.

pub.js

var nano = require('nanomsg')
var pub = nano.socket('pub')
pub.bind('tcp://127.0.0.1:7789')
//
pub.send('Hello')
pub.close()

sub.js

var nano = require('nanomsg')
var sub = nano.socket('sub')
sub.connect('tcp://127.0.0.1:7789')
//
sub.on('data', function(buf) {
    console.log(String(buf))
    sub.close()
})

ОБНОВИТЬ

Если pub.js записывается, как показано ниже, и sub.js запускается первым, то связь проходит.

var nano = require('nanomsg')
var pub = nano.socket('pub')
pub.bind('tcp://127.0.0.1:7789')
//
setTimeout(() => {
    pub.send('Hello')
},2000)
//pub.close()

Но парадигма pub-sub не требует, чтобы издатели и подписчики знали друг о друге. Как включить систему pub-sub с nanomsg?


person cogitoergosum    schedule 20.11.2018    source источник
comment
Не имеет особого смысла. Вы уверены, что не запустили pub.js первым в исходном примере? Единственная разница между исходным кодом и обновлением заключается в том, что вы добавляете тайм-аут к pub.js. Что, если вы просто подождите 2 секунды в исходном примере, а затем запустите pub.js   -  person mihai    schedule 20.11.2018
comment
Вот в чем вопрос. Кажется, это работает только с тайм-аутом.   -  person cogitoergosum    schedule 20.11.2018


Ответы (1)


Похоже, что связь закрывается издателем до завершения привязки сокета tcp.

Библиотека не предоставляет асинхронные версии bind и connect, и кажется, что bind не полностью завершает выполнение, когда функция возвращается. Добавление тайм-аута — это просто обходной путь для этой проблемы.

См. это обсуждение в их репозитории Github: переписать привязку/подключение и удалить setTimeouts из тестов
К сожалению, запрос на включение был закрыт, а функция асинхронности до сих пор не реализована.

Если вы посмотрите на примеры, которые они предоставляют, вы увидите, что все они основаны на тайм-аутах. , что означает, что проблема признана разработчиками. На мой взгляд, эта библиотека не готова к использованию в производстве из-за зависимости от тайм-аутов.

person mihai    schedule 20.11.2018
comment
Спасибо за объяснение. Я думаю, эта проблема существует и с Ømq. - person cogitoergosum; 20.11.2018
comment
Не уверен, я вижу, что 0mq предоставляет как bind, так и bindSync: github.com/zeromq/zeromq.js/blob/master/lib/index.js#L435 - person mihai; 20.11.2018