zeromq发布订阅
时间: 2025-05-28 21:51:41 浏览: 10
### ZeroMQ 发布订阅模式详解
#### 实现与使用概述
ZeroMQ 的发布订阅模式允许一个或多个发布者向一组或多组订阅者发送消息。这种模式非常适合用于事件驱动架构中的解耦合组件间的通信[^1]。
#### 关键特性说明
- **简化 API 调用**:为了降低复杂度并提高易用性,实现了更简洁的API接口设计,使得开发者可以更加专注于业务逻辑而非底层通讯细节。
- **守护线程支持**:对于订阅端的消息接收处理采用了守护线程的方式运行,确保即使主线程结束也能继续监听新到来的数据流。
- **跨平台兼容性**:不仅限于本地环境内的进程间通信,在不同机器之间同样能够高效工作,通过配置不同的传输层协议(如 TCP 或 PGM),可轻松跨越网络边界传递信息[^5]。
#### 示例代码展示
下面给出一段简单的C++版本零MQ发布订阅模型实现:
```cpp
// Publisher.cpp
#include <zmq.hpp>
#include <string>
#include <thread>
int main () {
zmq::context_t context (1);
zmq::socket_t publisher (context, ZMQ_PUB);
// 绑定到指定端口等待连接建立
publisher.bind ("tcp://*:5555");
while(true){
std::this_thread::sleep_for(std::chrono::seconds(1));
// 构造要发布的主题和数据包
zmq::message_t topic(5); memcpy(topic.data(), "HELLO", 5);
zmq::message_t data(6); memcpy(data.data(), "WORLD!", 6);
// 同步地广播出去
publisher.send(topic, zmq::send_flags::sndmore);
publisher.send(data);
}
}
```
```cpp
// Subscriber.cpp
#include <zmq.hpp>
#include <iostream>
using namespace std;
void subscribe(zmq::context_t& ctx, const string addr) {
zmq::socket_t subscriber(ctx, ZMQ_SUB);
subscriber.connect(addr.c_str());
// 设置过滤条件为空字符串表示接受所有话题
subscriber.setsockopt(ZMQ_SUBSCRIBE, "", 0);
while(true){
zmq::message_t topic;
zmq::message_t content;
// 接收两条消息构成的一条完整记录
subscriber.recv(&topic, zmq::recv_flags::none);
subscriber.recv(&content, zmq::recv_flags::none);
cout << "Received message on ["
<< static_cast<char*>(topic.data())
<< "] : "
<< static_cast<char*>(content.data())
<< endl;
}
}
int main(){
zmq::context_t context;
thread t(subscribe, ref(context), "tcp://localhost:5555");
t.join();
}
```
上述例子展示了如何创建一个基本的发布者程序以及对应的订阅者客户端来演示两者之间的交互过程[^3]。
阅读全文
相关推荐
















