Python ZeroMQ PUSH / PULL - Nachrichten verloren?

8

Ich versuche python mit zeroMQ im PUSH / PULL Modus zu verwenden und sende alle paar Sekunden Nachrichten der Größe 4 [MB] .

Aus irgendeinem Grund scheint es so, als ob alle Nachrichten gesendet wurden, nur EINIGE von ihnen scheinen vom Server empfangen worden zu sein. Was fehlt mir hier?

Hier ist der Code für den Client - client.py

%Vor%

Und hier ist der Code für den Server - server.py

%Vor%

Was vermisse ich? Wie kann ich garantieren, dass Nachrichten immer gesendet und nicht verloren gehen?

Wenn es darauf ankommt, verwende ich Ubuntu 10.04 32bit, Core Duo Maschine mit 2 [GB] RAM.

HINWEIS: Ich habe dasselbe Beispiel mit RabbitMQ versucht und alles funktioniert gut - keine Nachricht ist verloren. Ich bin perplex, da ich oft Lob von zeroMQ höre. Warum ist es fehlgeschlagen, wo RabbitMQ erfolgreich ist?

    
user3262424 15.07.2011, 02:47
quelle

2 Antworten

14

Das Problem ist, dass wenn das Programm beendet wird, der Socket sofort geschlossen wird und Garbage mit einem effektiven LINGER von 0 gesammelt wird (d. h. es werden alle ungesendeten Nachrichten weggeworfen). Dies ist ein Problem für größere Nachrichten, da sie länger zum Senden benötigen, als der Socket als Garbage Collected zu verwenden ist.

Sie können dies vermeiden, indem Sie kurz vor dem Beenden des Programms ein sleep(0.1) setzen (um den Socket und den Kontext zu verzögern, der als Garbage Collected betrachtet wird).

socket.setsockopt(zmq.LINGER, -1) (was der Standardwert ist) sollte dieses Problem vermeiden, aber aus irgendeinem Grund habe ich keine Zeit gehabt, dies zu untersuchen.

    
cwb 15.07.2011, 07:59
quelle
1

Es ist denkbar, dass Ihnen der Arbeitsspeicher knapp wird (abhängig davon, wie Sie Nachrichten senden, ob sie schnell genug konsumiert werden usw.). Sie können socket.setsockopt(zmq.HWM) verwenden, um HWM auf einen vernünftigen Wert zu setzen und zu verhindern, dass zeromq zu viele Nachrichten im ausgehenden Puffer speichert. Betrachten Sie in diesem Zusammenhang leicht modifizierte Beispiele:

%Vor%

Und dann 10 Test-Clients laufen:

%Vor%

Vom Server aus können Sie sehen, dass alle Nachrichten empfangen werden:

%Vor%     
zeekay 15.07.2011 04:42
quelle

Tags und Links