我目前正在开发一个需要通过网络进行通信的项目,而我正在使用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。我将不胜感激任何帮助!
答案 0 :(得分:0)
这是一个非常复杂的例子,但有一些问题需要提及:
与永远封锁的客户有什么关系?
(while (1) { this_thread::sleep_for(milliseconds(1));}
)
使用DealerSocket
RouterSocket
通讯时,您应该模仿RequestSocket
ResponseSocket
。在您的客户端和工作人员中,您忘记在内容之前添加空框架,这意味着您不符合zmq协议。
这些问题实际上都不是你的问题,但是不遵守zmq规则会产生奇怪的效果。