ZMQ经销商 - 路由器 - 经销商模式

时间:2015-07-21 15:01:33

标签: c++ multithreading zeromq

我目前正在开发一个需要通过网络进行通信的项目,而我正在使用ZMQ。该项目的主要目标是建立一个中心节点,为可以随时连接的客户提供服务。对于连接的每个客户端,中央节点应该生成相应的工作线程并代理两者之间的通信。所有的沟通都是通过tcp进行的。

客户端和工作人员需要随时发送和接收消息,因此它们是// Init $mySQLDB whith mysql driver etc. // Use $mySQLDB $mySQLDB->query("SELECT * FROM users"); // Init $mongoDB with mongo driver etc. // Use $mongoDB $mongoDB->users->find(); 类型套接字,中心节点为ZMQ_DEALER

我遇到一个问题,经过一段时间后,中央节点(路由器和所有工作人员)中的所有线程都会死锁。在检查所有ZMQ线程的堆栈时,它们在win上的ZMQ_ROUTER和linux上的SockWaitForSingleObject / poll都被阻止。

我做了一些简单的例子来重现问题http://pastebin.com/aUTg7RJY(因为它很长,所以它在pastebin中已经存在)

在示例中,客户端与工作人员处于相同的过程中,并且所有客户端都已预先连接,但在实际情况下,它们不是,但这没有任何区别 - 在这两种情况下问题都是相同的

我尝试修改示例代码以使用epoll_wait协议进行工作 - 节点通信,但问题仍然存在http://pastebin.com/MJBHNyiF

我不知道我的问题是关于网络架构还是我滥用ZMQ lib。我将不胜感激任何帮助!

1 个答案:

答案 0 :(得分:0)

这是一个非常复杂的例子,但有一些问题需要提及:

  • 与永远封锁的客户有什么关系? (while (1) { this_thread::sleep_for(milliseconds(1));}

  • 使用DealerSocket RouterSocket通讯时,您应该模仿RequestSocket ResponseSocket。在您的客户端和工作人员中,您忘记在内容之前添加空框架,这意味着您不符合zmq协议。

这些问题实际上都不是你的问题,但是不遵守zmq规则会产生奇怪的效果。