【问题标题】:ZeroMQ REQ/REP server error handlingZeroMQ REQ/REP 服务器错误处理
【发布时间】:2014-03-05 11:31:45
【问题描述】:

我正在尝试使用 ZeroMQ rep/req,但无法弄清楚如何处理服务器端错误。看here的代码:

socket.bind("tcp://*:%s" % port)
while True:
    #  Wait for next request from client
    message = socket.recv()
    print "Received request: ", message
    time.sleep (1)  
    socket.send("World from %s" % port)

我的问题是如果客户端调用 socket.send() 然后挂起或崩溃会发生什么。服务器不会永远卡在 socket.send() 或 socket.recv() 上吗?

请注意,这不是 TCP 套接字的问题。使用 TCP 套接字,我可以简单地断开连接。使用 ZMQ,连接为我隐式管理,我不知道是否可以中断“会话”或“连接”并重新开始。

【问题讨论】:

    标签: zeromq pyzmq


    【解决方案1】:

    您可以像终止 TCP 套接字一样终止 ZMQ 套接字。

    socket.close()

    如果您需要等待消息但只能等待有限的时间,您可以将timeout 标志传递给socket.recv(timeout=1024),然后以与 TCP 套接字超时或断开连接。如果您需要管理多个可能处于错误状态的套接字,那么 Poller 类将让您完成此操作。

    【讨论】:

    • 在服务器端,如果我做socket.close(),是关闭客户端实例对应的会话还是关闭每个会话,还是关闭监听socket?
    • 取决于套接字类,REQ/REP 与 PUB/SUB 等有不同的行为。
    • 我只对 REP 套接字感兴趣。
    • 我也想知道这个。我修改了下面提到的“懒惰的海盗服务器”示例,发现如果客户端死了,服务器似乎没有问题。所以,谢天谢地,似乎没有问题,除非我错过了什么。
    【解决方案2】:

    ZMQ Z-guide 提供了很多关于如何构建服务以处理不同场景的良好提示。

    我认为您可能会对chapter 4 感兴趣,尤其是懒惰的海盗模式。

    查看Lazy Pirate ServerLazy Pirate Client 的示例。

    【讨论】:

    • 我读过那些。它们提供客户端可靠性。我的问题更简单。我只是想确保 REP 服务器不会卡住。
    【解决方案3】:

    一般来说,

    1. 确保setsockopt() 在套接字上,这样sendrecv 就不会永远阻塞。 (临时阻塞——无论是客户端还是服务器——都可以,但无限阻塞是不好的,因为你的应用程序不能做任何其他事情)
    2. 如果任何 I/O 出现错误,
      • 如果你是客户端,close()当前socket并重新创建一个新的建立新的连接
      • 如果您是服务器,则没有其他事情可做,您只是在等待新的连接。您将想要探索 Poller 课程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 2020-07-17
      • 2013-06-07
      • 2014-10-11
      相关资源
      最近更新 更多