Frage

Was sind die Vor- und Nachteile einer solchen Datei für die Interprozesskommunikation verwendet? Lassen Sie mich einige Hintergrundinformationen des Kontextes gebe ich diese Frage bin gefragt in.

Das Problem ist das klassische Erzeuger-Verbraucher-Problem mit einigen Einschränkungen. Die Produzenten sind so eingestellt kooperativen Prozess läuft auf einem Cluster von Maschinen und kommunizieren miteinander unter Verwendung von Sendungen. Jeder Prozess hat lokale Benutzer, die es kennt und läßt auch die anderen Prozesse kennen sie durch den oben Broadcast-Mechanismus. Bis jetzt werden die Zustandsinformationen übertragen / geteilt wurde nicht beibehalten werden, aber jetzt muss es sein.

Dieses System auf die Produktion läuft seit seit Jahren Tausende von Benutzern und die Leute sind understandbly sehr besorgt über das Hinzufügen alle zusätzlichen Abhängigkeit zu dieser Unterstützung die Unterstützung für die Persistenz hinzuzufügen. Der Weg, den wir wählten, war ein neues Thema in den bestehenden Prozess zum Laichen, der den lokalen Verkehr in eine Datei auf dem Dateisystem schreibt, die dann durch einen neuen Prozess gelesen (lässt es der Verbraucher nennen) und anhielt. Die Vorteile, die wir mit diesem Ansatz sind:

  1. Wir bekommen Persistenz kostenlos. Incase den neuen Prozess hat Probleme, die wir nicht von dem lokalen Verkehr verlieren werden, wie wir es auf das Dateisystem schreiben. Solange der Verbraucher weiß, wo er aufgehört hat, wann immer es darum geht, kann es die Verarbeitung von Daten beginnen.
  2. Es gibt keine Lernkurve für Warteschlangen mit Bibliotheken ihre normale alte Unix-Datei IO.
  3. Das größte Pro ist, dass wir den aktuellen Produzentenprozess überhaupt, mit Ausnahme des neuen Thread beeinflussen nicht für Datei schreibt.

Einige der Bedenken bei diesem Ansatz sind:

  1. Das Sperren von Dateien und Streit und seine Auswirkungen auf die Leistung.
  2. Sicherstellen, dass die Schreibpuffer sind gerötet und Produzent freigibt nur die Dateisperre einmal ein vollständiges Ereignis in die Datei geschrieben wurde. Der Verbraucher sollte unvollständige Aufzeichnungen lesen.

Die Gedanken? Ist dieser Ansatz zu naiv und sollten wir nur die Anschaffungskosten für die Hochlaufzeit zahlen für ein aus dem Regal beständige Warteschlange Bibliothek? Der wichtigste Punkt hier ist, wir die minimal mögliche Auswirkungen auf den laufenden Prozess und fügen Sie keine Abhängigkeiten zu.

haben wollen
War es hilfreich?

Lösung

Ich war mit dieser Wahl vor kurzem konfrontiert und als genug über Berkeley DB Lernen seine Warteschlange Mechanismus zu verwenden. Aber letztlich habe ich beschlossen, stattdessen das Unix-Dateisystem zu verwenden und meine eigene Atom-Warteschlange Primitiven schreiben mit Posix-Semaphore . Wenn alle Prozesse auf einer Maschine sind, ist dies recht einfach. Die Atom-Put-Funktion ist etwa ein Dutzend Zeilen Code; das Atom get, weil es, wenn die Warteschlange leer warten muss, ist etwa dreimal so groß wie.

Mein Rat ist, dass Sie auf Entwurf einer Atom-Queue API , das diese Details verbergen. (Klassisches Beispiel für folgende Parnas Rat der Verwendung eines Interface-Design Details zu verbergen, die wahrscheinlich ändern.) Sie können tun, um die erste Version der API Ebene Unix Datei-I / O. Dann können Sie versuchen, Variationen wie Sperren, Berkeley DB, oder Semaphore --- alle mit dem „minimalen Auswirkungen auf den laufenden Prozess“.

Sie werden wissen, Auswirkungen auf die Leistung nicht, bis Sie etwas versuchen. Das Sperren von Dateien auf reales Dateisystem ist ziemlich gut; Sperren von Dateien auf NFS ist ein Bär.

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