【发布时间】: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?多个套接字订阅多个其他套接字是否常见?所以我的代码必须管理这些套接字之间的订阅?