将ZMQ_XPUB_MANUAL与zeromq.js结合使用

时间:2020-07-31 13:07:04

标签: node.js typescript zeromq

我正在尝试使用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);
  }
}

这就像一种魅力!但是请不要忘记删除订阅消息的第一个字节,否则您的客户端将不会收到任何消息,因为前缀不匹配。

1 个答案:

答案 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 +重构积压,因此无论哪种情况,我的手指都要交叉,还要对他们的勇敢工作表示敬意。)

相关问题