zeromq - 如何使用 ZeroMQ PUB/SUB 设置发送字节消息?

标签 zeromq distributed-computing pyzmq low-latency

所以我是 ZeroMQ 的新手,我正在尝试使用 ZeroMQ 发送字节消息,使用 PUB / SUB环境。
编程语言的选择对于这个问题并不重要,因为我使用 ZeroMQ 进行多种语言之间的通信。
这是我在 python 中的服务器代码:

import zmq
import time

port = "5556"
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:%s" % port)
while True:
    socket.send(b'\x84\xa5Title\xa2hi\xa1y\xcb\x00\x00\x00\x00\x00\x00\x00\x00\xa1x\xcb@\x1c\x00\x00\x00\x00\x00\x00\xa4Data\x08')
    time.sleep(1)
这是我在 python 中的客户端代码:
import zmq

context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:5556")

total_value = 0
for update_nbr in range (5):
    string = socket.recv()
    print (string)
我的客户只是阻塞在 string = socket.recv() .
我已经做了一些研究,很明显,如果我要使用 PUB / SUB 发送字符串设置,我需要设置一些“ 主题过滤器 ”才能使其工作。但是如果我要发送一些字节消息,我不确定该怎么做。

最佳答案

ZeroMQ defines protocols, that guarantee cross-platform compatibility of both the behaviours and the message-content .



根本原因:要开始接收消息,必须更改 SUB 套接字的初始“主题过滤器”状态(最初是“什么都不接收”零订阅)

ZeroMQ 是一套可爱的工具,围绕智能原则创建。

其中之一说,在 SUB -side 上什么都不做,直到 .setsockopt( zmq.SUBSCRIBE, ... ) 明确说,要订阅什么,开始检查传入的消息(请记住 zmq-fans初始设计,其中 PUB -side 始终将所有消息分发到每个连接的 SUB -“广播接收器接收每个广播消息”, SUB -side 自行执行“主题过滤”。较新版本的 zmq 反转架构并执行 PUB -side 过滤)。

无论如何,“主题过滤器”的初始状态是有道理的。谁知道应该事先收到什么?没有人。所以什么也得不到。

考虑到您需要或希望开始这项工作,订阅任何内容的简单举动......让我们通过任何消息。

是的,就是这么简单 .setsockopt( zmq.SUBSCRIBE, "" )

如果需要一些基于 key 的处理并且消息具有合理的大小(没有 giga-BLOB),则可以简单地在消息字符串(或有效载荷字节字段)。

当然,如果在 PUB 端执行 zmq 过滤(对旧 API 版本无效),则可以节省一部分传输层开销,否则通常不会在处理消息有效负载的其余部分之前,订阅接收“任何东西”并检查一些预组装的上下文键(前缀子字符串、字节字段等)的消息是一件大事。

最好的下一步:

如果您的代码努力进入生产状态,而不仅仅是作为学术界的例子,则必须做更多的工作,为敌对的现实世界生产环境提供生存性措施。

Pieter HINTJEN 的书 “Code Connected, Vol.1” ( may check my posts on ZeroMQ to find the book's direct pdf-link ) 是执行此操作的绝对好视角 以及使用 ZeroMQ 进行现实设计的好读物。

另外另一个很好的读物来自 Martin SUSTRIK,ZeroMQ 的共同之父,在 low-level truths about the ZeroMQ implementation details & scale-ability

关于zeromq - 如何使用 ZeroMQ PUB/SUB 设置发送字节消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41529415/

相关文章:

php - 为什么我不应该基于 ZeroMQ 构建 web 服务?

c++ - 如何在同一个进程中操作多个 ZeroMQ 套接字类型?

elasticsearch - 节点未加入Elasticsearch 5.1集群中的集群

python - 使用 ipcluster 从从节点读取标准输出

c# - 从 Python 到 C# 的套接字消息通过乱码

matrix - 了解 block 和 block 循环矩阵分布

c# - 有关在.NET中调用分布式系统的批处理建议

python - ZeroMQ中可以实现以下模型吗?

python - 通过 zeromq pyzmq 发送一个数字

c++ - 将 zmq::proxy 与 REQ/REP 模式结合使用