Node.js 在zeromq.js中使用ZMQ_XPUB_手册
我正在尝试使用ZeroMQ实现一个发布/订阅代理,其中可以限制客户端订阅不允许订阅的前缀。我找到了一个尝试使用Node.js 在zeromq.js中使用ZMQ_XPUB_手册,node.js,typescript,zeromq,Node.js,Typescript,Zeromq,我正在尝试使用ZeroMQ实现一个发布/订阅代理,其中可以限制客户端订阅不允许订阅的前缀。我找到了一个尝试使用ZMQ\u XPUB\u手册选项实现类似功能的。使用,可以设置此选项: import * as zmq from "zeromq"; // ... const socket = new zmq.XPublisher({ manual: true }); 设置此选项后,我可以通过在此套接字上调用.receive()来接收订阅消息: const [msg] = awai
ZMQ\u XPUB\u手册
选项实现类似功能的。使用,可以设置此选项:
import * as zmq from "zeromq";
// ...
const socket = new zmq.XPublisher({ manual: true });
设置此选项后,我可以通过在此套接字上调用.receive()
来接收订阅消息:
const [msg] = await socket.receive();
但是我不知道如何接受这个订阅。通常这是通过使用ZMQ\u SUBSCRIBE
调用setSockOpt
来完成的,但我不知道如何使用zeromq.js
来完成
有没有一种方法可以使用zeromq.js
调用setSockOpt
,或者有其他方法可以接受订阅
编辑
我尝试了user3666197的建议,直接调用setSockOpt
,但我不知道该怎么做。我没有这样做,而是再次查看了资料来源,发现:
似乎setSockOpt
作为Socket
类的受保护方法暴露在TypeScript端。为了尝试这一点,我创建了自己的类,该类继承XPublisher并公开了一条acceptSubscription
消息:
class CustomPublisher extends zmq.XPublisher {
constructor(options?: zmq.SocketOptions<zmq.XPublisher>) {
super(options);
}
public acceptSubscription(subscription: string | null): void {
// ZMQ_SUBSCRIBE has a value of 6
// reference:
// https://github.com/zeromq/libzmq/blob/master/include/zmq.h#L310
this.setStringOption(6, subscription);
}
}
class CustomPublisher扩展了zmq.XPublisher{
构造函数(选项?:zmq.SocketOptions){
超级(期权);
}
公共acceptSubscription(订阅:字符串| null):无效{
//ZMQ_SUBSCRIBE的值为6
//参考:
// https://github.com/zeromq/libzmq/blob/master/include/zmq.h#L310
本.setStringOption(6,认购);
}
}
这很有魅力!但是不要忘记去掉订阅消息的第一个字节,否则您的客户端将不会收到任何消息,因为前缀不匹配
Q:“有没有办法用zeromq.js
调用setSockOpt()
,或者有没有其他办法接受订阅?”所以,让我首先提到Somdoron,出于怀疑&多年来一直是ZeroMQ工具的大师 接下来是问题。在我看来,GitHub源代码(我能够查看atm)允许
ZMQ\u XPUB
-Socket原型处理本机APIZMQ\u XPUB\u MANUAL
设置(重新修饰为MANUAL
-property,一种惯用的转换),但没有提供任何方法(到目前为止对我来说是可见的)要实际允许用户满足本机API显式协议:
ZMQ\u XPUB\u手动
:将订阅处理更改为手动。
使用手动模式时,订阅请求不会添加到订阅列表中。要添加订阅,用户需要在
XPUB
socket上使用ZMQ\u SUBSCRIBE
调用setsockopt()
。/\uuuuuuuu来自ZeroMQ native API v.4.3.2文档__/ 尝试盲调用继承的
套接字可能会证明我错了,但是如果成功,它可能是一种将{ZMQ_SUBSCRIBE | ZMQ_UNSUBSCRIBE}
订阅管理步骤注入当前已切换到ZMQ_XPUB_手动模式的XPUB
-实例的方法
请测试它,如果它无法通过这个超类继承方法工作,最短的补救办法就是直接向zeromq.js
维护人员声明冲突/概念缺陷(这可能是一个W.I.p.项目,在他们实际的v6+重构积压中更深入,所以我对这两种情况都祈祷)