Zauważyłem, że zeromq gniazdo PUB będzie buforuje wszystkie dane wychodzące jeśli jest podłączenie npZeroMQ gniazdo PUB buforuje całe wychodzącej danych, gdy jest łączący
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 wiąże po tych wiadomościach, że powinien zostać usunięty, ponieważ PUB powinien usuwać wiadomości, jeśli nikt do niego nie łączy. Ale zamiast upuszczać wiadomości, buforuje wszystkie wiadomości.
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
Jak widać, te „wiadomości nie powinny zostać pominięte” są buforowane przez gniazdo, raz robi podłączeniu go opróżnić je do gniazda SUB. Jeśli zwiążę gniazdo PUB i połączę się z gniazdem SUB, to działa poprawnie.
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())
i można zobaczyć tylko wyjście
'hi'
Takie dziwne zachowanie powodować problemu, to buforuje wszystkie dane na gnieździe łączącym, mam dwa serwery, Serwer publikuje danych na serwerze B
Server A -- publish --> Server B
Działa dobrze, jeśli serwer B zostanie podłączony do trybu online. Ale co jeśli uruchomię serwer A i nie uruchomię serwera B?
W rezultacie, łączące gniazdo PUB na serwerze A przechowuje wszystkie te dane, zużycie pamięci staje się coraz wyższe.
Oto problem, czy tego rodzaju zachowanie jest błędem lub funkcją? Jeśli jest to funkcja, gdzie mogę znaleźć dokument wspominający to zachowanie? I w jaki sposób mogę przerwać podłączanie gniazda PUB do wszystkich danych?
Dzięki.
Wiem, że mogę ustawić HWM, aby ograniczyć liczbę wiadomości w buforze. Ale to nie rozwiązuje problemu, ale sposób, w jaki PUB obsługuje stan HWM, to zrzucanie nowych wiadomości. Oznacza to, że jeśli ustawisz HWM, tylko wiodące wiadomości będą przechowywane w buforze. To, co piszę, to system przesyłania strumieniowego audio. Tego rodzaju zachowanie sprawia, że korzystanie z niego jest bardzo irytujące. Powiedzmy, że wysyłasz wiadomości [1, 2, 3, 4], a następnie HWM ustawiono na 2, wtedy gniazdo buforuje [1, 2] dla ciebie, wszystkie nowe wiadomości są usuwane. Ale w przypadku przesyłania strumieniowego dźwięku najważniejszą częścią są nowe nadchodzące dane. Czy istnieje sposób na dostosowanie sposobu, w jaki HWM odrzuca wiadomość? –
Ach, więc masz na myśli zachowanie, które chciałbyś, żeby HWM było ustawione na 2 i wysyłałeś [1, 2, 3, 4], wtedy powinno spaść [1, 2] i zachować [3, 4], ale potem jeśli wysłałeś 5, powinien upuścić 3, a skończysz z [4, 5]? Nie sądzę, że takie zachowanie istnieje w ZMQ. – aculich
To jest bardzo interesujące. Z pewnością możliwość odrzucenia "starszych" wiadomości byłaby konieczna w przypadku niektórych aplikacji (typowa jest telefonia IP). –