たとえば、ゼロmq 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'
この種の奇妙な動作は問題を引き起こします。接続ソケット上のすべてのデータをバッファリングします。サーバーが 2 台あり、サーバー A がデータをサーバー B に発行します。
Server A -- publish --> Server B
サーバー B がオンラインになると、正常に動作します。しかし、サーバー A を起動し、サーバー B を起動しないとどうなりますか?
その結果、サーバー A の接続 PUB ソケットはこれらすべてのデータを保持し、メモリ使用量はますます高くなります。
ここに問題があります。この種の動作はバグですか、それとも機能ですか? 機能の場合、この動作について言及しているドキュメントはどこにありますか? また、接続中の PUB ソケットがすべてのデータをバッファリングするのをどのように停止できますか?
ありがとう。