Я заметил, что сокет 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()
Подвязки после этих сообщений, они должны быть отброшены, потому что 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 для всех данных?
Спасибо.