sockets - PyZMQ ( ZeroMQ ) - 如何从 SUB-socket 获取订阅 key ?

标签 sockets zeromq publish-subscribe pyzmq

我想在设置后获取订阅者 ( SUB ) 套接字的订阅 key 。

假设我有以下套接字:

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'))

问题:

但是,我找不到可以检索订阅者套接字 key 的函数。如何检索套接字的订阅 key ?

系统:

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

最佳答案

How can I retrieve the socket's subscription key ( ... after it has been set ) ?

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

因此,在极端需要的情况下(在 SUB 端完全失去上下文或对其自己的订阅管理失忆的情况下),可以设置 XSUB 来实例化一个实用的 XPUB 实例,并附加此附加值.setsockopt( { XPUB_VERBOSE | XPUB_VERBOSER }, 1 ) 配置,{ .bind() | .connect() } 从 Home-Base 到 Home-Base 的链接,并即时处理所有到达的 (X)SUB 订阅详细信息。

native API 文档发布了正确执行此操作的所有详细信息。

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


最后评论:

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

这些设计愿望和对性能的关注是原因,没有这样的功能可以事后要求“图书管理员”查找所有“我自己的”订阅 key (无论是从未记住还是完全忘记)。

人们还可能意识到,自 API v4.x 起,ZeroMQ native 处理开始在 (X)PUB 端管理主题过滤,而较旧的 API 版本报告将此性能关键操作推迟到每个 (X)SUB 端 -侧,以增加原始网络流量的累积量为代价,因为所有消息(是的,确实是所有消息)从 (X)PUB 变为所有 (X)SUB -s。有人在这里提到安全问题吗?

# unsubscribe all keys                        // THIS WILL NOT FLY THAT WAY

“丢失”API 调用背后的原因相同,要求“忘记我自己的所有订阅”,但必须以一一的方式明确取消订阅,或者正确地 .close() (X)SUB 端套接字实例,而是在绿地基础上重新实例化另一个套接字实例,并将其重新 { .bind() | .connect() } 返回到基础设施,以便整体实现设定的目标。

关于sockets - PyZMQ ( ZeroMQ ) - 如何从 SUB-socket 获取订阅 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51074564/

相关文章:

c - 将数据传输到工作线程的回调或从工作线程的回调传输数据

c# - FTP监控和新文件下载

javascript - 尝试使用 socket.io 时出错

java - 在 Java 中使用 SUB 与 ZeroMQ 没有消息匹配

linux - 使用 INADDR_ANY 更改 udp 服务器绑定(bind)的默认源 IP

c++ - ZMQ : Sending custom CPP object over the ZMQ queue

zeromq - 无回复请求的 ZMQ 模式

java - RabbitMQ:如何指定要发布到的队列?

java - 是否可以知道 Akka 的 "Distributed Publish Subscribe in Cluster"中收到了哪个主题的消息?

templates - 带参数的模板订阅行为