PyZMQ(ZeroMQ)-如何从SUB套接字获取订阅密钥?

时间:2018-06-28 04:06:23

标签: sockets zeromq publish-subscribe pyzmq

设置后,我想获取订阅者( SUB )套接字的订阅密钥。

说我有以下套接字:

import zmq
ctx = zmq.Context.instance()
sub_sock = ctx.socket(zmq.SUB)
sub_sock.bind("tcp://127.0.0.1:6667")
sub_sock.setsockopt(zmq.SUBSCRIBE, "foo1".encode('ascii'))

我想做的是这样的(伪代码):

sub_key = sub_sock.get_sub_key().decode("ascii")
sub_key = subkey[:-1] + "2"  # "foo2"

# unsubscribe all keys
sub_sock.setsockopt(zmq.UNSUBSCRIBE, '')

# subscribe to new key
sub_sock.setsockopt(zmq.SUBSCRIBE, sub_key.encode('ascii'))

问题:

但是,我找不到能检索订户套接字密钥的函数。如何获取套接字的订阅密钥?

系统:

  • Python 3.6
  • libzmq版本:4.2.5
  • pyzmq版本:17.0.0

2 个答案:

答案 0 :(得分:1)

不支持从 SUB 套接字获取订阅。您将需要将它们存储在自己的数据结构(列表,地图等)中

其他一些信息:

SUB套接字支持多个同时订阅。

以下行不会取消订阅所有键,实际上是取消订阅了有效订阅的键 ""

# unsubscribe all keys
sub_sock.setsockopt(zmq.UNSUBSCRIBE, '')

您需要明确:

sub_sock.setsockopt(zmq.UNSUBSCRIBE, "foo1".encode('ascii'))

答案 1 :(得分:1)

  

我如何 如何检索套接字的订阅密钥(设置后,...)

是的,可以,但只能在 PUB 端(好吧,实际上是 XPUB 克隆(PUB-行为原型)中的一个,如果已使用.setsockopt( { XPUB_VERBOSE | XPUB_VERBOSER }, 1 )方法进行了仔细配置,以便在此特定模式下开始为与频道相关的(X)SUB-s提供服务。

因此,在极端需要下(在SUB方面完全丧失上下文或遭受其自身的订阅管理失忆的情况下),可以设置XSUB来实例化功利主义者XPUB-具有附加.setsockopt( { XPUB_VERBOSE | XPUB_VERBOSER }, 1 )配置的实例,{ .bind() | .connect() }链接从家庭到家庭的链接,并即时处理所有到达的(X)SUB订阅详细信息。

本机API文档发布了执行此权限的所有详细信息。

一种独特的方法,可以通过窃听来学习自己的订阅详细信息,但可行。


最后的评论:

ZeroMQ主题过滤器的设计方式更加复杂,并针对速度(高吞吐量,低延迟)进行了优化。它可以为每个{ .bind() | .connected() }对等方处理单位,成百上千个,数万个订阅。

这些设计愿望和对性能的关注是原因,事后没有这样的功能要求“馆员”查找所有“ 我自己的 ”订阅密钥(无论是从不被记住还是被遗忘)。

可能还意识到,自API v4.x以来,ZeroMQ本机处理开始在(X)PUB端管理主题过滤,而较早的API版本则将此性能关键操作推迟到每个(X)SUB端的所有消息(是,实际上,所有MESSAGES)从(X)PUB到所有{{1 }}-s。有人在这里提到安全问题吗?

(X)SUB

“缺少” API调用背后也有同样的道理,要求“ 忘记我自己的所有订阅”,但是必须以一种或一种或多种方式明确地取消订阅{{ 1}} # unsubscribe all keys // THIS WILL NOT FLY THAT WAY 端套接字实例,而是在绿地上重新实例化另一个实例,然后将其重新.close()回到基础架构,以实现整体目标