ZeroMQ 永久 PULL 套接字

ZeroMQ permanent PULL socket

我一直在应用程序中使用 PUSH/PULL 模式,它按预期工作,除非我突然关闭计算机或拔下 PULL 端的以太网电缆。

PUSH 端继续与其他 PULL 套接字一起工作,但保持关闭套接字,就好像还活着一样。

我修改了 TCP 参数(间隔、计数...)但没有结果。

是否可以在关闭主机或移除以太网电缆的情况下避免此连接?

编辑:

这是我做的小测试

server.py

import zmq
import time

context = zmq.Context()
socket = context.socket(zmq.PUSH)
socket.setsockopt(zmq.RCVHWM, 1)
socket.setsockopt(zmq.SNDHWM, 1)
socket.setsockopt(zmq.LINGER, 0)
socket.setsockopt(zmq.IMMEDIATE, 1)
print(socket.sndtimeo)
socket.sndtimeo = 0

socket.setsockopt(zmq.TCP_KEEPALIVE,1)
socket.setsockopt(zmq.TCP_KEEPALIVE_CNT,1)
socket.setsockopt(zmq.TCP_KEEPALIVE_IDLE,1)
socket.setsockopt(zmq.TCP_KEEPALIVE_INTVL,1)
socket.bind('tcp://*:5555')
count= 0
while True:
    print('Sending', count)
    try:
        socket.send(str(count).encode('utf-8'), zmq.NOBLOCK)
        count+= 1
        print('Ok')
    except zmq.error.Again:
        print('Error')
    time.sleep(0.1)

client.py

import zmq
import time
import sys
#from common import time_utils

context = zmq.Context()
socket = context.socket(zmq.PULL)
server = '127.0.0.1:5555'
try:
    server = sys.argv[1]
except IndexError:
    pass
socket.setsockopt(zmq.TCP_KEEPALIVE,1)
socket.setsockopt(zmq.TCP_KEEPALIVE_CNT,1)
socket.setsockopt(zmq.TCP_KEEPALIVE_IDLE,1)
socket.setsockopt(zmq.TCP_KEEPALIVE_INTVL,1)
socket.setsockopt(zmq.RCVHWM, 1)
socket.connect(server)
while True:
#  Wait for next request from client
    message = socket.recv()
    print("Received request: ", message)

运行 一个服务器实例和 2 个客户端(一个在运行服务器的同一台机器上,一个在另一台计算机上)。移除第二台计算机的以太网电缆导致服务器在一段时间内不断向第二台客户端发送消息。

如您所见,我已经测试了所有 setsockopt

Q : Is it possible to avoid this connection even when the host Computer is switched off?

对于面向连接的传输 类,您可以 .setsockopt( zmq.IMMEDIATE, 1 ) 以避免在 PUSH 端存储传出消息以获得死连接。

作为附加步骤,可以添加另一个明确的 ACK/NACK 信号流,这可能有助于独立和明确地检测死机未响应 ACK/NACK- 的任何此类事件循环。

尝试使用 ZMTP ping/pong 选项。这些应该检测连接丢失,因为它运行在比 TCP 套接字更高的级别(连接断开后可以保持打开状态)

ZMQ_HEARTBEAT_IVL, ZMQ_HEARTBEAT_TIMEOUT and ZMQ_HEARTBEAT_TTL

http://api.zeromq.org/4-3:zmq-setsockopt