2 Stimmen

ZeroMQ XREP -- Endpunkt verschwindet

Ich verwende eine Standard-LRU-Warteschlange, wie im ZeroMQ-Leitfaden definiert Abbildung 41 und ich frage mich, wie ich einen Schutz hinzufügen kann, damit ich keine Nachrichten an Endpunkte sende, die verschwunden sind (Serverabsturz, OOM-Killer, irgendetwas in dieser Richtung).

In der Dokumentation habe ich gelesen, dass XREP die Nachricht einfach fallen lässt, wenn sie an einen nicht existierenden Endpunkt geht, und es gibt keine Möglichkeit, mich darüber zu benachrichtigen. Gibt es eine Möglichkeit, eine solche Benachrichtigung zu erhalten? Sollte ich einfach zuerst einen "Ping" senden, und wenn ich keine Antwort erhalte, ist der "Worker" für mich gestorben? Woher weiß ich, dass es derselbe Client ist, an den ich gerade den Ping gesendet habe und von dem ich die Nachricht zurückbekomme?

Oder ist mein Anwendungsfall nicht geeignet für ZeroMQ? Ich möchte nur sicherstellen, dass eine Nachricht empfangen wurde. Ich möchte nicht, dass sie ohne mein Wissen auf den Boden fällt...

3voto

Samuel Tardieu Punkte 2051

Das Anpingen eines Workers, um zu erfahren, ob er noch lebt, führt zu einer Race Condition: Der Worker könnte den Ping beantworten, kurz bevor er stirbt.

Wenn man jedoch davon ausgeht, dass ein Arbeitnehmer nicht sterben wird während eine Anfrage bearbeiten (in diesem Fall können Sie wenig tun), können Sie den Kommunikationsfluss zwischen den Arbeitern und der zentralen Warteschlange umkehren. Lassen Sie den Arbeiter eine Anfrage aus der Warteschlange holen (unter Verwendung einer REQ / REP Verbindung) und lassen Sie es die Antwort zusammen mit dem Originalumschlag senden, wenn die Verarbeitung abgeschlossen ist (über denselben Socket wie oben, oder noch besser über eine separate PUSH / PULL Verbindung).

Bei diesem Szenario wissen Sie, dass ein toter Worker keine Anfragen erhält, da er sie nicht abrufen kann (weil er tot ist ). Darüber hinaus kann Ihre zentrale Warteschlange sogar sicherstellen, dass sie auf jede Anfrage in einer bestimmten Zeit eine Antwort erhält. Wenn dies nicht der Fall ist, kann sie die Anfrage zurück in die Warteschlange stellen, so dass sie kurz darauf von einem neuen Arbeiter abgeholt wird. Selbst wenn ein Worker während der Bearbeitung einer Anfrage stirbt, wird die Anfrage auf diese Weise schließlich bedient.

(Nebenbei bemerkt: Seien Sie vorsichtig, wenn der Worker wegen einer bestimmten Anfrage abstürzt - Sie wollen Ihre Worker nicht einen nach dem anderen töten und sollten vielleicht eine maximale Anzahl von Versuchen für eine Anfrage festlegen)

編集する。 Ich schrieb einige Codes Implementierung die andere Richtung um zu erklären, was ich meine.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X