我注意到 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 怎么办?
结果,服务器 A 上的连接 PUB 套接字保留了所有这些数据,内存使用率越来越高。
问题来了,这种行为是错误还是功能?如果是功能,我在哪里可以找到提到此行为的文档?以及如何停止连接的 PUB 套接字缓冲所有数据?
谢谢。