【问题标题】:zmq socket not working after a period of timezmq socket 一段时间后不工作
【发布时间】:2015-01-31 13:21:17
【问题描述】:

我有一个程序,客户端有一个 ZMQ_SUB 套接字,服务器端有一个 ZMQ_PUB 套接字,客户端订阅服务器:

非常简单的代码:

客户端:

zmq::socket_t subscriber(context, ZMQ_SUB);     
subscriber.connect("tcp://xxx:xxx");    
subscriber.setsockopt(ZMQ_SUBSCRIBE, "", 0);

服务器端:

zmq::socket_t publisher(zmqContext, ZMQ_PUB);
publisher->bind("tcp://*.xxx");

我在客户端和服务器之间使用另一对 ZMQ_REQ、ZMQ_REP 套接字。每次客户端通过ZMQ_REQ套接字向服务端发送一些请求,服务端通过ZMQ_REP套接字接收,做一些工作,通过REP套接字响应,同时生成一堆消息,通过ZMQ_PUB发布插座。

大多数时候,客户端能够从 ZMQ_SUB 套接字接收消息,但我确实有客户端没有接收到这些消息的情况。

消息保证在服务器端生成,并在生成时立即发布。

正常吗?或者我的使用/设置有什么问题,导致这种不确定的行为。 (客户端SUB套接字有时不接收消息)

【问题讨论】:

  • 您可能想阅读 whathaveyoutried.com 并表达对 StackOverflow 社区的尊重,该社区强烈鼓励发布高质量的问题以及 MCVE (a Minimum-Complete-Verifiable-Example of code ) 显示到目前为止您已经尝试过的内容。 您可能想要更新您的帖子,以达到最低合理的质量水平并表明您尊重的意愿其他 StackOverflow 贡献成员。他们是喜欢回答有关 MCVE 相关问题的好问题的专业人士。 享受成为 StackOverflow 贡献成员并支持此社区礼节

标签: c++ network-programming zeromq publish-subscribe


【解决方案1】:

正常吗?

这样的问题很容易被问到,但在没有其他详细信息和上下文可用的情况下很难得到回答。

ZeroMQ 伟大的 Pieter HINTJENS 著作 "Code Connected Volume 1" 中的“缺少消息问题”一章提到了一些关于这个主题的一般原则


• 在SUB 套接字上,使用zmq_setsockopt()ZMQ_SUBSCRIBE 设置订阅,否则您将不会收到消息。因为你是通过前缀订阅消息的,所以如果你订阅""(一个空订阅),你会得到一切。

• 如果您在PUB 套接字开始发送数据之后启动SUB 套接字(即建立到PUB 套接字的连接),您将丢失它在建立连接之前发布的任何内容。如果这是一个问题,请设置您的体系结构,使SUB 套接字首先启动,然后PUB 套接字开始发布。

• 即使您同步SUBPUB 套接字,您仍然可能会丢失消息。这是因为在实际创建连接之前不会创建内部队列。如果您可以切换bind/connect 方向,使SUB 套接字bind-s 和PUB 套接字connect-s,您可能会发现它更符合您的预期。

• 如果您使用REPREQ 套接字,并且您没有坚持同步send/recv/send/recv 顺序,ØMQ 将报告错误,这你可能会忽略。然后,看起来您正在丢失消息。如果您使用REQREP,请遵循send/recv 的顺序,并始终在实际代码中检查ØMQ 调用中的错误。

• 如果您使用PUSH 套接字,您会发现第一个连接的PULL 套接字将获取不公平的消息份额。只有当所有PULL 套接字都成功连接时,消息的准确轮换才会发生,这可能需要几毫秒。作为PUSH/PULL 的替代方案,对于较低的数据速率,请考虑使用ROUTER/DEALER 和负载平衡模式。

• 如果您要跨线程共享套接字,不要。它会导致随机的怪异和崩溃。

• 如果您使用的是inproc,请确保两个套接字位于相同的context 中。否则连接侧实际上会失败。另外,首先是bind,然后是connectinproc 不是像 tcp 这样的断开连接的传输。

• 如果您使用ROUTER 套接字,很容易通过发送格式错误的身份帧(或忘记给send 身份帧)意外丢失消息。一般来说,在ROUTER 套接字上设置ZMQ_ROUTER_MANDATORY 选项是个好主意,但也要检查每个send 调用的返回码。

• 最后,如果您确实无法找出问题所在,制作一个重现问题的最小测试用例,并向 ØMQ 社区寻求帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-13
    • 2013-11-19
    • 2013-12-20
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多