我正在尝试使用ZeroMQ实现发布/订阅代理,在该发布中,可以限制客户端订阅不允许其订阅的前缀。我发现一个tutorial试图使用ZMQ_XPUB_MANUAL
选项来实现类似的目的。使用zeromq.js可以设置此选项:
import * as zmq from "zeromq";
// ...
const socket = new zmq.XPublisher({ manual: true });
设置此选项后,我可以通过在此套接字上调用.receive()
来接收订阅消息:
const [msg] = await socket.receive();
但是我不知道如何接受此订阅。通常,这是通过使用setSockOpt
调用ZMQ_SUBSCRIBE
来完成的,但我不知道如何使用zeromq.js
来做到这一点。
是否可以通过setSockOpt
调用zeromq.js
还是可以接受订阅?
我尝试了user3666197的建议直接调用setSockOpt
,但不确定如何执行此操作。我没有这样做,而是查看了源代码,发现了这一点:https://github.com/zeromq/zeromq.js/blob/master/src/native.ts#L617
似乎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);
}
}
这就像一种魅力!但是请不要忘记删除订阅消息的第一个字节,否则您的客户端将不会收到任何消息,因为前缀不匹配。
答案 0 :(得分:1)
如果一个人从未与ZeroMQ合作过,
在这里人们可能会喜欢先看看 "ZeroMQ: Principles in less than Five Seconds"
深入了解
Q :“是否可以用
setSockOpt()
呼叫zeromq.js
接受订阅 的另一种方式?”
因此,让我首先提到Somdoron,毫无疑问,而且是由来已久的,他是ZeroMQ工具的精通者。
接下来是问题。在我看来,我能够查看atm的GitHub源代码,允许 ZMQ_XPUB
-Socket原型处理本地API ZMQ_XPUB_MANUAL
设置(重新整理)进入manual
-property(惯用的shift),但目前还没有任何方法(到目前为止对我而言尚不可见)实际允许用户满足以下条件的本机API显式协议:
ZMQ_XPUB_MANUAL
:将订阅处理更改为手动
...
,其中手动模式的订阅请求未添加到订阅列表。要添加订阅,用户需要在setsockopt()
套接字上使用ZMQ_SUBSCRIBE
调用XPUB
。
/ __来自ZeroMQ本机API v.4.3.2文档__ /
尝试盲目调用Socket
继承的.SetSockOpt()
method可能证明我是错误的,但如果成功,这可能是将{ ZMQ_SUBSCRIBE | ZMQ_UNSUBSCRIBE }
订阅管理步骤注入{ {1}}实例当前已切换为XPUB
模式。
请对其进行测试,如果它无法通过此超类继承方法起作用,则最短的补救方法是要求将冲突/概念缺陷直接提交给ZMQ_XPUB_MANUAL
维护者(这可能是一个WIP项) ,深入了解他们实际的v6 +重构积压,因此无论哪种情况,我的手指都要交叉,还要对他们的勇敢工作表示敬意。)