Я заметил, что сокет zeromq PUB буферизирует все исходящие данные, если он соединяется, например
import zmq
import time
context = zmq.Context()
# create a PUB socket
pub = context.socket (zmq.PUB)
pub.connect("tcp://127.0.0.1:5566")
# push some message before connected
# they should be dropped
for i in range(5):
pub.send('a message should not be dropped')
time.sleep(1)
# create a SUB socket
sub = context.socket (zmq.SUB)
sub.bind("tcp://127.0.0.1:5566")
sub.setsockopt(zmq.SUBSCRIBE, "")
time.sleep(1)
# this is the only message we should see in SUB
pub.send('hi')
while True:
print sub.recv()
Sub binds после этих сообщений, они должны быть отброшены, потому что PUB должен отбрасывать сообщения, если к нему никто не соединяется. Но вместо того, чтобы отбрасывать сообщения, он буферизирует все сообщения.
a message should not be dropped
a message should not be dropped
a message should not be dropped
a message should not be dropped
a message should not be dropped
hi
Как вы можете видеть, те "сообщения не должны быть сброшены" буферизируются сокетом, как только он подключается, он передает их в сокет SUB. Если я привязываюсь к сокету PUB, а подключаюсь к сокету SUB, то все работает правильно.
import zmq
import time
context = zmq.Context()
# create a PUB socket
pub = context.socket (zmq.PUB)
pub.bind("tcp://127.0.0.1:5566")
# push some message before connected
# they should be dropped
for i in range(5):
pub.send('a message should not be dropped')
time.sleep(1)
# create a SUB socket
sub = context.socket (zmq.SUB)
sub.connect("tcp://127.0.0.1:5566")
sub.setsockopt(zmq.SUBSCRIBE, "")
time.sleep(1)
# this is the only message we should see in SUB
pub.send('hi')
while True:
print repr(sub.recv())
И вы можете видеть только вывод
'hi'
Такое странное поведение вызывает проблему, он буферизирует все данные на соединяющем сокете, у меня есть два сервера, сервер A публикует данные на сервер B
Server A -- publish --> Server B
Он работает нормально, если сервер B находится в сети. Но что если я запущу сервер A и не запущу сервер B?
В результате, соединяющий сокет PUB на сервере A сохраняет все эти данные, использование памяти становится все выше и выше.
Вот в чем проблема, является ли такое поведение ошибкой или особенностью? Если это особенность, то где я могу найти документ, в котором упоминается такое поведение? И как я могу остановить подключение PUB сокета, буферизирующего все данные?
Спасибо.