微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何让 Zeromq Proxy 更灵活?

如何解决如何让 Zeromq Proxy 更灵活?

我想用zeromq搭建一个通讯库。

支持多发多收。

我认为 zermoq PUB/SUB 模式可以支持多接收器,但适用于多发送器。它可能需要像这样构建一个代理:

void RunExchangeinfoProxy() {
  zmq::context_t context(1);
  zmq::socket_t sub(context,ZMQ_XSUB);
  sub.bind("ipc://public_recv");
  zmq::socket_t pub(context,ZMQ_XPUB);
  pub.bind("ipc://public_send");
  zmq::proxy(sub,pub,NULL);    
}

让我解释一下:因为每个发送者(当然,zmq 中的 recver 都可以)必须绑定一个地址。

这意味着:与第一个绑定相同地址的下一个发送者将踢第一个。因为它绑定了这个地址,第一个发送者失去了这个地址的控制权。

所以,代理的作用是绑定两个固定地址(public_send 和 public_recv)。然后每个发送者连接到 public_send,recvers 连接到 public_recv。可以使多发送者和多接收者工作。

这是我的解决方案,在我的测试中,效果很好。

我的测试代码是:

// sender.cpp
int main() {
  // ZmqSender is a wrapper to wrap bind,create context,socket operation
  // MarketSnapshot is a self-defined struct,i didnt paste them here.
  ZmqSender<MarketSnapshot> *r = new ZmqSender<MarketSnapshot>("public_send","connect");
  std::string s;
  while (std::cin >> s && s != "quit") {
    MarketSnapshot shot;
    snprintf(shot.ticker,sizeof(shot.ticker),"%s",s.c_str());
    r->Send(shot);
    cout << "sending " << s << "" << endl;
  }
}

// recver.cpp
int main() {
  auto q = CreateRecver<ZmqRecver,MarketSnapshot>("public_recv");
  auto r = q.get();
  std::string s;
  while (true) {
    MarketSnapshot shot;
    r->Recv(shot);
    shot.Show(stdout);  // show is a print function of MarketSnapshot
  }
}

我启动代理,3 个发送者和 3 个接收者。发送和接收工作正常。

但问题是:

我需要先启动代理代码。然后发送方和接收方就可以工作了。

这可能不太好,因为我可能会忘记先启动代理。

所以,我想我可以将代理代码插入到发送者和接收者中。让他们在构建之前启动代理。

但是在这解决方案中:

  1. 每个发送者和接收者都会有另一个线程(代理线程)
  2. 我不知道多个代理是否会发生冲突。

如果有任何方法我可以用来检查代理是否正在运行。

但是我在 zmq 文档中没有找到这个东西。

那么,您有什么建议可以轻松构建多发送方和多接收方组件吗?

我想要的是一个sender和一个recver类,它们可以是独立的,并且可以正确发送msg。

谢谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。