ZeroMQ 永久拉套接字



我一直在应用程序中使用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.

即使主机关闭,是否可以避免此连接?

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

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

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

ZMQ_HEARTBEAT_IVL, ZMQ_HEARTBEAT_TIMEOUT and ZMQ_HEARTBEAT_TTL

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

最新更新