ZeroMQ постоянная PULL розетка - PullRequest
       89

ZeroMQ постоянная PULL розетка

1 голос
/ 24 января 2020

Я использовал шаблон PUSH/PULL в приложении, и он работает как положено, за исключением случаев, когда я резко выключаю компьютер или отсоединяю кабель ethe rnet в стороне PULL.

Сторона PUSH продолжает работать с другими сокетами PULL, но поддерживает отключенный сокет, как будто он еще жив.

Я изменил параметры TCP (интервал, количество ...) безрезультатно .

Можно ли избежать этого соединения, даже если хост-компьютер выключен или удален кабель ethe rnet?

РЕДАКТИРОВАТЬ:

Это небольшой тест я сделал

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 клиентов (один на той же машине, что запускает сервер и один на другом компьютере). Удаление кабеля ethe rnet второго компьютера приводит к тому, что сервер некоторое время продолжает отправлять сообщения второму клиенту.

Как вы можете видеть, я протестировал все setsockopt.

Ответы [ 2 ]

2 голосов
/ 24 января 2020

Q : Возможно ли избежать этого соединения , даже когда главный компьютер выключен?

Для транспортных классов, ориентированных на соединение, вы можете .setsockopt( zmq.IMMEDIATE, 1 ), чтобы избежать хранения исходящих сообщений на стороне PUSH для неработающего соединения.

В качестве дополнительного шага можно добавить другой явный ACK/NACK поток сигналов, который может помочь независимо и в явном виде обнаружить любое подобное событие мертвого человека, не отвечающего на ACK/NACK -l oop (s).

1 голос
/ 30 января 2020

Попробуйте использовать параметры пинг / понга ZMTP. Они должны обнаружить потерянное соединение, так как оно работает на более высоком уровне, чем сокеты TCP (которое можно держать открытым после разрыва соединения)

ZMQ_HEARTBEAT_IVL, ZMQ_HEARTBEAT_TIMEOUT and ZMQ_HEARTBEAT_TTL

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

...