设置后,我想获取订阅者( 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'))
但是,我找不到能检索订户套接字密钥的函数。如何获取套接字的订阅密钥?
答案 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()
回到基础架构,以实现整体目标