ZeroMQ PUB socket буферизирует все мои исходящие данные при подключении

Я заметил, что сокет 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 сокета, буферизирующего все данные?

Спасибо.

13
задан Fang-Pen Lin 21 January 2012 в 09:53
поделиться