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
Und hier ist der Code für den Server - server.py
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?
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.
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:
Und dann 10 Test-Clients laufen:
%Vor%Vom Server aus können Sie sehen, dass alle Nachrichten empfangen werden:
%Vor%