PyZMQ ( ZeroMQ ) - 如何从 SUB-socket 获取订阅密钥?
PyZMQ ( ZeroMQ ) - How to get a subscription key from a SUB-socket?
我想在设置后获取订阅者(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
不支持从 SUB
套接字获取订阅。您需要将它们存储在您自己的数据结构中(列表、地图等)
一些其他信息:
一个SUB
套接字支持多个同时订阅。
下面这行没有取消订阅 all 键,它实际上取消订阅了有效订阅的键 ""
。
# unsubscribe all keys
sub_sock.setsockopt(zmq.UNSUBSCRIBE, '')
你需要明确:
sub_sock.setsockopt(zmq.UNSUBSCRIBE, "foo1".encode('ascii'))
How can I retrieve the socket's subscription key ( ... after it has been set ) ?
是的,一个可以,但只能在 PUB
一侧(好吧,实际上 XPUB
PUB
-行为原型的克隆)如果已经使用 .setsockopt( { XPUB_VERBOSE | XPUB_VERBOSER }, 1 )
方法仔细配置以便开始服务与频道相关的 (X)SUB
-s在此特定模式下。
因此,在极端需要(在 SUB 端完全失去上下文或对其自身的订阅管理失忆的情况下),可以设置 XSUB 来实例化一个实用的 XPUB
-具有此附加 .setsockopt( { XPUB_VERBOSE | XPUB_VERBOSER }, 1 )
配置的实例,{ .bind() | .connect() }
从-Home-Base 到-Home-Base 的 link,并处理所有到达的 (X)SUB
-订阅详细信息-苍蝇。
本机 API 文档发布了正确执行此操作的所有详细信息。
通过窃听了解自己的订阅详细信息的独特方法,但可行。
最后的评论:
ZeroMQ 主题过滤器以更复杂的方式设计并针对速度进行了优化(高吞吐量,低延迟)。它可以为每个 { .bind() | .connected() }
节点处理数百、数千、数万个订阅。
这些设计愿望和对性能的关注是原因,ex-post 没有这样的功能,要求 "librarian" 查找所有“我自己的”订阅密钥(无论是从未记住还是完全忘记)。
人们可能还意识到,自从 API v4.x 以来,ZeroMQ 本机处理开始在 (X)PUB
端管理主题过滤,而较旧的 API版本报告此性能关键操作被推迟到每个 (X)SUB
-side(s),以增加原始网络流量的累积量为代价,因为所有消息(是的,确实是 ALL MESSAGES )从 (X)PUB
到所有 (X)SUB
-s。有人在这里提到安全问题吗?
# unsubscribe all keys // THIS WILL NOT FLY THAT WAY
同样的推理支持 "missing" API 调用,要求“忘记我自己的所有订阅”,但必须明确取消订阅,以一个接一个的方式,或者正确地 .close()
(X)SUB
侧套接字实例,而是在绿色字段的基础上重新实例化另一个套接字实例,然后重新 { .bind() | .connect() }
将其返回到基础架构, 从而达到整体的既定目标。
我想在设置后获取订阅者(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
不支持从 SUB
套接字获取订阅。您需要将它们存储在您自己的数据结构中(列表、地图等)
一些其他信息:
一个SUB
套接字支持多个同时订阅。
下面这行没有取消订阅 all 键,它实际上取消订阅了有效订阅的键 ""
。
# unsubscribe all keys
sub_sock.setsockopt(zmq.UNSUBSCRIBE, '')
你需要明确:
sub_sock.setsockopt(zmq.UNSUBSCRIBE, "foo1".encode('ascii'))
How can I retrieve the socket's subscription key ( ... after it has been set ) ?
是的,一个可以,但只能在 PUB
一侧(好吧,实际上 XPUB
PUB
-行为原型的克隆)如果已经使用 .setsockopt( { XPUB_VERBOSE | XPUB_VERBOSER }, 1 )
方法仔细配置以便开始服务与频道相关的 (X)SUB
-s在此特定模式下。
因此,在极端需要(在 SUB 端完全失去上下文或对其自身的订阅管理失忆的情况下),可以设置 XSUB 来实例化一个实用的 XPUB
-具有此附加 .setsockopt( { XPUB_VERBOSE | XPUB_VERBOSER }, 1 )
配置的实例,{ .bind() | .connect() }
从-Home-Base 到-Home-Base 的 link,并处理所有到达的 (X)SUB
-订阅详细信息-苍蝇。
本机 API 文档发布了正确执行此操作的所有详细信息。
通过窃听了解自己的订阅详细信息的独特方法,但可行。
最后的评论:
ZeroMQ 主题过滤器以更复杂的方式设计并针对速度进行了优化(高吞吐量,低延迟)。它可以为每个 { .bind() | .connected() }
节点处理数百、数千、数万个订阅。
这些设计愿望和对性能的关注是原因,ex-post 没有这样的功能,要求 "librarian" 查找所有“我自己的”订阅密钥(无论是从未记住还是完全忘记)。
人们可能还意识到,自从 API v4.x 以来,ZeroMQ 本机处理开始在 (X)PUB
端管理主题过滤,而较旧的 API版本报告此性能关键操作被推迟到每个 (X)SUB
-side(s),以增加原始网络流量的累积量为代价,因为所有消息(是的,确实是 ALL MESSAGES )从 (X)PUB
到所有 (X)SUB
-s。有人在这里提到安全问题吗?
# unsubscribe all keys // THIS WILL NOT FLY THAT WAY
同样的推理支持 "missing" API 调用,要求“忘记我自己的所有订阅”,但必须明确取消订阅,以一个接一个的方式,或者正确地 .close()
(X)SUB
侧套接字实例,而是在绿色字段的基础上重新实例化另一个套接字实例,然后重新 { .bind() | .connect() }
将其返回到基础架构, 从而达到整体的既定目标。