Frage

Ich verwende eine Standard LRU-Warteschlange gemäß der Definition des ZeroMQ Führungs Abbildung 41 , und ich frage mich, wie in Schutz hinzuzufügen, so dass ich keine Nachrichten senden Punkte zu beenden, die (Server zum Absturz bringen, OOM Killer, irgendetwas in diese Richtung) verschwunden sind.

Aus der Dokumentation ich gelesen, dass XREP wird nur die Nachricht löscht, wenn es zu einem nicht vorhandenen Endpunktes wird, und es gibt keinen Weg, ich darüber benachrichtigt,. Gibt es eine Möglichkeit eine solche Benachrichtigung zu bekommen? Soll ich sende gerade ein „ping“ erste und wenn ich nicht bekommen, eine Antwort dann, dass „Arbeitnehmer“ ist tote Fleisch zu mir? Wie werde ich wissen, dass es die gleiche Client ist, dass ich nur den Ping gesendet, dass ich von der Nachricht zurück bin immer?

Oder ist mein Anwendungsfall nicht gut für ZeroMQ? Ich möchte nur sicherstellen, dass eine Nachricht empfangen wurde, ich will es nicht ohne mein Wissen auf den Boden fallen gelassen wird ...

War es hilfreich?

Lösung

Pinging einen Arbeiter zu wissen, ob es am Leben ist eine Race-Bedingung verursachen. Der Arbeiter gut könnte die Ping-Antwort, kurz bevor es stirbt

Wenn Sie jedoch davon ausgehen, dass ein Arbeiter stirbt nicht bei einer Anforderungsverarbeitung (Sie können in diesem Fall wenig tun), können Sie den Kommunikationsfluss zwischen den Arbeitern und der zentralen Warteschlange umkehren. Lassen der Arbeiter eine Anfrage aus der Warteschlange holen (eine REQ / REP Verbindung) und habe es die Antwort zusammen mit dem ursprünglichen Umschlag senden, wenn die Verarbeitung (unter Verwendung der gleichen Sockel wie oben, oder noch besser durch einen separat PUSH / PULL erfolgt Verbindung).

Mit diesem Szenario wissen Sie, dass ein toter Arbeiter nicht-Anfragen gesendet werden, da sie nicht in der Lage sein werden, sie zu holen (tot ...). Darüber hinaus kann Ihre zentrale Warteschlange auch sicherstellen, dass es eine Antwort auf jede Anforderung in einer bestimmten Zeit empfängt. Wenn dies nicht der Fall, kann er die Anfrage zurück in die Warteschlange gestellt, so dass ein neuer Arbeiter es kurz nach holen wird. Auf diese Weise, auch wenn ein Arbeiter stirbt während der Verarbeitung eine Anforderung, wird die Anforderung schließlich serviert werden.

(als Randnotiz: Seien Sie vorsichtig, wenn der Arbeitnehmer wegen einer bestimmten Anforderung abstürzt - Sie wollen nicht Ihre Arbeiter eins nach dem anderen zu töten, und kann eine maximale Anzahl von Versuchen für eine Anfrage stellen wollen)

Edit: Ich schrieb einige Code Implementierung die andere Richtung zu erklären, was ich meine.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top