zmq Extended pub sub ({pub, pub, ...} -> {xsub->xpub} -> {sub, sub, ...}



我正在尝试实现类似图14-Extended Pub-Sub中描述的模型.

我看过这个片段,效果很好。但是当尝试实现第一部分(即:{pub, ...} -> {xsub时,我在xsub套接字上没有接收到任何数据。

以下代码永远阻塞,而不是接收消息:

use zmq::{Context, SocketType::XSUB, PUB};
const ADDRESS_XSUB: &'static str = "tcp://127.0.0.1:9123";
fn main() {
let context = Context::new();
let xsubscriber = {
let socket = context.socket(XSUB).unwrap();
socket.bind(ADDRESS_XSUB).unwrap();
socket
};
let publisher = {
let context = Context::new();
let socket = context.socket(PUB).unwrap();
socket.connect(ADDRESS_XSUB).unwrap();
socket
};
publisher.send("", zmq::SNDMORE).unwrap();
publisher.send("HI", 0x00).unwrap();
assert_eq!(b"HI".as_ref(), &xsubscriber.recv_bytes(0).unwrap());
}

XSUB通常与XPUB配对以创建一个单独的代理,这允许在许多发布者和订阅者之间路由订阅消息和数据。

如果要使用XSUB,则需要向XSUB套接字发送一条订阅消息(第一个字节0x1,后面跟着filter(。

为了确保代码正常工作,我建议将XSUB切换为SUB,并使用空的"空"调用订阅API"滤器

此外,在发送消息之前,请确保订阅服务器已连接到发布服务器。发布服务器仅在建立连接后对消息进行排队。

https://github.com/xeekst/rust-learn/tree/main/zmq-test/multi-pub-to-multi-sub

这是一个通过XPUB/XSUB代理服务器从多发布者到多订阅者的rust-zmq示例

[XSUB XPUB代理img]https://i.stack.imgur.com/AuMMa.png

最新更新