【问题标题】:ZeroMQ: Can subscribers publish?ZeroMQ:订阅者可以发布吗?
【发布时间】:2016-03-03 04:56:46
【问题描述】:

我正在尝试实现一个我在 Node.js 中使用 0mq 开发的 pub/sub 应用程序的想法。我想将消息的发布用作一种事件系统。

这是一个示例:假设我有一个发布者和两个订阅者。

每当文件更改时,发布者都会发送一条消息:

//publisher.js
'use strict';

const fs = require('fs'),
      zmq = require('zmq'),

// create publisher endpoint
publisher = zmq.socket('pub'),

filename = 'target.txt';

fs.watch(filename, function(){
  // send message to any subscribers
  publisher.send('files changed');
});

// listen on TCP port 5432
publisher.bind('tcp://*:5432', function(err) {
  console.log('Listening for zmq subscribers...');
});

订阅者 #1 记录控制台上发生的所有事情:

//subscriber1.js
'use strict';

const zmq = require('zmq'),
      subscriber = zmq.socket('sub');

// subscribe to all messages
subscriber.subscribe('');

// handle messages from publisher
subscriber.on("message", function(data) {
    console.log('Got a message: ' + data);
});

// connect to publisher
subscriber.connect("tcp://localhost:5432");

订阅者 #2 验证对文件的更改并发送消息让我们知道它看起来没问题:

//subscriber2.js
'use strict';

const zmq = require('zmq'),
      subscriber = zmq.socket('sub');

// subscribe to all messages
subscriber.subscribe('');

// handle messages from publisher
subscriber.on("message", function(data) {
    //pretend I did some work here

    subscriber.send('File looks great!');
});

// connect to publisher
subscriber.connect("tcp://localhost:5432");

我期望的是,通过套接字从订阅者 2 发回一条消息会将其转发给订阅者 1,后者将记录它。但这似乎没有发生。

我可能从根本上误解了 pub/sub,但是有可能做我所说的吗?如果是这样,我是否需要使用不同的模式,还是我只是使用了 zmq API 错误?

【问题讨论】:

  • 订阅者——顾名思义——不能发布任何东西。如果你想 send 消息你需要不同类型的套接字(你自己的发布者 sock,或设置一个 REQ/REP 对,或其他东西......)。 ZMQ 应用程序使用多个不同类型的套接字是很常见的。
  • 那么,我的subscriber2.js 是否可以创建一个新的发布套接字,发送一条消息,然后销毁发布套接字?这是正确的做法吗?
  • 其实刚刚试了一下,还是不行。所以现在我想知道,在subscriber2.js 中是否需要其他类型的套接字?可能是路由器还是dealer?多个套接字订阅多个其他套接字是否常见?所以我的代码必须管理这些套接字之间的订阅?

标签: node.js zeromq


【解决方案1】:

我必须做一些额外的管道工作才能获得我正在寻找的结果。

必须向subscriber-publisher.js 添加一个发布者套接字,并从它发布到不同的端口。然后我必须将subscriber.js 订阅到由publisher.js 和subscriber-publisher.js 发布的两个端口。

所以现在我明白,为了使用 pub-sub 做到这一点,我必须构建更多的套接字,并且我认为必须做更多的手动订阅。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 2015-09-14
    • 1970-01-01
    相关资源
    最近更新 更多